通过"new"创建一个字符串对象

3
考虑以下语句:

String s=new String("abc");

这个语句会创建两个字符串对象,分别是"abc"和's'所表示的那个对象吗?
如果它确实创建了两个对象,那么"abc"会被存储在字符串池中还是被丢弃?
编辑:
我问这个问题是参考字符串对象和字符串字面量之间的区别,在最后两个答案中,否认了创建两个对象的说法。

你尝试过它后发生了什么?(查找“Java string ==”问题,因为大多数[更好的]答案应该也会讨论new String。请注意,字符串字面值是字符串字面值。无论“使用”它的方式如何都没有关系。) - user166390
2个回答

5
避免这种行为,因为"abc"已经是一个String,通过创建一个new String,你正在创建一个不必要的Object

取而代之的是使用String s = "abc";

这样,String被JVM集成并添加到池中。

回答你的问题,你只是创建了一个引用"abc"Object s

因此,当你执行String t = new String("abc");,然后执行s==t,会得到false。因为它们有独立的实例abc


1
你的意思是 String s=new String("abc"); 只会创建一个对象's'而不是两个对象-'s'和"abc"吗? - a Learner
@aLearner 当你说“abc”,它已经是StringObject)了。现在明白了吗? - Kazekage Gaara
我觉得你没有理解我的问题。"abc" 总是代表一个字符串对象,并且将被存储在字符串池中。这没问题。但我想问的是,如果字符串池中还没有 "abc" 对象,那么上述语句是否也会在字符串池中存储一个新的 "abc" 对象,除了创建 's'。 - a Learner
@aLearner,这里有两个对象,而String s="abc";只创建了一个对象。在两种情况下,“abc”字面量都会被放入字符串池中。 - assylias
1
如果"abc"不存在,将创建一个新的String并放置在池中。如果已经存在,则s = new String("abc");只会创建一个对象s - Kazekage Gaara
显示剩余2条评论

0

String s = "HELLO";

这里,"s" 是一个类型为 String 的对象引用变量,它指向添加到字符串字面池中的字符串字面对象 "Hello"

String t = new String("Hello");

这里,t 是一个类型为 String 的对象引用变量它指向添加到字符串池中的字符串对象 "Hello"

Difference Between String Literal and String :

假设
String s = "Hello";
String t = new String("Hello");
现在如果进行以下更改:
s = null;
t = null;
那么与t相关联的Hello字符串对象将成为垃圾回收器的候选对象,但是与s关联的Hello字符串文字不会成为垃圾回收器的候选对象,因为总是从字符串文字池中有一个引用指向它。

这里的t是一个类型为String的对象引用变量,它指向了字符串对象"Hello",该对象被添加到了字符串池中。我认为如果使用new创建的字符串没有显式地通过intern()方法进行池化处理,那么t将不会指向池中的字符串对象。 - a Learner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接