2020-01-06
Object:是所有类的最顶层类,包括抽象类,枚举类,接口。Object的方法不能降低访问权限。
// Object() //构造
// getClass() //获取对象的类信息,与类相关:lang.Class
// clone() //对象克隆,需要实现cloneable接口。浅复制和深复制。
//比较相关
// hashCode() //获取hash编码
// equals(Object) //对象比较,默认实现为==方式
// toString() //打印字符串:类路径+类名+@+hashCode的值
//线程相关
// notify() //线程唤起
// notifyAll() //唤起全部线程
// wait(long) //等待
// wait(long, int) //等待一定时间
// wait() //等待
//垃圾回收相关,
// finalize() //java.lang.ref.*;
//对象头,markword,对象自身运行时的数据。hashCode,gc分带年龄,锁状态标志,线程持有的锁等。klass指向类数据。数组对象才有的数组长度。
//实例数据。
//32位系统,Object对象8字节,class指针大小是4字节,markword为4字节。
//64位系统,Object对象16字节,class指针大小是8,markword是8字节。
//对象可以开启指针压缩,但都是要8的倍数。
//new对象的流程:加载类,没有则加载Class。用Class创建对象,并且设置markword填充数据。生成的引用赋值给栈变量。
Optional://jdk1.8新增,减少代码中对象用==比较空的难看写法,下边是这个类的一些方法。
s.empty() //创建空的Optional对象
s.of(T t) //Optional,处理非空对象
s.ofNullable(T t)//Optional,处理对象,允许空
.isPreSent() //是否为空
return Optional.ofNullable(srcUser).map(user->user.name).orElse("Unknown");//例子,传入user对象,并且返回属性或是返回空字符串。
基本数据类型:boolean,byte,short,char,int,long,fload,double
依次大小:1,1,2,2,4,8,4,8字节(一个字节八位二进制)
对应包装类(包装成对象,来调用方法):Boolean,Byte,Short,Character,Integer,Long,Float,Double
整数默认为int,浮点数默认为double,long类型用L来追加在整数后,float使用F,小写也可以,但难以阅读,比如long a = 111l;
从左到右边,存储范围从小到大,从小到大的转化不会发生问题(char不能被比它小的数据转化,long可以转化float但会因为位数丢失而损失精度)
来获取当前包装类的二进制位数,例子:Integer.SIZE,但是Boolean没有SIZE属性
由大到小的转化,必须使用强转,例子:int a = 1; byte b = (byte)a;特殊注意+=,-=,*=,/=底层使用了强转。boolean都无法强转,大小转化。float f = 1.1;//就会报错,double为浮点数默认且double比float大。
数据比较==:基本数据类型数据和包装类比较,都会转化为基本数据类型来比较。不同类型的包装类使用==会报错。相等类型包装类比较,如果范围在byte的范围内-127到128范围内,==结果为true,其他为false。浮点数比较我只看到了false,除非同一个对象。
Long a = 100L;
Long b = 100L ;//a==b结果为true
自动装箱和拆箱:
Integer a = Integer.vaueOf(1);//正常的创建,可以简写为 Integer a = 1;jvm对编译有优化,这为自动装箱。
int b = Integer.valueOf(1)//自动拆箱,或是直接int b = a;
编译后的解析:
Integer a =1;//编译后为Integer a = Integer.valueOf(1);
Byte b = 1;//编译后为Byte b = Byte.valueOf( (byte)1);//其他包装类都类似这个
int a = 1;//编译后int a = Integer.valueOf(1).intValue();
byte b = 1;//编译后byte b = Byte.valueOf( (byte)1).byteValue();//其他的包装类都类似这个
注意:Long c = 1;//编译报错,还有Float和Double,都会如此
基本数据类型的优化:
for(int i = 0;i<100;i++){
if( (i%2) ==0){//里边可优化为 (i&2) ==0
//自己的代码
}
}
int x = 5;
int b = x*16;//可优化为x<<4,最右边插入4个0,如果是复杂表达式中,要用括号包起来,因为,判定比+-的顺序都小。
计算器运算最快的还是基于位的增加和移位。