【问题标题】:Some confusion about String pool关于字符串池的一些混淆
【发布时间】:2012-06-24 06:24:53
【问题描述】:

java 文档说:

最初为空的字符串池由 类字符串。

1) 这些字符串文字是string literalsreferences 的池吗?在网上,一些文章将其称为字符串字面量池,而其他文章将其称为引用池,所以我很困惑。

2) 是按类还是按 JVM 创建字符串池?

3)有什么参考资料可以找到字符串池的详细信息,它的实现等吗?

【问题讨论】:

  • 1) 对字符串字面量的引用池。 2) 池是基于每个 JVM 创建的。 3) 可以下载JDK源码查看pool是如何实现的。
  • 检查这个。可能有用stackoverflow.com/questions/8046045/…
  • @ Luiggi Mendoza:Pool of references to String literals. - 所以你的意思是池只包含引用,这些引用指向内存/堆中其他地方的字符串文字。字符串文字/对象本身不在池中?

标签: java


【解决方案1】:

1) 它是字符串字面量池还是对这些字符串字面量的引用?在网上,一些文章将其称为字符串字面量池,而其他文章将其称为引用池,所以我很困惑。

这是同样的事情。你不能有一个没有引用的 String 对象,反之亦然。

而且,正如 Peter Lawrey 所说:“在 Java 中,对象位于堆中。没有其他地方。你可以在其他东西中拥有唯一的东西,一个对象、一个数组、一个集合或堆栈,是对该对象的引用。”

2) 是按类还是按 JVM 创建字符串池?

每个 JVM 有一个字符串池……除非您使用的是一些奇特的 JVM,而他们决定以不同的方式实现它。 (规范并没有说必须为 JVM 提供一个字符串池,但这通常是最有效的方法。)

3)有什么参考资料可以找到字符串池的详细信息,它的实现等吗?

您可以下载 OpenJDK 6 或 7 的完整源代码。spring pool 是用本机代码实现的……所以您将阅读 C++。

【讨论】:

  • 虽然我们不能没有引用的对象,但我认为引用和对象本身是两个独立的实体。仅包含引用和包含整个对象本身不是一回事。
  • @aLearner 在 Java 中,对象位于堆内。无处。在其他东西(对象、数组、集合或堆栈)中唯一可以拥有的是对该对象的引用。
  • 除了堆栈之外的“其他东西”是什么?
  • @GennadyVanin--Novosibirsk - “其他东西” Peter 所指的是“对象、数组、集合或堆栈”.
【解决方案2】:
Is it a pool of string literals or references to these string literals?.

好吧,显然它是字符串字面量池。假设你写,

String str= "a learner";

它会通过equals()方法在字符串池中搜索字符串池中是否存在相同的字符串。如果在池中,则返回该字符串对象,否则将其存储在字符串池中并引用返回新添加的字符串。

所以,它是 String 对象池,每当你输入一个新的字符串字面量时,就会调用 equals() 方法。

Is string pool created per class basis or per JVM basis?

在JVM中只能有一个String类,因为String类是final的。因此,每个 JVM 不存在多个 String 类的问题。最终结果是每个 JVM 只有一个字符串池。

【讨论】:

  • +1 表示最后两个语句。但是第一点的答案仍然不清楚,你的答案与上面 Luiggi Mendoza 的评论相冲突。
  • @a Learner...好吧,即使您想遍历池中的每个字符串对象,您是否也需要一个引用...?只有当您需要访问一个特定对象。我在网上搜索了很多文章..没有谈论参考池..一个很好的类比是集合框架中的集合。他们真的不需要维护对他们包含的每个对象的引用。
  • 有像 http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html ,http://blog.javainterview.co.in/ 这样的文章谈论引用和许多其他谈论 string literals 的池。集合中的集合就是一个很好的例子。尽管我们更关心 String 对象本身,但我只是想清除池中实际包含的内容。
【解决方案3】:

它叫String interning

  1. 这是一个字符串字面量池
  2. 实习是在 JVM 基础上完成的
  3. String 的 JDK 源代码中包含所有代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多