Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串文字池_Java_String_Literals_Pool - Fatal编程技术网

Java字符串文字池

Java字符串文字池,java,string,literals,pool,Java,String,Literals,Pool,假设我们有以下代码 String x = new String("xyz"); String y = "abc"; x = x + y; 我的一个朋友说总共创建了4个对象,我说只创建了3个。有人能解释一下背景中发生了什么吗?我读过关于字符串文字池的文章,但我可以找到一个答案 我对创建3对象的解释如下:一个在编译时(“abc”)在字符串文本池中,两个在运行时在堆上(“abc”和x+y)实际上。。当两个字符串都有相同的值时,字符串池工作 例如,如果我们有字符串s1=“abc”和s2=“abc”,那

假设我们有以下代码

String x = new String("xyz");
String y = "abc";
x = x + y;
我的一个朋友说总共创建了4个对象,我说只创建了3个。有人能解释一下背景中发生了什么吗?我读过关于字符串文字池的文章,但我可以找到一个答案


我对创建3对象的解释如下:一个在编译时(“abc”)在字符串文本池中,两个在运行时在堆上(“abc”和x+y)

实际上。。当两个字符串都有相同的值时,字符串池工作

例如,如果我们有字符串s1=“abc”和s2=“abc”,那么s1和s2都将指向相同的内存引用(或对象)

在上述情况下,将创建3个对象

  • 对于堆上的x变量

  • 对于堆栈上的y变量

  • 对于堆上的x+y表达式


  • 实际上。。当两个字符串都有相同的值时,字符串池工作

    例如,如果我们有字符串s1=“abc”和s2=“abc”,那么s1和s2都将指向相同的内存引用(或对象)

    在上述情况下,将创建3个对象

  • 对于堆上的x变量

  • 对于堆栈上的y变量

  • 对于堆上的x+y表达式


  • 将创建4个对象

    字符串是不可修改的,所以每次连接它们时都会创建一个新对象

    新字符串(“xyz”)中的
    “xyz”
    首先创建“xyz”对象,然后将其传递到新对象(字符串)中,因此,这里有两个对象

    new String("xyz") <--there are two objects 
    "abc"   <-- kinda obvious
    x + y  <-- String are unmodifiable thus this is a new object
    

    将创建新字符串(“xyz”)4个对象

    字符串是不可修改的
    ,所以每次连接它们时都会创建一个新对象

    新字符串(“xyz”)中的
    “xyz”
    首先创建“xyz”对象,然后将其传递到新对象(字符串)中,因此,这里有两个对象

    new String("xyz") <--there are two objects 
    "abc"   <-- kinda obvious
    x + y  <-- String are unmodifiable thus this is a new object
    

    newstring(“xyz”)4个对象创建如下

    // 1. "xyz" in the literal pool
    // 2. a new String object which is a different object than "xyz" in the pool
    String x = new String("xyz");
    
    // 3. "abc" in the literal pool
    String y = "abc";
    
    // 4. new String object
    x = x + y;
    

    创建4个对象,如下所示

    // 1. "xyz" in the literal pool
    // 2. a new String object which is a different object than "xyz" in the pool
    String x = new String("xyz");
    
    // 3. "abc" in the literal pool
    String y = "abc";
    
    // 4. new String object
    x = x + y;
    

    是,代码将创建4个对象

    String x = new String("xyz"); // object#1 : xyz and Object #2: new String
    String y = "abc";             // Object#3 : abc
    x = x + y;                    // object#4 : xyzabc
    

    是,代码将创建4个对象

    String x = new String("xyz"); // object#1 : xyz and Object #2: new String
    String y = "abc";             // Object#3 : abc
    x = x + y;                    // object#4 : xyzabc
    

    你在说哪个JVM?它可能是特定于实现的。不考虑JVM,如何创建4个对象?第四个对象是什么?是的,有三个,“xyz”、“abc”和“xyzabc”。你错过了
    新字符串
    @Arvind你所说的“你错过了新字符串”是什么意思。新字符串的作用是在运行时在堆上创建一个新对象?它可能是特定于实现的。不考虑JVM,如何创建4个对象?第四个对象是什么?是的,有三个,“xyz”、“abc”和“xyzabc”。你错过了
    新字符串
    @Arvind你所说的“你错过了新字符串”是什么意思。新字符串的作用是在运行时在堆上创建一个新对象。这意味着,如果我想要
    String y=“abc”;字符串x=新字符串(y);x=x+y
    那么我就只有3个对象了?好吧,我想我开始明白了。这意味着,如果我想要
    String y=“abc”;字符串x=新字符串(y);x=x+y
    那么我就只有3个对象了?