字符串是Java中的对象,那么我们为什么不使用“new”来创建它们呢?

2022-08-31 09:00:47

我们通常使用关键字创建对象,例如:new

Object obj = new Object();

字符串是对象,但我们不用来创建它们:new

String str = "Hello World";

这是为什么呢?我可以用 ?new


答案 1

除了已经说过的内容之外,Java中的字符串文本[即,字符串像但不像]被禁留 - 这意味着每次你提到“abcd”时,你都会得到对单个实例的引用,而不是每次都有一个新的实例。因此,您将拥有:"abcd"new String("abcd")String

String a = "abcd";
String b = "abcd";

a == b; //True

但如果你有

String a = new String("abcd");
String b = new String("abcd");

那么有可能有

a == b; // False

(如果有人需要提醒,请始终用于比较字符串; 物理平等测试)。.equals()==

实习字符串文本很好,因为它们经常被多次使用。例如,考虑(人为的)代码:

for (int i = 0; i < 10; i++) {
  System.out.println("Next iteration");
}

如果我们没有字符串的实习,“下一次迭代”将需要实例化10次,而现在它只会被实例化一次。


答案 2

字符串是 Java 中的“特殊”对象。Java设计人员明智地决定,字符串的使用频率如此之高,以至于他们需要自己的语法以及缓存策略。当您通过说以下内容声明字符串时:

String myString = "something";

myString 是对字符串对象的引用,值为“某物”。如果您稍后声明:

String myOtherString = "something";

Java足够聪明,可以确定myString和myOtherString是相同的,并将它们作为同一对象存储在全局字符串表中。它依赖于这样一个事实,即您无法修改字符串来执行此操作。这降低了所需的内存量,并且可以更快地进行比较。

相反,如果你写

String myOtherString = new String("something");

Java将为您创建一个全新的对象,与myString对象不同。