Java intern()方法对性能有影响吗?
我对Java intern()方法对性能有影响吗?,java,heap-memory,string-pool,Java,Heap Memory,String Pool,我对intern()方法的有用性有些困惑 这行代码可以消除我的困惑: String a = new String("abc").intern(); 上面这行代码将创建多少个对象?如果它将在堆内存和字符串池内存中创建对象,那么intern()方法如何提高性能?您将有两个字符串: “abc”-字符串文字。它还将“abc”添加到字符串池中(见下文) 新字符串(“abc”)-使用新运算符显式创建的“abc”的新副本 请注意,调用intern时不会发生任何事情,因为自从声明字符串文本以来,字符串“a
intern()
方法的有用性有些困惑
这行代码可以消除我的困惑:
String a = new String("abc").intern();
上面这行代码将创建多少个对象?如果它将在堆内存和字符串池内存中创建对象,那么
intern()
方法如何提高性能?您将有两个字符串:
-字符串文字。它还将“abc”添加到字符串池中(见下文)“abc”
-使用新运算符显式创建的“abc”的新副本新字符串(“abc”)
“abc”
已经存在于字符串池中
此外,赋值不会创建任何新对象
方法:
返回字符串对象的规范表示形式。
最初为空的字符串池由类字符串私下维护。调用intern方法时,如果池中已经包含一个与equals(object)方法确定的string对象相等的字符串,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用。因此,对于任意两个字符串s和t,s.intern()==t.intern()为真当且仅当s.equals(t)为真时。
所有文字字符串和字符串值常量表达式都是插入的。字符串文本在Java的第3.10.5节中定义™ 语言规范
在这种情况下,调用intern没有任何用处,因此您的性能不会有任何提高
上面这行代码将创建多少个对象
- 字符串文本在运行时由一个
对象表示。如果尚未创建该对象,则可以通过执行此语句(延迟)创建该对象。在任何一种情况下,表示文字的对象都将被扣留。(在此过程中创建的string
对象的数量是一个实现细节,取决于Java版本。是的,真的。)String
每次创建对象时都会创建一个对象新字符串(…)
- 由于原来的
o对象已被插入,因此String
调用将返回该对象;i、 e.表示字符串文字的intern()
:您开始使用的字符串字符串
new
创建的对象
的确,因为,
String a = new String("abc").intern();
及
如果得到相同的结果,新的
/实习生
序列完全是浪费时间
如果它将在堆内存和字符串池内存中创建对象,那么intern()方法如何提高性能 它不会直接提高性能:
- 如果可以在数据结构中插入所有字符串,则有一个潜在的间接好处。然后可以使用
而不是=
来测试相等性 但是,您正在权衡equals(Object)
的成本与等于
的成本,因此在获得净性能胜利之前,您需要进行一些对象比较。此外,如果您忘记插入其中一个字符串,实习生
可能会给您一个与=
相等的不同答案。(这可能是个bug!)
- 在较旧的JVM中,如果您有许多长寿命的
对象,则可能会有间接的好处。使用String
进行重复数据消除将减少长期内存使用并降低长期GC成本 但是,在最近的JVM中,GC将自动对在几个GC周期中存活的intern
对象执行重复数据消除。由于这只适用于寿命相对较长的对象,因此这是一种更有效的重复数据消除方法。而且这个过程对应用程序是透明的String
简而言之,在大多数情况下,在应用程序代码中使用
intern()
方法既没有优点,也没有明显的缺点。别管它。“我对intern()方法的有用性有些困惑”解决困惑的简单方法是不使用它。我没有生气:它很少有用。你给出的例子没有用,因为String a=“abc”
已经被占用了。为什么您认为这会提高性能?占用字符串会减少内存使用,性能可能会稍微差一点。有关更多信息,请查看本文:。然而,我想说它几乎没有任何用处。@parichay07你不会这么做的。你举的例子是任何人都不应该做的。
String a = "abc";