Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java intern()方法对性能有影响吗?_Java_Heap Memory_String Pool - Fatal编程技术网

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”的新副本
请注意,调用intern时不会发生任何事情,因为自从声明字符串文本以来,字符串
“abc”
已经存在于字符串池中

此外,赋值不会创建任何新对象

方法:

返回字符串对象的规范表示形式。 最初为空的字符串池由类字符串私下维护。调用intern方法时,如果池中已经包含一个与equals(object)方法确定的string对象相等的字符串,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用。因此,对于任意两个字符串s和t,s.intern()==t.intern()为真当且仅当s.equals(t)为真时。 所有文字字符串和字符串值常量表达式都是插入的。字符串文本在Java的第3.10.5节中定义™ 语言规范

在这种情况下,调用intern没有任何用处,因此您的性能不会有任何提高

上面这行代码将创建多少个对象

  • 字符串文本在运行时由一个
    string
    对象表示。如果尚未创建该对象,则可以通过执行此语句(延迟)创建该对象。在任何一种情况下,表示文字的对象都将被扣留。(在此过程中创建的
    String
    对象的数量是一个实现细节,取决于Java版本。是的,真的。)

  • 新字符串(…)
    每次创建对象时都会创建一个对象

  • 由于原来的
    String
    o对象已被插入,因此
    intern()
    调用将返回该对象;i、 e.表示字符串文字的
    字符串
    :您开始使用的字符串

因此,总而言之,您的代码可能会导致创建最多三个对象,直接和幕后,但在语句结束时将无法访问由
new
创建的对象

的确,因为,

String a = new String("abc").intern();

如果得到相同的结果,
新的
/
实习生
序列完全是浪费时间


如果它将在堆内存和字符串池内存中创建对象,那么intern()方法如何提高性能

它不会直接提高性能:

  • 如果可以在数据结构中插入所有字符串,则有一个潜在的间接好处。然后可以使用
    =
    而不是
    equals(Object)
    来测试相等性

    但是,您正在权衡
    等于
    的成本与
    实习生
    的成本,因此在获得净性能胜利之前,您需要进行一些对象比较。此外,如果您忘记插入其中一个字符串,
    =
    可能会给您一个与
    相等的不同答案。(这可能是个bug!)

  • 在较旧的JVM中,如果您有许多长寿命的
    String
    对象,则可能会有间接的好处。使用
    intern
    进行重复数据消除将减少长期内存使用并降低长期GC成本

    但是,在最近的JVM中,GC将自动对在几个GC周期中存活的
    String
    对象执行重复数据消除。由于这只适用于寿命相对较长的对象,因此这是一种更有效的重复数据消除方法。而且这个过程对应用程序是透明的


简而言之,在大多数情况下,在应用程序代码中使用
intern()
方法既没有优点,也没有明显的缺点。别管它。

“我对intern()方法的有用性有些困惑”解决困惑的简单方法是不使用它。我没有生气:它很少有用。你给出的例子没有用,因为
String a=“abc”
已经被占用了。为什么您认为这会提高性能?占用字符串会减少内存使用,性能可能会稍微差一点。有关更多信息,请查看本文:。然而,我想说它几乎没有任何用处。@parichay07你不会这么做的。你举的例子是任何人都不应该做的。
String a = "abc";