java中字符串定义问题

public class StringDemo1 {
public static void main(String[] args){
String s="abc";
String s1=new String("abc");
//s在内存中有一个对象

//s1在内存中有两个对象

}
}

上面的代码中,s在内存中有一个对象,而s1在内存中有两个对象怎么回事,无法理解。
最新回答
≮陌路≯七

2024-11-08 03:07:49

好多地方喜欢搞这种面试题...
-----------------
你可以这么理解
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")所以有了两个
薅藤已蔓蔆

2024-11-08 02:23:29

这是两种形式来创建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,但实际上可能并没有被创建,只是找到了之前已经存在的一个对象。

吐舌奶包吴市长

2024-11-08 00:08:41

第一句:
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 也会在内存中开辟一个新的内容