基础
1字=2字节=2*8位
1word=2byte=2*8bit
bps bits per second/Bps Byte per second
基本数据类型
- boolean/1
- byte/8
- char/16
- short/16
- int/32
- float/32
- long/64
- double/64
Integer x = 2; // 装箱
int y = x; // 拆箱
装箱和拆箱:装箱给基础数据类型提供工具方法,装箱自动调用Integer.valueOf(int),拆箱调用Integer.intValue()。
public class Main {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);
System.out.println(i3==i4);
//输出true false。i1和i2指向同一个对象,i3和i4指向不同对象。原因是通过valueOf方法创
建Integer对象时,如果数值在[-128,127]之间,返回指向IntegerCache.cache中已经存在的
对象的引用,否则创建一个新的Integer对象。缓存池详细说明。
Double i1 = 100.0;
Double i2 = 100.0;
Double i3 = 200.0;
Double i4 = 200.0;
System.out.println(i1==i2);
System.out.println(i3==i4);
//false false。在某个范围内的整型数值是有限的,所以可以采用缓存方式,但Double、float
不是,所以和其他几个类的valueOf方法实现不一样。
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
System.out.println(c==d);
System.out.println(e==f);
System.out.println(c==(a+b));
System.out.println(c.equals(a+b));
System.out.println(g==(a+b));
System.out.println(g.equals(a+b));
System.out.println(g.equals(a+h));
//true false true true true false true
当“==”的两个操作数都是包装类型的引用,比较指向的是否是同一个对象(1和2),而如果其中一个操作数有算术运算,则比较的是数值(自动拆箱)(3和5)。对于
c.equals(a+b)会先触发自动拆箱过程,再触发自动装箱过程,也就是说a+b会先各自
调用intValue方法,得到了加法运算后的数值之后,便调用Integer.valueOf方法,
再进行equals比较,由于在缓存区的范围内所以是true(4)。对包装器类型,equals方法不进行类型转换,所以自动拆箱再装箱后6是Integer,7是Long(67)。
}
}
缓存池
new Integer()每次都会创建新对象,
Integer.valueOf()(自动装箱调用)可能使用IntegerCache.cache中的缓存对象。
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y); // false,==对基础数据类型比较值,对对象比较地址
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k); // true
Integer m = 123;
Integer n = 123;
System.out.println(m == n); // true
其他在缓冲池中的的基本数据类型范围
- boolean true false
- byte all
- short [-128,127]
- int [-128,127]
- char [\u0000,\u007F]即0-127
补充:\u是Unicode码字符,包含65536个字符,ASCII/ANSI只包含255个字符,是Unicode的子集。Unicode使用16进制编码,[\u0000,\uFFFF]。ASCII/ANSI [\u0000,\u00FF]
equals方法是Object类的方法,自己创建的类如果不重写equals方法,比较的是地址,因为底层是用==实现的。String、Integer等重写了equals方法。