本文共 2003 字,大约阅读时间需要 6 分钟。
首先先引入数据类型与其包装类,Java是一个面向对象的语言,可是为了编程方便,依旧引入了数据类型。 - 原始类型:boolean,char,byte,short,int,long,float,double - 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double而new出来的地址,不管和谁相比较都为false,因为new会在堆内存中开辟一个新的地址,==比较的是对象的地址。
诸如String a="asd"创建了一个对象"asd"被储存在常量池。
又诸如
String a=new String("asd");创建了两个对象
String b=new String("asd");此时只创建了一个对象,因为asd在内存中已经存在了。简单说,常量池里创建的对象只会创建一次,堆内存里开辟的是地址,所以堆内存对象虽然是,但是他们指向可能相同。举个例子,比如Integer默认值为null而int默认值为0。
原因就很简单了,Integer是一个Java对象,所以默认值为null,而int是数据类型,它的默认值为0。 引出关于数据类型的默认值 byte 0 short 0 int 0 long 0L float 0.0f double 0.0d char '\u0000' boolean false拆箱就是 自动将包装器类型转换为基本数据类型。
比如在Integer和int的比较上,
Integer a=128;
Integer b=new Integer("128");
int c=128;
a==c;trueb==c;true
这是因为拿Integer和int进行比较时,Integer会自动拆箱成int, 所以在与int的任何比较上,比较的只是数据类型,也就是比较大小。 在上述Integer a=128; 这里用到了装箱,128是数据类型被自动装箱成Integer类型。 其中的过程是 Integer a=Integer.valueOf(128); 同理 Integer a=128; int b=a; 其中的过程是 int b = a.intValue(); 而这些过程java会自动帮你处理,就是自动装箱和拆箱了。 我上述拿128举例是想说明一个问题 Integer a=128; Integer d=128; a==d;false; Integer a=127; Integer d=127; a==d;true; 这个问题换一方面看就很简单了,如 String a="asd"; String b="asd"; a==b;为true;这是因为第二次引用asd是会从已存在的常量池里取出。 而Integer 也是这样,可是他的范围是【-128,127】才会存在缓存,所以当Integer超过127就不存在缓存。 再通俗的说,int a=100;Integer b=100; a持有的100是整数的值。而b的100,是指向了常量池中的100。 Integer会在常量池里开辟一个100的对象,而堆数据类型int不会,a=100存在了栈内存。 另:new出来的任何,都会在堆内存里开辟新空间,所以==都为false; 如有错误,感谢指出,写这篇博客之前其实我也不明确其中区别, 单纯的想搞明白这个问题去查资料,然后开了一个测试类测试,越写越明白。转载地址:http://xriob.baihongyu.com/