Java Strings: “String s = new String(”silly“);”

2022-08-31 11:40:34

我是一个学习Java C++的人。我正在阅读有效的Java,有些东西让我感到困惑。它说永远不要写这样的代码:

String s = new String("silly");

因为它会创建不必要的对象。但相反,它应该这样写:String

String s = "No longer silly";

好吧,到目前为止...但是,给定此类:

public final class CaseInsensitiveString {
    private String s;
    public CaseInsensitiveString(String s) {
        if (s == null) {
            throw new NullPointerException();
        }
        this.s = s;
    }
    :
    :
}

CaseInsensitiveString cis = new CaseInsensitiveString("Polish");
String s = "polish";
  1. 为什么第一个语句是可以的?不应该是

    CaseInsensitiveString cis = "Polish";

  2. 我如何使行为像上面的陈述是可以的(有和没有扩展)?关于String,是什么让它能够像那样传递一个字面意思呢?根据我的理解,Java中没有“复制构造函数”的概念?CaseInsensitiveStringStringString


答案 1

String是该语言的特殊内置类。它适用于您应该避免说的类String

String s = new String("Polish");

因为文本已经是 类型 ,并且您正在创建一个额外的不必要的对象。对于任何其他类,说"Polish"String

CaseInsensitiveString cis = new CaseInsensitiveString("Polish");

是正确的(也是唯一的,在这种情况下)要做的事情。


答案 2

我相信使用文字形式(即“foo”而不是新的String(“foo”))的主要好处是所有字符串文字都被VM“暂存”。换句话说,它被添加到池中,以便创建相同字符串的任何其他代码将使用池化字符串,而不是创建新实例。

为了说明这一点,下面的代码将打印第一行 true,但第二行打印 false:

System.out.println("foo" == "foo");
System.out.println(new String("bar") == new String("bar"));