java介绍
三种技术架构
- J2EE(JAVAEE)Java5.0版本后改名的JAVAEE
- J2SE(JAVASE)
- J2ME(JAVAME)
特点
因为有了JVM(JAVA虚拟机)
,同一个java程序,跨平台 win
(微软公司,c++写的)、linux
、mac
编译:javac -encoding UTF-8 .\demo.java
报错加上 -encoding UTF-8
运行:java Demo
环境搭建
JRE
(java运行环境,虚拟机、核心类库等)JDK
(java开发工具包,包括了JRE
,编译工具,打包工具)- 环境变量
简单来讲:使用JDK开发完成的java程序,交给JRE去运行
hello world
进制
1byte(字节B) = 8个二进制位 (bit位b)
计算机存储器最小单位是字节(
Byte
),缩写为大写的B,1个字节等于8位(bit),位缩写为小写的b。在存储一个字符时,一个字符至少釆用8位存储,如大写的A:编码为01000001,8位即一个字节,故可说成一个字符用一个字节存储,所以存储器小单位是字节(Byte)
。容量的最小单位是位(bit)
- 10进制:752 = 7*10(2) + 5 *10(1) + 2 * 10(0)
- 2进制: 1011 = 1*2(0) + 1 * 2(1) + 0 * 2(2) + 1 * 2(3) 2进制, 1011 代表 1 + 2 + 0 + 8 = 11
- 8进制
1010-1110 三个为一个 最大为7 满8进1,分析:
010-101-110
2 5 6 八进制表示 0256 - 16进制
1010-1110 四个为一个 最大为15 满16进1,分析:
10 14 十六进制表示 0xAE
结论:
八进制数,其实就是二进制位 3个二进制位一个八进制位 111为7
十六进制,其实就是二进制中的四个二进制位为一个十六进制 1111为15
为何没有32进制 因为英文字母最多26个,多了 表示太多了
10进制转二进制,除以2,从下向上,看余数。
- 负数二进制 最高位为1
变量
基本类型:byte,short,int,long, float,double,char,boolean
引用类型:calss,interface,[]
计算
- 默认int 两个int变量相加 默认会转换 最大值2的32次方减1
- 两个byte类型变量相加可能会损失精度 -128~127之间
- 赋值动作会默认强制转换
class Operate {
public static void main(String[] args){
short x = 3;
//x += 4; //7 先计算 底层会默认计算,相当于 x = (short)(x + 4); // 强制转换
x = x + 4; // x是不确定变量 报错
System.out.println(x);
}
}
https://github.com/Weibozzz/java-study/commit/77a811b6f8863e666dac005bd1dd7f5715984013
逻辑运算符
逻辑运算
- &:且(两边都运算)
- &&: (左边为假,右边不运算),结果都一样
- |:或
- ||:(左边为真,右边不运算),结果都一样
- ^: 异或(符号两边结果一样为false)
- !:非
位运算
指的是二进制
左移
3 << 2 =12 相当于 3 * 2(2) = 12;
https://github.com/Weibozzz/java-study/commit/63eb2f805178de73029069a96d4b30a9271c70ed
数组应用
进制转换
https://github.com/Weibozzz/java-study/commit/a49a1b2af5ccc992265f2db4ab5673b8041bd826
10进制转换16进制:60=》3C
class ArrayDemo{
/**
获取一个整数的16进制的表现形式
*/
public static void main(String[] args){
toBinary(-6);
System.out.println(Integer.toBinaryString(-6));
}
// 十进制-->十六进制
public static void toHex(int num){
trans(num, 15 ,4);
}
// 十进制-->二进制
public static void toBinary(int num){
trans(num, 1, 1);
}
// 十进制-->八进制
public static void toOctal(int num){
trans(num, 7, 3);
}
public static void trans(int num, int base, int offset){
if(num==0){
System.out.println("0");
return;
}
char[] chs = {'0','1','2','3',
'4','5','6','7',
'8','9','A','B',
'C','D','E','F'};
char[] arr =new char[32];
int pos = arr.length;
while(num!=0){
int temp = num& base;
arr[--pos] = chs[temp];
num = num >>> offset;
}
System.out.println("pos="+pos);
for (int i =pos;i<arr.length;i++){
System.out.print(arr[i]);
}
System.out.println();
}
}
面向对象
demo1
面向对象
demo2
引用数据类型参数引用 会改变原来
demo3
封装 private
demo4
构造函数
demo5
static 外部也可以访问 不在栈和堆存储,在方法区存储,也叫对象方法共享数据. 静态方法只能访问静态成员
demo6
主函数
/**
* public:因为权限必须是最大的
* static:不需要对象的,直接用珠海市所属类名调用即可
* main:函数名,还是关键字,只是一个jvm识别的固定的名字
* string[] args:这是主函数的参数列表,而且元素都是字符串类型 运行的时候可以
* 带上参数 如:java MainDemo haha lili
*/
class MainDemo {
public static void main(String[] args){ // new String[0]
System.out.println(args); // [Ljava.lang.String;@15db9742
// System.out.println(args[0]);
// System.out.println(args);
}
}
https://github.com/Weibozzz/java-study/commit/35b46c4a0afced3f580f13a84dcef3b28a8bfa83
demo7
- 静态代码块。作用:用于给类初始化
- 构造代码块。可以给所有对象初始化
demo8
静态基本使用 工具类的提出,privite私有的使用,文档注释javadoc
demo9
设计模式 单例
class Single{// 类一加载,对象就已经存在了
private static Single s = new Single();
private Single(){};
public static Single getInstance(){
return s;
}
}
class Single2{// 类加载进来,没有对象,只有调用了getInstance方法,才会创建对象
// 延迟加载形式 懒汉式
private static Single s = null;
private Single(){};
public static Single getInstance(){
if(s == null){
return s = new Single2();
}
return s;
}
}
class SingleDemo{
public static void main(String[] args){
Single ss = Single.getInstance();
}
}
https://github.com/Weibozzz/java-study/commit/214bd323a6a99e71176d9b3e0e0371ee341d745b
demo10
基本继承 单继承 多继承
demo11
- this代表本类
- super代表父类
- 相同变量或者方法,子类权限必须大于等于父类权限,才会覆盖父类方法
- 静态子涵覆盖静态,或被静态覆盖
- 继承 // super() // 默认调用父类 super()
demo12
final关键字
- 继承弊端:因为会覆盖,打破封装性
- final 是一个修饰符,可以修饰类,方法,变量
- final 修饰的方法不可以被覆盖
- final 修饰的变量是一个常量,只能赋值一次
demo13
抽象类 例子
demo14
接口 interface
- 接口的成员都是公共的权限。
- 修饰符可以省略,interface权限会自动加上去,但是不建议,阅读性不强
demo15
实现 implements
demo16
多实现
- java多继承记性了改良,变为了多实现
demo17
实现继承的例子
demo18
多态:类型转换 转型
demo19
https://github.com/Weibozzz/java-study/commit/3ddb215d420f5ad8735d44fa399c59ea34aa19cf
https://github.com/Weibozzz/java-study/commit/6207c442d3ab1366fa04f9d905bb000b95f38b6d
多态:类型转换 转型
- 1.成员变量
- 编译时:参考引用类型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
- 运行时:参考引用类型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
- 简单说:编译和运行都参考等号的左边
- 2.成员函数
- 编译时:参考引用类型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
- 运行时:参考的是对象所属的类中是否有调用的函数
- 简单说:编译看等号的左边,运行看右边
- 3.静态函数
- 编译时:参考引用类型变量所属的类中的是否有调用的静态方法
- 运行时:参考引用类型变量所属的类中的是否有调用的静态方法
- 简单说:编译和运行都参考等号的右边
- 其实对于静态方法,是不需要对象的,直接调用类名即可。
demo20
内部类:生成Outer$Inner.class
demo21
https://github.com/Weibozzz/java-study/commit/38a3d62396255718fb96772e499e5294e754718a
demo22
https://github.com/Weibozzz/java-study/commit/323717f0cbac20ccbd56d4e572a791836b540680
- 面向对象(Object类-equals方法覆盖)
- 03-面向对象(Object类-hashCode方法)
- 04-面向对象(Object类-getClass方法)
- 05-面向对象(Object类-toString方法)
内部类:
- 直接访问外部类中的内部类中的成员
- 如果内部类是静态的 相当于外部的
error
demo1
异常处理
java文档
https://github.com/Weibozzz/java-study/commit/6e1467ff6cf413ef472cf45cea68c129152d6486
https://github.com/Weibozzz/java-study/commit/4c95ce4bd82523a3473085411243c8ad88f989e5
demo2
自定义异常,要么继承Exception,要么继承RuntimeException
demo3
异常处理的捕捉形式 try{}catch(){}finally{}
demo4
异常例子
https://github.com/Weibozzz/java-study/commit/121ebe1a8d1678a4bd399704f6b043ed6bfe0364
异常例子改进
ticket
多线程买票实例
demo1
单线程实例
https://github.com/Weibozzz/java-study/commit/2b1f118d3b7905384ccb07bb6913ab9a8d47f19a
demo2
单线程实例=》多线程
https://github.com/Weibozzz/java-study/commit/a0c027920c8fb9f7bf19f274795d0e9294533575
demo3
https://github.com/Weibozzz/java-study/commit/6a067a1614bb5ed28107f8755fede37fc06b77a1
创建多线程的第二中方式:实现Runnable接口
- 1.定义类实现Runnable接口
- 2.覆盖接口的run方法
- 3.通过THread类创建线程对象,并传递参数
- 4.通过start开启线程
demo4
https://github.com/Weibozzz/java-study/commit/795e427840c4ec2d53ef0c73a046e06272c18905
多线程安全问题demo=>过同步代码块解决这个问题 synchronized
多线程安全问题demo
- 产生原因一个线程没结束,另外一个进行了运算
-解决办法使用同步- 弊端:相对降低了效率,因为同步外的线程都会判断同步锁
- 前提:必须右多个线程并使用同一个锁
demo5
线程安全例子示例
- 同步函数的锁是this
- 同步代码块的锁是任意的对象
包 package
demo1
包的基础使用
thread 多线程通信
多线程详细看 ticket 卖票示例
demo1
多线程通信示例
demo2 多线程示例生产者消费者
多线程示例生产者消费者
- 多生产者,多消费者的问题
- if判断标记,只有一次,会导致不该运行的线程运行,出现了错误的情况
- while判断标记,解决了线程执行权后,是否要运行
- notify:只能唤醒一个线程,如果只唤醒了本方就没有意义,而且while判断标记+notify会导致死锁。
- notifyAll:本线程一定会唤醒对方线程
dk1.5以后
- await();
- signal();
- signalAll();
线程停止方式
- 控制循环结束标记
- 可以使用interrupt()方法将线程从冻结强制恢复到运行状态
String
StringBuffer
特点
- 长度是可变的
- 可以存储不同类型的数据
- 最终要变成字符串进行处理
- 可以对字符串进行修改
StringBuilder
和 StringBuffer 是一样的,不过 StringBuffer 是同步的,更安全。
StringBuilder的StringBuilder不能安全使用多线程。 如果需要同步, 那么建议使用StringBuffer 。
java.long
- String()
- String(byte[] bytes)
- String(byte[] bytes, int offset, int length)
- String(char[] value)
demo1 按照字典排序
练习 按照字典排序
demo2 一个字符串在整数中出现的次数
练习
基本包装类型
- Byte
- Short
- Integer
- Long
- Float
- Double
- Character
- Boolean
之间的转化
基本类型=》字符串
- 基本类型+ """
- 用String类中的静态方法valueOf(基本类型数值)
字符串=》基本类型
- 使用 xxx parseXxx ("xxx类型的字符串);
- 使用intValue()将一个Integer对象转为基本类型
int parseInt("123");
long parseLong
boolean parseBoolean
//只有Character没有parse方法
进制转换
- toBinaryString(int i)
- toHexString(int i)
- toOctalString(int i)
- toString(int i, int radix)
- parseInt(String s, int radix) // 其他进制转为十进制
自动装箱
demo1 演示自动装箱
例子
demo1 字符串数组排序
- StringBuilder
- append
- toString
- parseInt
- split
map
集合特点
- 用于存储对象到容器
- 集合的长度是可变的
- 集合中不可以存储基本数据类型
collection的常见方法
添加
- boolean add(object obj)
- boolean addAll(Collection coll)
删除
- boolean remove(object obj)
- boolean removeAll(Collection coll)
- void clear();
判断
- boolean contains(object obj)
- boolean containsAll(Collection coll)
- boolean isEmpty()
获取
- int size() 获取元素个数
- Iterator iterator() 迭代器
其他
- boolean retainAll(Collection<?> c) 取交集
- Object[] toArray() 将集合转化为数组
Collection
- List 有序,存入和取出的顺序一致,元素都有索引,元素可以重复
- Set 无序,元素不能重复
HashSet
:内部数据结构是哈希表,是不同步的,方法和Collection一样,只有Iterator迭代器- linkedHashSet: 有序的
TreeSet
:可以对set集合中的元素进行排序,是不同步的
判断元素惟一的方式就是根据比较方法的返回值是否是0,是0就是相同元素,不存
让元素自身具备比较功能,元素就需要实现comparable
接口,覆盖compareTo
方法
如果不按照自然排序,可以使用TreeSet
集合第二种排序,让集合自身具备功能,
定义一个实现Comparator
接口,覆盖compare
方法。
将该类对象作为参数传递给TreeSet
集合的构造函数
demo1 Collection集合演示1
demo2 List 演示
- 添加
- void add(index,element)
- void add(index,collection)
- 删除
- Object remove(index)
- 修改
- Object set(index,element)
- 获取
- Object get(index)
- int indexOf(Object)
- lastIndex(Object)
List集合是可以完成对元素的增删改查
- Vector 内部是数组数据结构,是同步的,增删查询都很慢!
- ArrayList 内部是素组的数据结构,是不同步的,替代了Vector。查询的速度快
- LinkedList 内部是链表结构,是不同步的,增删很快,查询慢
demo3 演示Iterator 和 ListIterator<E>
- iterate遍历的同时不能add,用ListIterator<E>代替
demo4 演示Vector
- Vector jdk1.0 之后被Iterator替代
demo5 演示LinkedList
addFirst
addLast jdk1.6
offsetFirst
offsetLast
getFirst // 获取但不移除,如果为空,报出异常NoSuchElementException
getLast jdk1.6
peekFirst // 获取但不移除,如果为空,返回null
peekLast
removeFirst
isEmpty
demo6 演示ArrayList
提升的Object要转为Persion对象
demo7 演示TreeSet
字符串比较是按照字典比较的
复写
java.lang.Comparable
的compareTo
方法, 字典比较字符串demo8 演示TreeSet集合第二种排序,让集合自身具备功能
构造一个新的,空的树集,根据指定的比较器进行排序。
--
作者:刘伟波
链接:http://www.liuweibo.cn/p/247
来源:刘伟波博客
本文原创版权属于刘伟波 ,转载请注明出处,谢谢合作
发表评论: