如何通过java程序实现我们自己的字符串常量池?

如何通过java程序实现我们自己的字符串常量池?,java,string,constants,pool,Java,String,Constants,Pool,字符串常量池是如何在java中实现的? 我们怎样才能把同样的东西做成本地的 字符串常量池是Java中定义良好的术语,由JVM实现。您不能用在Java程序中创建的东西替换它,您必须编写自己的JVM。 如果您的意思是希望在应用程序中使用某种字符串池来存储应用程序反复使用的字符串(比如在用户界面上显示文本的集中位置),那么ResourceBundle是一种很好的方法,它本质上是映射的包装器字符串常量池在Java中是一个定义良好的术语,由JVM实现。您不能用在Java程序中创建的东西替换它,您必须编写

字符串常量池是如何在java中实现的?
我们怎样才能把同样的东西做成本地的

字符串常量池是Java中定义良好的术语,由JVM实现。您不能用在Java程序中创建的东西替换它,您必须编写自己的JVM。


如果您的意思是希望在应用程序中使用某种字符串池来存储应用程序反复使用的字符串(比如在用户界面上显示文本的集中位置),那么
ResourceBundle
是一种很好的方法,它本质上是
映射的包装器

字符串常量池在Java中是一个定义良好的术语,由JVM实现。您不能用在Java程序中创建的东西替换它,您必须编写自己的JVM。


如果您的意思是希望在应用程序中使用某种字符串池来存储应用程序反复使用的字符串(比如在用户界面上显示文本的集中位置),那么
ResourceBundle
是一种很好的方法,它本质上是
映射的包装器

下面是对象池的一个非常简单的实现:

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;
    }
}

下面是对象池的非常简单的实现:

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;
    }
}

还可以调用String.intern(),它本质上是一个已经为我们实现的字符串池

但是,请注意,Java中的对象池通常是错误的,无论它们是String.intern还是ConcurrentHashMap等。请通过测量影响来仔细检查您的用例。何时使用资源池的示例是,要创建池的对象既昂贵又数量有限;例如,网络和数据库连接


大多数人忘记的隐藏成本是GC的成本。GC成本与堆上有多少个活动对象有关,而JVM对于那些活动了一段时间然后又死亡的对象不是很好。对于年轻死亡或永不死亡的对象,这会更好。

还可以调用String.intern(),它本质上是一个已经为我们实现的字符串池

但是,请注意,Java中的对象池通常是错误的,无论它们是String.intern还是ConcurrentHashMap等。请通过测量影响来仔细检查您的用例。何时使用资源池的示例是,要创建池的对象既昂贵又数量有限;例如,网络和数据库连接


大多数人忘记的隐藏成本是GC的成本。GC成本与堆上有多少个活动对象有关,而JVM对于那些活动了一段时间然后又死亡的对象不是很好。对于年轻死亡或永不死亡的对象更好。

Java已经运行了一个字符串常量池。再加一个完全是浪费时间和空间。不清楚你在问什么。Java已经运行了一个字符串常量池。再加一个完全是浪费时间和空间。不清楚你在问什么。
String deduplicatedStr = stringPool.get(str);