关于String str="abc"与String str= new String("abc")区别

时间:2023-02-16 11:38:21

                       看到一个面试题说是String str1="abc"与String str2="abc"打印 str1==str2的结果,结果搞错了关于String str="abc"与String str= new String("abc")区别下面说明下这个问题,先看下代码

                     

                String str1 = "abc";
String str2 = "abc";

System.out.println(str1==str2);

System.out.println("====================分割线=====================================");

String str3 = new String("abc");
String str4 = new String("abc");

System.out.println(str3==str4);

                       测试结果如下

                      关于String str="abc"与String str= new String("abc")区别



                    解释下原因,第一个true是因为,String是final的,他存储在方法区的常量区,看下图

                       

                       关于String str="abc"与String str= new String("abc")区别

                  显然“abc”在常量区只有一份,所以在多的引用,都是指向内存中同一个地址,所以结果是true


               但如果是new 一个String对象呢,结果就会有所不同,此时在堆区会有一个对象被创建,如下图


               关于String str="abc"与String str= new String("abc")区别


                         从图中可以看出使用new 创建字符串时,会在堆区(heap)创建一个对象,它们都会引用常量区的一个字符串,所以,str3和str4不同。