java 占小狼_占小狼-Java进阶之路-浅谈Java String内幕(二)

String.intern()性能

常量池底层使用StringTable数据结构保存字符串引用,实现和HashMap类似,根据字符串的hashcode定位到对应的数组,遍历链表查找字符串,当字符串比较多时,会降低查询效率。

在JDK6中,由于常量池在PermGen中,受到内存大小的限制,不建议使用该方法。

在JDK7、8中,可以通过-XX:StringTableSize参数StringTable大小,下面通过几个测试用例看看intern方法的性能。

public class StringTest {

public static void main(String[] args) {

System.out.println(cost(1000000));

}

public static long cost(int num) {

long start = System.currentTimeMillis();

for (int i = 0; i < num; i++) {

String.valueOf(i).intern();

}

return System.currentTimeMillis() - start;

}

}

执行一百万次intern()方法,不同StringTableSize的耗时情况如下:

1、-XX:StringTableSize=1009, 平均耗时23000ms;

2、-XX:StringTableSize=10009, 平均耗时2200ms;

3、-XX:StringTableSize=100009, 平均耗时200ms;

4、默认情况下,平均耗时400ms;

在默认StringTableSize下,执行不同次intern()方法的耗时情况如下:

1、一万次,平均耗时5ms;

2、十万次,平均耗时25ms;

3、五十万次,平均耗时130ms;

4、一百万次,平均耗时400ms;

5、五百万次,平均耗时5000ms;

6、一千万次,平均耗时15000ms;

从这些测试数据可以看出,尽管在Java 7以上对intern()做了细致的优化,但其耗时仍然很显著,如果无限制的使用intern()方法,将导致系统性能下降,不过可以将有限值的字符串放入常量池,提高内存利用率,所以intern()方法是一把双刃剑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值