进来先做个题:
Integer i1 = 10;
Integer i2 = 10;
Integer i3 = 128;
Integer i4 = 128;
Integer i5 = 118;
Integer i6 = new Integer(10);
Float f1 = 10.0f;
Float f2 = 10.0f;
System.out.println("i1 == i2 ? " + (i1 == i2));
System.out.println("i3 == i4 ? " + (i3 == i4));
System.out.println("i1 == i6 ? " + (i1 == i6));
System.out.println("10 == i6 ? " + (10 == i6));
System.out.println("129 == i3 ? " + (128 == i3));
System.out.println("i4 == i2 + i5 ? " + (i4 == i2 + i5));
System.out.println("128 == i2 + i5 ? " + (128 == i2 + i5));
System.out.println("f1 == f2 ? " + (f1 == f2));
System.out.println("10.0f == f2 ? " + (10.0f == f2));
答案是多少呢?暂且不谈,最后再公布。
基本类型与包装类的区别:
1.包装类型可以为null而基本类型不可以。
这点在pojo类里面很有用,因为在数据库里面定义的基本类型字段有可能值为null,
而这时如果将null赋值给基本类型属性就会报就会抛出 NullPointerException异常。
所以在与数据库交互的属性都应该定义为包装类型,除非明确的知道表中字段为非空字段。
2.包装类可以用于泛型,而基本类型不可以。
3.包装类型对象存储在堆中,基本类型存储在栈中
包装类型通过创建对象来存储数据,而对象是存储在jvm的堆中的,在栈中存储对象的引用,也就是对象所在堆中的地址。
基本类型在栈中存储的就是具体的数据,所以基本类型要比包装类型更加高效且节省空间。
4.自动装箱和自动拆箱
把基本类型转换为包装类型的的过程叫做装箱,把包装类型转换成基本类型的过程叫做拆箱。在Java SE5之后,java虚拟机会自动完成装拆箱的操作。
/*
自动装箱 当数值在-128 ~ 127 之间会调用静态的valueOf(int i)方法进行装箱,这是java虚拟机利用常量池技术默认创建了数值[-128,127] 的相应类型的缓存数据,返回的将是数值在常量池中的地址。当数值在这个范围之外才会去new一个对应类型的包装类
*/
Integer i = 10; // 自动装箱,虚拟机将会自动转换成:Integer i = Integer.valueOf(10);
Integer i = 128; // 自动装箱,虚拟机将会自动转换成:Integer i = new Integer(128);
int j = i; // 自动拆箱,虚拟机将会自动转换成:int j = i.intValue();
包装类和常量池
Java 基本类型的包装类中Byte,Short,Integer,Long,Character,Boolean都实现了常量池技术。
- Byte,Short,Integer,Long,包装类默认创建了数值[-128,127] 的相应类型的缓存数据。
- Character创建了数值在[0,127]范围的缓存数据。
- Boolean 直接返回True or False。
如果超出对应范围仍然会去创建新的对象。
最后
这时候你是否已经知道答案了呢?
Integer i1 = 10;
Integer i2 = 10;
Integer i3 = 128;
Integer i4 = 128;
Integer i5 = 118;
Integer i6 = new Integer(10);
Float f1 = 10.0f;
Float f2 = 10.0f;
System.out.println("i1 == i2 ? " + (i1 == i2)); // true
System.out.println("i3 == i4 ? " + (i3 == i4)); // false
System.out.println("i1 == i6 ? " + (i1 == i6)); // false
System.out.println("10 == i6 ? " + (10 == i6)); // true
System.out.println("129 == i3 ? " + (128 == i3)); // true
System.out.println("i4 == i2 + i5 ? " + (i4 == i2 + i5)); // true
System.out.println("128 == i2 + i5 ? " + (128 == i2 + i5)); // true
System.out.println("f1 == f2 ? " + (f1 == f2)); // false
System.out.println("10.0f == f2 ? " + (10.0f == f2)); // true