String.intern测试

场景

从文件中读取 100w行一样的字符串,加到list,评测时间和内存和gc。

场景一,普通模式

    List<TestBean> datas = Lists.newArrayList();
    Runtime runtime = Runtime.getRuntime();
    long memoryBefore = runtime.freeMemory();
    Stopwatch stopwatch = Stopwatch.createStarted();
    try (FileReader fileReader = new FileReader("data.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);) {
        String line = null;
        while ((line = bufferedReader.readLine())!=null) {
            TestBean testBean = new TestBean();
            testBean.name = line;
            datas.add(testBean);
        }
    }
    System.out.println("t:"+stopwatch.stop().elapsed(TimeUnit.MILLISECONDS));
    System.out.println("m:"+(memoryBefore - runtime.freeMemory()));
    System.out.println(datas.size());

场景二,String.intern

testBean.name = line.intern();

场景三,Guava的Interner

//声明一静态变量
static Interner<Object> objectInterner = Interners.newWeakInterner();
//修改
testBean.name = (String) objectInterner.intern(line);

测试结果

场景参数时间内存gc
场景一-Xmx128m224653462962次minor gc
-Xmx32m oom
场景二-Xmx128m334291050002次minor gc
-Xmx32m15631971420812次minor gc
场景三-Xmx128m222295111122次minior gc
-Xmx32m17512479417612次minor gc

结论

  1. 在内存足够的情况下,可以是用guava Interner,或者String.intern,或者不用,三者区别不大
  2. 在内存有限的情况下,可以考虑 guava Interner,或者String.intern
  3. String.intern只能用在String对象,而guava Interner可以任何非空的object
  4. guava Interner的对象可以是弱引用或是强引用放在内存中,而String.intern存放在常量表中(7以后也放在堆中)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值