对不起,如果这个问题已经被问到或者问题是否已经过去了。
String是一个Class。我们可以将值赋给String而无需创建新的实例对象。
喜欢String someString = "Value";
如果没有为String创建实例,这是如何工作的?是否可以创建用户定义的类来直接分配值而无需创建新对象?
答案 0 :(得分:3)
请参阅此interesting article:
字符串非常特殊
Java的设计者决定保留原始类型 面向对象的语言,而不是使一切都成为一个对象,所以 至于提高语言的表现。存储基元 在调用堆栈中,它需要更少的存储空间并且更便宜 操纵。另一方面,对象存储在程序中 堆,需要复杂的内存管理和更多的存储空间。 出于性能原因, Java的String被设计在介于a之间 原始和类。
此外:
Java提供了一种保持String文字的特殊机制 - 在一个所谓的字符串公共池..
当你这样做时:
String myStr1 = "Hello";
String myStr2 = "Hello";
然后
myStr1 == myStr2
true ,因为它们都存储在池中(阅读文章)。
但是如果你构造一个新的 String对象:
String myStr1 = new String("Hello");
String myStr2 = new String("Hello");
然后引用不相等。
我强烈建议您访问JLS。它说 Strings 以不同的方式处理,就像那样:)
答案 1 :(得分:1)
String str = "abc";
相当于:
char data[] = {'a', 'b', 'c'};
or
String str = new String(data);
对于用户定义的类,您必须创建一个对象。 有关更多信息,请参阅文档: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
答案 2 :(得分:0)
字符串是一种特殊情况。 String
文字是在the string pool
中创建的。在池中添加字符串后,如果将声明具有相同值的字符串,则引用将指向池中的相同字符串。
要回答您的问题,您无法创建用户定义的类而不能使用new
。仅当您在该类上仅使用静态方法和字段然后使用时
ClassName.StaticFieldOrMethod
。
答案 3 :(得分:0)
要了解有关String类如何工作的更多信息,请参阅
答案 4 :(得分:0)
让我们尝试通过一个简单的程序来了解这一点;
package program;
public class TempList {
public static void main(String[] args) throws Exception {
String stringWithoutNew = "Test";
String stringWithoutNew_temp = "Test";
String stringWithNew = new String("Test");
String stringWithNew_temp = new String("Test");
if (stringWithoutNew == stringWithoutNew_temp) {
System.out.println("This works !!");
}
if (stringWithoutNew == stringWithNew) {
System.out.println("This doesn't work !!");
}
if (stringWithNew == stringWithNew_temp) {
System.out.println("This doesn't work either !!");
}
}
}