String 类的设计考虑了享元设计模式,Flyweight 完全是关于可重用性,而不必在内存中创建太多对象。
字符串池由 String 类维护,当调用intern()
方法时,调用equals(..)
方法来确定String 是否已经存在于池中。如果是,则返回池中的字符串,而不是创建新对象。如果尚未在字符串池中,则将一个新的 String 对象添加到池中并返回对该对象的引用。对于任何两个给定的字符串 s1 和 s2,s1.intern( ) == s2.intern( )
仅当s1.equals(s2)
为真时。
下面显示的代码创建了两个 String 对象。因此 s1 == s2 返回 false。
String s1 = new String("A");
String s2 = new String("A");
s1.intern() == s2.intern()
返回true,但您必须记住确保您确实执行了 intern() 所有要比较的字符串,很容易忘记对所有字符串进行 intern() 操作,然后您可能会得到令人困惑的错误结果。另外,为什么不必要地创建更多对象?
而是使用如下所示的字符串文字来自动intern:
String s1 = "A";
String s2 = "A";
s1 和 s2 指向池中的同一个 String 对象,因此 s1 == s2 返回真。
因为对于字符串字面量 String s1 = “A”
,interning 是自动的,所以intern()方法将用于使用 new String(“A”)
构造的字符串。