You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何String.intern()采用HashTable而非ConcurrentHashMap?性能测试验证

关于String.intern()与ConcurrentHashMap性能对比的疑惑

最近我在研究Java里的String.intern()方法,发现它存在不小的性能损耗。为了搞清楚具体的性能差异,我做了一组微基准测试,对比它和ConcurrentHashMap.putIfAbsent(s,s)的表现。

测试环境

  • Java版本:1.8.0_212
  • 操作系统:Ubuntu 18.04.2 LTS

测试代码

@Param({"1", "100", "10000", "1000000"})
private int size;
private StringIntern stringIntern;
private ConcurrentHashMapIntern concurrentHashMapIntern;

@Setup
public void setup(){
 stringIntern = new StringIntern();
 concurrentHashMapIntern = new ConcurrentHashMapIntern();
}

public static class StringIntern{
 public String intern(String s){
 return s.intern();
 }
}

public static class ConcurrentHashMapIntern{
 private final Map<String, String> map;
 public ConcurrentHashMapIntern(){
 map= new ConcurrentHashMap<>();
 }
 public String intern(String s){
 String existString = map.putIfAbsent(s, s);
 return (existString == null) ? s : existString;
 }
}

@Benchmark
public void intern(Blackhole blackhole){
 for(int count =0; count<size; count ++){
 blackhole.consume(stringIntern.intern("Example "+count));
 }
}

@Benchmark
public void concurrentHashMapIntern(Blackhole blackhole){
 for(int count =0; count<size; count++){
 blackhole.consume(concurrentHashMapIntern.intern("Example " +count));
 }
}

测试结果

测试结果和预期一致,ConcurrentHashMap的实现在字符串查询场景下比String.intern()快得多,尤其是当数据量增大时,性能差距会被进一步放大:

Benchmark(size)ModeCntScoreErrorUnits
MyBenchmark.concurrentHashMapIntern1avgt50.056± 0.007us/op
MyBenchmark.concurrentHashMapIntern100avgt56.094± 2.359us/op
MyBenchmark.concurrentHashMapIntern10000avgt5787.802± 264.179us/op
MyBenchmark.concurrentHashMapIntern1000000avgt5136504.010± 17872.866us/op
MyBenchmark.intern1avgt50.129± 0.007us/op
MyBenchmark.intern100avgt513.700± 2.404us/op
MyBenchmark.intern10000avgt51618.514± 460.563us/op
MyBenchmark.intern1000000avgt51027915.854± 638910.023us/op

我的困惑

查资料后了解到,String.intern()是基于原生Hashtable实现的。而根据Hashtable的Javadoc明确建议:

  • 如果不需要线程安全的实现,推荐用HashMap替代Hashtable;
  • 如果需要高并发场景下的线程安全实现,推荐用ConcurrentHashMap替代Hashtable。

这就让我十分不解了:既然官方都推荐在高并发场景下使用ConcurrentHashMap,为什么String.intern()至今仍然采用存在明显性能损耗的Hashtable实现,而不换成ConcurrentHashMap呢?

内容的提问来源于stack exchange,提问作者Turac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:24:40