一、基本的数据类型
- byte
- int 4
- short 2
- long 8
- float 4
- double 8
- char 2
- boolean
booleans是没有初始化,JVM编译的时候将其转化成int,JVM支持boolean,但是通过读写byte数组实现的
二、包装类型
Integer x=2; //此处装箱操作,Integer.valueOf int y=x; //此处拆箱操作,intvalue
- 封装类和封装类==比较相等的时候比较的是:是否引用同一个对象,即缓存池里查找。
- 基本类型和基本类型比较的时候,比较的是:值。
- 封装类和基本类型比较的时候:将封装类先进行拆箱,再比较。
- equals是等价比较,对于基本类型不可使用,因此会先将其包装成封装类再比较。
- equals比较的是引用对象的值是否相等。
- 对于封装类+封装类这一类的操作,会将其拆箱后再进行运算。
三、==和equals的比较
public static void main(String[] args){ Integer a=1; Integer b=2; Integer c=3; Integer d=3; Integer e=300; Integer f=300; Long g=3L; Long h=2L; System.out.println(c==d);//t System.out.println(e==f);//f System.out.println(c==(a+b));//t System.out.println(c.equals(a+b));//t System.out.println(g==(a+b));//t System.out.println(g==(a+h));//t System.out.println(g.equals(c));//f System.out.println(g.equals(a+h));//t }
- 比较的是引用对象,由于3在缓存池中所以T
- 比较的是引用对象,因为Integer的缓存池大小-128—127,所以F
- 右边拆箱,所以左边也拆箱,比较值。T
- 右边先拆箱相加,再装箱,比较值。T
- 右边拆箱,左边拆箱,比值。
- 同上,比值T
- 两个封装类型不同,所以比值也是F
- 右边拆箱相加变long,再装箱和左边封装类型相同所以T
四、缓存池
new Integer(123)
是创建一个新对象,创建在堆中。
Integer.valueOf(123)
装箱,会先到缓存池中寻找,如果缓存池没有,就new一个新对象放进去,池子里只有一份相同字面量。
缓存池可以结合字符串常量池一起理解。