如何通过java中的一个程序实现自己的字符串常量池?
How to implement our own string constant pool through a program in java?
java中的字符串常量池是如何实现的?
我们如何才能使本地相同。 ?
字符串常量池在Java中是一个定义明确的术语,由JVM实现。您不能用您在 Java 程序中创建的东西替换它,您必须编写自己的 JVM。
如果你的意思是你想要在你的应用程序中使用某种字符串池来存储你的应用程序反复使用的字符串(比如在用户界面上显示文本的集中位置),ResourceBundle
是一个不错的选择,它本质上是 Map
.
的包装器
下面是对象池的非常简单的实现:
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.intern(),它本质上是一个字符串池,已经为我们实现了。
但是请注意,Java 中的对象池通常是错误的做法,无论它们是 String.intern 还是 ConcurrentHashMap 等。通过测量影响仔细检查您的用例。何时使用资源池的例子是当池中的对象创建成本高且数量有限时;例如网络和数据库连接。
大多数人忘记的隐性成本是 GC 的成本。 GC 成本与堆上有多少存活对象有关,而 JVM 不太适合存活一段时间然后死亡的对象。对于早逝或永不消亡的对象来说要好得多。
java中的字符串常量池是如何实现的? 我们如何才能使本地相同。 ?
字符串常量池在Java中是一个定义明确的术语,由JVM实现。您不能用您在 Java 程序中创建的东西替换它,您必须编写自己的 JVM。
如果你的意思是你想要在你的应用程序中使用某种字符串池来存储你的应用程序反复使用的字符串(比如在用户界面上显示文本的集中位置),ResourceBundle
是一个不错的选择,它本质上是 Map
.
下面是对象池的非常简单的实现:
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.intern(),它本质上是一个字符串池,已经为我们实现了。
但是请注意,Java 中的对象池通常是错误的做法,无论它们是 String.intern 还是 ConcurrentHashMap 等。通过测量影响仔细检查您的用例。何时使用资源池的例子是当池中的对象创建成本高且数量有限时;例如网络和数据库连接。
大多数人忘记的隐性成本是 GC 的成本。 GC 成本与堆上有多少存活对象有关,而 JVM 不太适合存活一段时间然后死亡的对象。对于早逝或永不消亡的对象来说要好得多。