相关疑难解决方法(0)

String Literal Pool是String对象或对象集合的引用的集合

看完SCJP Tip Line的作者Corey McGlone撰写关于javaranch网站的文章后,我感到很困惑.命名为Strings,Literally和SCJP Java 6程序员指南,由Kathy Sierra(javaranch的联合创始人)和Bert Bates撰写.

我将尝试引用Corey先生和Kathy Sierra女士引用的关于String Literal Pool的内容.

1.据Corey McGlone先生说:

  • String Literal Pool是指向String对象的引用的集合.

  • String s = "Hello"; (假设Heap上没有名为"Hello"的对象),将"Hello"在堆上创建一个String对象,并在String Literal Pool(Constant Table)中放置对该对象的引用

  • String a = new String("Bye");(假设Heap上没有名为"Bye" new的对象,操作符将强制JVM在堆上创建一个对象.

现在,"new"对于创建String及其引用的运算符的解释 在本文中有点令人困惑,所以我将文章本身的代码和解释放在下面.

public class ImmutableStrings
{
    public static void main(String[] args)
    {
        String one = "someString";
        String two = new String("someString");

        System.out.println(one.equals(two));
        System.out.println(one == two);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,由于关键字,我们实际上最终会遇到略微不同的行为."new." 在这种情况下,对两个String文字的引用仍然放在常量表(String Literal Pool)中,但是当你来到关键字时"new,"JVM必须在运行时创建一个新的String对象,而不是使用常量表中的那个.

这是解释它的图表..

在此输入图像描述

那么它是否意味着,String Literal Pool也有对这个Object的引用?

以下是Corey McGlone撰写文章的链接

http://www.javaranch.com/journal/200409/Journal200409.jsp#a1

2. …

java string memory-management

69
推荐指数
1
解决办法
2万
查看次数

字符串常量池

由于这些问题#1说明:问题1问题2我的理解是" 字符串常量 "被拘留时:

String s = "abc"; 
Run Code Online (Sandbox Code Playgroud)

在以下情况下,JVM将创建一个新的String对象,而不是使用String Pool中的现有对象:

String s = new String("abc");
Run Code Online (Sandbox Code Playgroud)

但是,在阅读以下两个类似的陈述后,我有一个疑问.

当编译器遇到String文本时,它会检查池以查看是否已存在相同的String.如果找到匹配项,则对新文本的引用将定向到现有String,并且不会创建新的String文本对象.

在这种情况下,由于关键字"new",我们实际上最终会遇到略微不同的行为.在这种情况下,对字符串文字的引用仍然放在常量表(String Literal Pool)中,但是,当你来到关键字"new"时,JVM必须在运行时创建一个新的String对象,而不是使用常量表中的那个.

因此,当我们使用"new"并基于上面的定义创建对象时,我们还在非池内存池内存中放置引用.当我们这样做时,JVM是否也应该返回相同的引用?:

String one = new String("test");
String two = "test";

System.out.println(one.equals(two)); // true
System.out.println(one == two);      // false
Run Code Online (Sandbox Code Playgroud)

因为在声明字符串文字时String three = "test";它会存在于池中吗?因此应该返回相同的参考和打印真实?或者之前的陈述是否意味着它们将被放入池内存中,但只是在使用new运算符时跳过?

java

24
推荐指数
2
解决办法
2万
查看次数

标签 统计

java ×2

memory-management ×1

string ×1