首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >String.intern()的垃圾收集行为

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

Stack Overflow用户
提问于 2010-03-12 17:14:14
回答 1查看 7.4K关注 0票数 25

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

EN

回答 1

Stack Overflow用户

发布于 2010-03-12 21:45:17

String.intern()管理一个内部的、本机实现的池,该池具有一些与GC相关的特殊特性。这是旧代码,但如果重新实现它,它将使用java.util.WeakHashMap。弱引用是一种保留指向对象的指针而不会阻止它被收集的方法。这正是统一池的正确之处,比如内部字符串。

可以使用以下Java代码演示内部字符串是垃圾回收的:

代码语言:javascript
复制
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()比较字符串,你会活得更长更快乐。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2431540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档