我们的
String对象可以通过两种基本方式进入池:
- 在源代码(例如)中使用文字
"bbb"
。 - 使用
intern
。
intern用于当您有一个
String不是池中的其他对象时。例如:
String bb = "bbb".substring(1); // substring creates a new objectSystem.out.println(bb == "bb"); // falseSystem.out.println(bb.intern() == "bb"); // true
或略有不同:
System.out.println(new String("bbb").intern() == "bbb"); // true
new String("bbb")确实创建了两个对象…
String fromLiteral = "bbb"; // in poolString fromNewString = new String(fromLiteral); // not in pool
…但更像是特例。它创建两个对象是因为
"bbb"引用了一个对象:
字符串文字是对类
String[…] 的实例的引用。而且,字符串文字总是引用class的相同实例
String。
并
new String(...)创建它的副本。
但是,有许多
String不使用文字即可创建对象的方式,例如:
- 所有
String
执行某种突变的方法。(substring
,split
,replace
等) String
从诸如aScanner
或a之类的输入中读取aReader
。- 至少一个 *** 作数不是编译时常量时的串联。
intern使您可以将它们添加到池中,或检索现有对象(如果有)。在大多数情况下,
String不需要s,但是可以将其用作优化,因为:
- 它可以让您与比较
==
。 - 由于重复项可以被垃圾回收,因此可以节省内存。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)