我在java.lang.String
看到了以下成员:
private final char value[];
我的问题是:
以下语句是否会将文字字符串的副本复制为上面提到的char[]
,而常量池中也存在另一个文字字符串副本。
String b1 = new String("abc");
如果是这样,那么常数池意味着什么呢?或者我们应该阻止使用new()来创建带文字的String?
@Update :
所以,根据答案,为什么String
类需要一个char value[]
变量,为什么不直接引用常量池中的单个副本?
如果用new String("...")
创建一个字符串,如果文字池中不存在,那么该文字是否会被置于常量池中?
根据我的想象,使用new String()
的唯一好处是,它可能比查询常量池更快;或者常量池有大小限制,当大小不够时它会删除旧的常量值吗?但我不确定这是否有效。
结论
所以,根据答案,new String()
只能由常量池维护者本身使用,我们程序员不会。
答案 0 :(得分:2)
后者是对的。使用String
从文字创建new()
实例绝对没有意义。
答案 1 :(得分:2)
你可以使用new,但使用" intern"指定它会有点棘手。 String的方法。 像这样:
String a = "ABC";
String b = new String("ABC").intern();
System.out.println(a == b);
输出为真,如果没有"实习生",那么它是来自常量池的副本。
String a = "ABC";
String b = new String("ABC");
System.out.println(a == b);
输出为false。 如果你查看这个String构造函数的原型,它会显示:
/**
* Initializes a newly created {@code String} object so that it represents
* the same sequence of characters as the argument; in other words, the
* newly created string is a copy of the argument string. Unless an
* explicit copy of {@code original} is needed, use of this constructor is
* unnecessary since Strings are immutable.
*
* @param original
* A {@code String}
*/
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
答案 2 :(得分:1)
java中的字符串就像任何其他编程语言一样 字符。这更像是一个处理该char的实用程序类 序列。此char序列保存在以下变量中:
/** The value is used for character storage. */
private final char value[];
使用new
关键字创建字符串
String b1 = new String("abc");
然后将对象创建到Heap Memory
中,当Java Compiler
遇到任何字符串文字时,它会在常量池中创建一个对象
现在b1指向堆内存中的对象,并且因为字符串文字也在那里,所以在常量池中也创建了一个没有人指向的对象
正如有效的Java第二版所述
String s = new String("neerajjain"); //DON'T DO THIS!
因为当只能通过1个对象完成工作时,您不必要地创建了2个对象。
但在某些情况下您可以使用new String("string")
找到它们here