java - String.intern() 的垃圾收集行为

标签 java performance string garbage-collection

如果我使用 String.intern() 来提高性能,因为我可以使用“==”来比较实习字符串,我会遇到垃圾收集问题吗? interned 字符串的垃圾回收机制与普通字符串有何不同?

最佳答案

String.intern() 管理一个内部的、本地实现的池,它具有一些特殊的 GC 相关功能。这是旧代码,但如果重新实现,它将使用 java.util.WeakHashMap。弱引用是一种保留指向对象的指针而不阻止它被收集的方法。对于一个统一的池(例如实习字符串)来说,这正是正确的选择。

可以用下面的 Java 代码来证明实习字符串是垃圾回收的:

public class InternedStringsAreCollected {

    public static void main(String[] args)
    {
        for (int i = 0; i < 30; i ++) {
            foo();  
            System.gc();
        }   
    }

    private static void foo()
    {
        char[] tc = new char[10];
        for (int i = 0; i < tc.length; i ++)
            tc[i] = (char)(i * 136757);
        String s = new String(tc).intern();
        System.out.println(System.identityHashCode(s));
    }
}

这段代码创建了 30 次相同的字符串,每次都将其实习。此外,它使用 System.identityHashCode() 来显示 Object.hashCode() 会在该实习字符串上返回什么哈希码。运行时,此代码会打印出不同的整数值,这意味着您不会每次都获得相同的实例。

无论如何,不​​鼓励使用 String.intern()。它是一个共享静态池,这意味着它很容易成为多核系统的瓶颈。使用String.equals()比较字符串,你会活得更久更快乐。

关于java - String.intern() 的垃圾收集行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2431540/

相关文章:

java - Ebean.Update 未将更新写入 DB2 数据库

java - 如何在 Eclipse 中导入 com.sun.javadoc.*?

java - 从 Set<SomeEnum> 转换为 Set<? extends SomeInterface> 当 SomeEnum 实现 SomeInterface 时

java - 特定文件处理需求的数据结构选择 - java

regex - 将字符串拆分为多个部分,包括带引号的字符串

php mysql-将 mysql_fetch_array() 结果放入字符串中并用逗号分隔字符串

java - 尽管值正确,JSpinner 显示的时间仍具有恒定的小时偏移量

c# - 在代码文件中添加更多命名空间会影响性能吗?

c# - 检查字符串是否包含列表(字符串)中的元素

string - 如何匹配表示为 OsStr 的文件扩展名?