【问题标题】:java - Do strings inside methods get loaded immediately at class load time? [duplicate]java - 方法内的字符串是否在类加载时立即加载? [复制]
【发布时间】:2013-12-13 06:49:57
【问题描述】:

我目前有一个基于给定整数返回字符串的巨型方法。它使用 switch 语句,包含 686 个案例,每个 case 返回一个 string constant。有 683 个长度从大约 10 到 50 个字符的唯一字符串,全部仅在该方法中使用。我想知道这些字符串何时加载。它们是否在类加载时加载?如果是这样,有没有一种方法可以仅在我第一次需要这些字符串时才加载它们,并在没有更多引用时被丢弃?

目前,我正在从包含字符串表的文件中加载这些字符串。它们将被放置在 WeakHashMap 中。有没有更好的方法来做这些?

我正在考虑的另一种选择是创建一个将每个字符串保存在静态字段中的类。这样,它只会在我第一次获取该字段的值时加载。但这会使我的包裹变大。

此外,dalvik-vm 是否使用相同的字符串常量加载例程。

【问题讨论】:

  • 2 字节/字符 * 50 字符/字符串 * 700 字符串 = 70 kB 数据。我不会担心的。
  • 您真的应该为此使用关联数组,而不是 switch 语句。我不想看到那个 switch 语句。然后,您可以将关联数组放在您想要的任何级别,并从中提取您需要的内容。
  • @Leifingson,也许您可​​以将“关联数组”解释为大多数 Java 程序员会认识的东西,例如java.util.Map
  • @PaulDraper 那不是重复的吗?

标签: java dalvik


【解决方案1】:

Sun 进行了一项优化,该优化令许多新的 Java 程序员感到困惑,称为字符串池。它允许字符串,这是最常用的对象之一,可以优化自身并节省空间。需要说明的重要一点是,字符串池仅适用于字符串文字,这意味着它们的值是分配的,而不是使用字符串构造函数构造的。

字符串池(有时也称为字符串规范化)是一个用单个共享字符串对象替换多个具有相同值但不同标识的字符串对象的过程。您可以通过保留自己的地图(根据您的要求可能使用软或弱引用)并将地图值用作规范化值来实现此目标。或者你可以使用 JDK 提供给你的 String.intern() 方法。

如果您的程序根目录中没有对它们的引用,则 JVM 字符串池中的所有字符串都有资格进行垃圾回收。这意味着如果您的实习字符串超出范围并且没有其他对它的引用 - 它将从 JVM 字符串池中被垃圾收集。

所以你不必担心它,因为 JVM 已经在内部做了。

【讨论】:

  • Sorry Jan. 输入错误
  • 也称为字符串实习en.wikipedia.org/wiki/String_interning
  • 我知道 java 正在使用字符串池。我不知道什么时候它将这样的字符串放入该池中,即在类初始化的意义上,它会被加载还是仅在需要时加载。
  • 在类初始化时加载。一旦它在字符串池中,那么它只是使用池中的引用而不是在字符串池中创建一个新的字符串。
猜你喜欢
  • 1970-01-01
  • 2014-08-23
  • 2013-08-15
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多