好多地方喜欢搞这种面试题...
-----------------
你可以这么理解
String s="abc";//这样有一个了
String s1=new String(s);//本来有一个s 现在多出来一个s1
------------------------------------------------
//不过你继续这么写
String s2="abc";//还是只有两个String 因为前面s="abc"了;所以现在s=s2
//继续这么写
String s3=new String(s);//这样子又会多出来一个String s3和s1不一样 因为他是new(新)的
--------------------------------------
造成以上现象的原因是java看着String比较特殊 所以给他弄了一个常量池子来装用过的String
比如"abc","xxxx","哦耶"这些都会在第一次使用放入常量池中 第二次用到常量池中的字符串时就不会创建新的 直接从常量池里面拿 所以"a" 和"a"是一个东西,"abc"和"abc"也是一个东西
但是如果new String();那么他就会去创建String 放入堆(和常量池不是一个地方)中,所以new String("a")和new String("a")不一样 因为是新的嘛
------------------------------------------
这样new String("abc")就是先从常量池拿出abc或者创建abc放入常量池 然后在堆中创建new String("abc")所以有了两个
这是两种形式来创建String对象。
Java内存有【堆】和【栈】;
第一种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
第二种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
String str1 = "abc";
String str2 = "abc";
String str3 =new String ("abc");
String str4 =new String ("abc");
如上定义:str1和str2指向的是内存中同一个对象,str3和str4则是不同的对象。到此应该有些感觉了哈。
需要注意的是:String str="abc";这个定义感觉上是创建了String类的对象str,但实际上可能并没有被创建,只是找到了之前已经存在的一个对象。
第一句:
String s="abc";
1,"abc" 这就已经在内存中创建了一个内容为 abc 的字符串
2,String s="abc"; 创建一个s对象 并且指向 abc 这个字符串在内存中的地址
第二句:
String s1=new String("abc");
1,"abc" 这就已经在内存中创建了一个内容为 abc 的字符串
2,new String("abc"); new 的时候又创建了一个字符串并且传入 abc 这个字符串
简单来说 "" 包含的内容会存储在内存中了, new 也会在内存中开辟一个新的内容