0
点赞
收藏
分享

微信扫一扫

Java面试题:你能解释一下字符串是如何在 Java 中intern的吗?

骑在牛背上看书 2022-02-20 阅读 54
java

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”) 构造的字符串。

举报

相关推荐

0 条评论