我目前有一个基于给定整数返回字符串的巨型方法。它使用包含686个案例的switch
语句,每个case
返回string constant
。共有683个独特的字符串,长度约为10到50个字符,仅在该方法中使用。我想知道这些字符串什么时候加载。他们是否在课堂加载时加载?如果是这样,有没有办法只在我第一次需要它们时加载这些字符串,并在没有更多引用的时候得到这些字符串?
目前,我正在从包含字符串表的文件中加载这些字符串。它们将被放置在WeakHashMap中。有没有更好的方法来做这些?
我想到的另一个选择是创建一个类,将每个字符串保存在静态字段中。这样,它只会在我第一次获取字段的值时加载。但这会让我的包裹变得庞大。
此外,dalvik-vm是否使用相同的字符串常量加载例程。
答案 0 :(得分:1)
Sun进行了一项优化,这对于许多名为String Pool的新Java程序员来说相当混乱。它允许使用Strings,它是最常用的对象之一,可以优化自身并节省空间。需要注意的一点是,String Pool仅适用于String文字,这意味着它们的值已分配,而不是使用String构造函数构造。
字符串池(有时也称为字符串规范化)是使用单个共享String对象替换具有相同值但不同标识的多个String对象的过程。您可以通过保留自己的Map(根据您的要求可能有软或弱引用)并使用map值作为规范化值来实现此目标。或者您可以使用JDK提供给您的String.intern()方法。
如果程序根目录中没有对它们的引用,则JVM字符串池中的所有字符串都有资格进行垃圾回收。这意味着如果您的实习字符串超出范围并且没有其他引用 - 它将从JVM字符串池中进行垃圾收集。
所以你不必为此烦恼,因为JVM已在内部完成它。