当前位置: 首页 > 知识库问答 >
问题:

当我们使用运算符连接时,新的字符串对象在哪里创建

高墨一
2023-03-14

我知道这可能是非常基本的,也可能是非常直接的,但我无法清楚地理解在这种情况下会发生什么,所以,就这样吧。

在以下代码中:

String str1 = "Hello";
String str2 = "World";
String str3 = new String("HelloWorld");
String str4 = str1 + str2;

我知道str1和str2将在字符串常量池中分别创建一个对象“Hello”和“World”。而对于str3,将在字符串常量池外部创建一个新对象,该对象指向在字符串常量池内部创建的“HelloWorld”。

我的问题是,如果我concat 2个或更多字符串(使用“”或concat()方法),会发生什么?

是否会像字符串str3一样在池外创建新对象,或者str4是否会直接指向字符串常量池内的对象“HelloWorld”

PS:如果它类似于在池外创建新对象的情况,那么它是如何在不使用new关键字的情况下发生的呢?

共有3个答案

谭新知
2023-03-14

为了回答您的问题,在池外创建了str4对象。

这是我的解释:

    String s = "abc";
    String s1="xyz";

    String s3 = "abcxyz";
    String s2=s+s1;

    if(s2 == s3){
        System.out.println("true");
    }else{
        System.out.println("false");
    }

这将打印false。这意味着s2没有引用s3创建的池对象。

子车宏浚
2023-03-14

首先,这不是一个答案,这是你自己获得答案或解释情况的方法
两个字符串的串联始终会创建一个新对象

1: 转到NetBeans:2:编写如下程序:

public class StringTest {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "World";
        String str3 = new String("HelloWorld");
        String str4 = str1 + str2;
        String str5 = str1 + str2;
        String str6 = str1.concat(str2);

        String str7 = "HelloWorld";
        String str8 = "HelloWorld";

        System.out.println("");
    }
}

3:只需将断点放在System.out.println ("");这一行。
4:现在调试此代码。
5:转到变量窗口(Window-

6:现在右键单击str8并选择Mark Object...并为该对象提供一些标签,例如相同对象

现在,您可以看到相同的标记行也出现在str7上,如:

这表明引用str7和str8都是同一个对象。

7: 现在,用不同的标记行标记所有引用,检查这些引用,如:

要进一步了解该对象的内部管理,只需在变量窗口中右键单击变量名称,查看“显示引用”(Show References)选项,如:

更新:串联在堆中创建对象
-为了确保该语句看起来像池不能包含具有相同值的多个字符串,这里引用了池中的对象,该对象不同于第7点的屏幕截图所示的str4-5-6
-您还可以通过使用操作符将str5与str7进行比较来确认,如果返回true,则串联会在池中创建对象,因为str7引用池,并且两者都引用相同的对象,但会返回false,因为两者不相同。

谭嘉歆
2023-03-14

首先String s=new String("abs");它将创建两个对象,一个对象在池区域,另一个在非池区域,因为您使用new和以及字符串文字作为参数

String str1 = "Hello";
String str2 = "World";
String str3 = new String("HelloWorld");
String str4 = str1 + str2;

到目前为止,您有五个String对象,四个在String Constant Pool中,一个在Heap中。所以您的str4完全是String Pool中的一个新对象,请同时检查下面的代码,

 String str5="HelloWorld"; //This line will create one more String Constant Pool object because we are using the variable name as str5.
 String str6="HelloWorld";////This line will not create any object, this will refer the same object str5.

用于测试

System.out.println(str3==str4); //false
System.out.println(str4==str5);//false
System.out.println(str5==str6);//true
 类似资料:
  • 问题内容: 我知道这可能是很基本的,可能很简单,但是我无法清楚地了解在这种情况下会发生什么,所以就来了。 在下面的代码中: 我知道,str1和str2的将分别创建一个对象的“Hello”和“世界” 里* 的 字符串常量池的 。对于str3,在 字符串常量池 外部 创建一个新对象,该对象指向 在 字符串常量池 内部 创建的“ HelloWorld” 。 __ *__ 我的问题是,如果我concat

  • 问题内容: 我们可以在PHP中使用对象运算符的不同方式有哪些? 问题答案: PHP有两个对象运算符。 如果要在实例上调用方法或访问实例属性,则使用第一个。 当您要调用方法,访问变量或在子类中调用方法的父类版本时,使用第二个。

  • 在Java当我们写作的时候 然后与进行比较,我们得到true作为布尔结果。对相同的解释是字符串常量是在字符串池中创建的,因此这里由S1和s2引用的字符串常量是相同的。还有,如果我们写一些 然后与,我们得到false。原因是S1和S2的引用不同,因为字符串文字是在堆中创建的。 我的问题是,在构造函数中传递的字符串文字“TestString”是在哪里创建的?它与字符串文字/常量相同吗?因此应该在池中创

  • 我在做一个作业,我得到了下面这个问题。 使用方法创建的字符串对象存储在内存中的哪里? 在恒定池中 在堆上(新操作员对象的区域)

  • 这里将创建两个对象,一个在堆内存中,另一个在字符串池中。 那么,方法有什么用呢?执行上述语句后,字符串将在堆和字符串池中可用

  • 我试图连接两个字符串,一个字符串有一些值,另一个字符串有空。 示例: 并用concat函数和运算符连接这两个字符串 示例: 根据我的理解,当在concat函数中使用空字符串时,因为string2是空的,所以不会创建新的引用。但在使用运算符时,将在字符串池常量中创建一个新引用。但在下面的代码中,当使用运算符时,不会创建新的引用。 输出: 字符串1:69066349 类别:69066349 相同的 第