猿问

什么是Java中的字符串池?

什么是Java中的字符串池?

我对Java中的StringPool感到困惑。在用Java阅读字符串章节时,我看到了这一点。请帮助我理解,从外行的角度来看,StringPool到底做了些什么。



呼啦一阵风
浏览 897回答 3
3回答

慕森卡

这个指纹true(即使我们不使用equals方法:比较字符串的正确方法)    String s = "a" + "bc";     String t = "ab" + "c";     System.out.println(s == t);当编译器优化字符串文本时,它会发现两者都是s和t具有相同的值,因此只需要一个String对象。很安全,因为String在Java中是不可变的。因此,两者s和t指向同一个对象并节省一些内存。名称“字符串池”源于这样一种想法,即所有已定义的字符串都存储在某个“池”中,然后再创建新的字符串。String对象编译器检查是否已经定义了此类字符串。

叮当猫咪

让我们从虚拟机规范的引用开始:加载包含字符串文本的类或接口可能会创建一个新的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")]所以在这种情况下,变量a和b保存对同对象。在这种情况下,我们(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[](因为您不知道是谁在使用该字符串)
随时随地看视频慕课网APP

相关分类

Java
我要回答