如果我使用String.intern()来提高性能,因为我可以使用"==“来比较中间字符串,我会遇到垃圾收集问题吗?被拦截字符串的垃圾回收机制与普通字符串有何不同?
发布于 2010-03-12 21:45:17
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()
比较字符串,你会活得更长更快乐。
https://stackoverflow.com/questions/2431540
复制相似问题