gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:40:13 31 4
gpt4 key购买 nike

如果我使用 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com