Java中,一般地,我们使用数据类型的时候,会直接使用int,double,byte,long等内置类型,但是在某些场合下,我们会遇到需要使用对象而非内置数据类型的情况。 Java语言为每一个内置数据类型提供了包装类,这些包装类包括Intger,Double等,此文我们拿Integer进行分析。
这种由编译器特别支持的包装称为装箱,所以当内置数据类型被当做对象使用的时候,编译器会把内置类型装箱为包装类。相似的,编译器也可以把一个对象拆箱为内置类型。
public class Test{
public static void main(String args[]){
Integer x = 5;
x = x + 10;
System.out.println(x);
}}
在以上代码中,当我们为Integer类型的x赋值5的时候,编译器对5进行了装箱操作,相当于调用了Integer.valueOf(5)。而在x=x+10时候,编译器又对x进行了拆箱操作,因为只有内置类型才支持+操作。特别要注意的一点是,对于-128到127之间的数值,装箱后都会放在内存里进行重用,也就是说Integer a = 5和Integer b = 5,系统都会去复用同一个对象,所以a和b实际上指向同一个对象的地址。但如果超过了这个规定的访问,系统会重新new一个Integer对象出来,如Integer a = 555和Integer b = 555,此时a和b两个对象便指向了不同对象的地址。
public class Number { public static void main(String[] args) { /** Integer i1 = 128; // 装箱,相当于 Integer.valueOf(128); int t = i1; //相当于 i1.intValue() 拆箱 System.out.println(t); */ Integer i1 = 200; Integer i2 = 200; if(i1==i2) { System.out.println("true"); } else { System.out.println("false"); } } }
== 和equal的区别也是老生常谈了,==是比较i1和i2指向的对象地址值,equals则是比较i1和i2指向的两个对象的值是否相等。