-
- public static void main(String[] args) {
- String str=new String("abc");
- String str2="abc";
- String str3="abc";
- System.out.println(str==str2);//false
- System.out.println(str2==str3);//true
-
- Integer i=12;
- Integer i1=12;
- System.out.println(i==i1);//true
-
- Integer i2=new Integer(12);
- Integer i3=new Integer(12);
- System.out.println(i2==i3);//false
- System.out.println(i==i2);//false
-
- //-128-127
- Integer i4=128;
- Integer i5=128;
- System.out.println(i4==i5);//false
-
- }
复制代码
我的理解是:
凡是new 都是在栈中创建一个指针指向堆。栈中存放的是指向堆的地址。堆中是开辟一块空间,存放内容。
至于常量池,是要看那些数据类型或者包装类实现了常量池的技术。java中Integer包装类和String是实现了包装类技术的。只有写成 String="",或者Integer=""的模式才代表了使用到了常量池。如代码所示,String类型的,str2在常量池中创建了"abc",str3在常量池中发现str2创建了“abc",就不再新创建了一个”abc",所以str2==str3的。同理Integer i=12,在常量池中创建了12,i1检测到了有i2就不再创建了。但是Integer包装类实现的常量池技术有个特点是,在-127~128的范围内才实现常量池技术,超过了这个范围,是相当于new Integer()的了。 |