如何在java中实现字符串常量池?我们怎么做同样的地方。div ?
对象池的简单实现:
public class ObjectPool<T> {
private ConcurrentMap<T, T> map = new ConcurrentHashMap<>();
public T get(T object) {
T old = map.putIfAbsent( object, object );
return old == null ? object : old;
}
}
现在使用
创建一个字符串池final ObjectPool<String> stringPool = new ObjectPool<>();
你可以用它去重复你的程序中的字符串:
String deduplicatedStr = stringPool.get(str);
String常量池是Java中定义良好的术语,由JVM实现。你不能用你在Java程序中创建的东西来代替它,你必须编写你自己的JVM。
如果您希望在应用程序中使用某种字符串池来存储应用程序反复使用的字符串(例如在用户界面上显示文本的集中位置),那么ResourceBundle
是一个很好的方法,它本质上是Map
的包装器。
还可以调用string .intern(),它本质上是一个已经为我们实现的字符串池。
但是,要注意Java中的对象池通常是错误的,无论是String.intern还是ConcurrentHashMap等。通过测量影响来再次检查您的用例。使用资源池的例子是,当被池化的对象创建成本高且数量有限时;例如网络和数据库连接。
大多数人忘记的隐藏成本是GC的成本。GC成本与堆上有多少活动对象有关,JVM不太擅长处理存在一段时间后就会死亡的对象。对于年轻死亡或永远不会死亡的对象来说,这要好得多。