为了账号安全,请及时绑定邮箱和手机立即绑定

什么是Java中的字符串池?

什么是Java中的字符串池?

呼啦一阵风 2019-07-01 10:13:34
什么是Java中的字符串池?我对Java中的StringPool感到困惑。在用Java阅读字符串章节时,我看到了这一点。请帮助我理解,从外行的角度来看,StringPool到底做了些什么。
查看完整描述

3 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

这个指纹true(即使我们不使用equals方法:比较字符串的正确方法)

    String s = "a" + "bc";
    String t = "ab" + "c";
    System.out.println(s == t);

当编译器优化字符串文本时,它会发现两者都是st具有相同的值,因此只需要一个String对象。很安全,因为String在Java中是不可变的。
因此,两者st指向同一个对象并节省一些内存。

名称“字符串池”源于这样一种想法,即所有已定义的字符串都存储在某个“池”中,然后再创建新的字符串。String对象编译器检查是否已经定义了此类字符串。


查看完整回答
反对 回复 2019-07-01
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

让我们从虚拟机规范的引用开始:

加载包含字符串文本的类或接口可能会创建一个新的String对象(§2.4.8)来表示该文本。如果已经创建了一个字符串对象来表示该文本的前一次出现,或者在一个字符串对象上调用了String.intern方法,则可能不会发生这种情况。

这可能不会发生-这是个暗示,有什么特别的地方String物品。通常,调用构造函数将创建类的新实例。String的情况并非如此,特别是当String对象是用文字“创建”的时候。这些字符串存储在全局存储(池)中-或者至少将引用保存在池中,并且每当需要一个已知String的新实例时,VM从池中返回对象的引用。在伪代码中,它可能是这样的:

1: a := "one" 
   --> if(pool[hash("one")] == null)  // true
           pool[hash("one") --> "one"]
       return pool[hash("one")]2: b := "one" 
  --> if(pool[hash("one")] == null)   // false, "one" already in pool
        pool[hash("one") --> "one"]
      return pool[hash("one")]

所以在这种情况下,变量ab保存对对象。在这种情况下,我们(a == b) && (a.equals(b)) == true.

如果我们使用构造函数,则情况并非如此:

1: a := "one"2: b := new String("one")

再一次,"one"在池上创建,但随后我们从同一个文本创建一个新实例,在本例中,它将导致(a == b) && (a.equals(b)) == false

所以为什么我们有字符串池吗?字符串,特别是字符串文字,在典型的Java代码中被广泛使用。它们是不可改变的。并且是不可变的,允许缓存字符串以节省内存和提高性能(减少创建的工作量,减少要收集的垃圾)。

作为程序员,我们不必太在意字符串池,只要我们记住:

  • (a == b) && (a.equals(b))

    可能是

    true

    false (

    使用

    equals

    比较字符串)
  • 不要使用反射来更改背景

    char[]

    (因为您不知道是谁在使用该字符串)


查看完整回答
反对 回复 2019-07-01
  • 3 回答
  • 0 关注
  • 896 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信