常量池中的对象和栈中的基本类型、堆中的对象在使用中的区别可以由“==”操作的结果可见一斑。
例1:
String类型
1)String a=“hello” ; String b ="hello";则a==b;
2)String a = new String("hello"); String b = new String("hello");则a!=b。
这是因为1)中a指向的是常量池中的“hello”即所谓字面值字符串,而实例化b的时候,由于常量池中存在“hello”所以将b也指向了对象“hello”。
而2)中是在堆空间中分别分配的内存对象“hello”并把指针给a或者b,自然a和b不一样。
例2:
部分基本类型的包装类
Byte,Short,Integer,Long,Character,Boolean。 其中Byte,Short,Integer,Long,Character只是在值小于等于127的时候才使用常量池。
因此:
1) Integer i1=127; Integer i2=127;则i1==i2
2)Integer i1=128;Integer i2=128;则i1!=i2
例3:
对象类型的==比较都是在比较该对象实例的地址,而不是值。基本数据类型的==比较,则是值。
int i = 1;int j =1; i和j都是在栈中分配,其地址并不一样,但是其值相同,所以i==j。
但是如果:
public static final int i = 1;
public static final int j= 1;
则是在常量池中分配的1这个常量,而i和j这些引用都指向它。因此i==j。
综上所述,分配在栈中的基本数据类型在==比较时是比较的值;分配在常量池中的基本数据类型和对象类型在==比较的时候是比较的地址;分配在堆中的对象==比较的时候,是比较的地址。分配在常量池中的都是常量。
因此,一般不要使用对象实例的==操作符来进行值比较,而应该使用equals。
原文:http://blog.csdn.net/hello_world_it/article/details/18996209