首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我们连接使用+运算符时,字符串的新对象在哪里?

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

Stack Overflow用户
提问于 2018-06-01 05:04:10
回答 5查看 6.4K关注 0票数 8

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

在以下代码中:

代码语言:javascript
复制
String str1 = "Hello";
String str2 = "World";
String str3 = new String("HelloWorld");
String str4 = str1 + str2;

我知道str1和str2将分别在(字符串常量池)中创建一个对象"Hello“和"World”。对于str3,一个新的对象是在之外创建的字符串常量池,它指向"HelloWorld“,它是在字符串常量池中创建的

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

一个新的对象是在外部创建池,就像String str3的情况一样,还是str4将直接指向对象"HelloWorld“,在中,字符串常量池

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-06-01 06:10:02

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

代码语言:javascript
复制
String str1 = "Hello";
String str2 = "World";
String str3 = new String("HelloWorld");
String str4 = str1 + str2;

到目前为止,您有5个String对象,4个String常量池,1个String常量池。所以您的str4是字符串池中的一个新对象,请检查下面的代码,

代码语言:javascript
复制
 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.

供测试

代码语言:javascript
复制
System.out.println(str3==str4); //false
System.out.println(str4==str5);//false
System.out.println(str5==str6);//true
票数 3
EN

Stack Overflow用户

发布于 2018-06-01 07:26:08

首先,这不是一个答案,这是通过你自己或对情况的解释来获得答案的方法。

两个字符串的连接总是创建字符串的一个新对象。

要符合这一要求,您可以做一件事情,即它如何在内存堆和池中进行管理。

1:转到NetBeans:

2:编写这样的程序:

代码语言:javascript
复制
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("");
    }
}

他说:在System.out.println("");这条线上放一个断点。

4:现在调试这段代码。

5:转到变量窗口(窗口->调试->变量),如下所示:

6:现在,右键单击str8并选择标记对象.并给该对象添加一些标签,比如Same Object

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

这表明两个引用( str7' andstr8` )都是引用相同的对象。

7:现在检查一下str3-4-5-6所有的引用,用不同的标签行标记它们,比如:

要进一步对该对象进行内部管理,只需右键单击变量窗口中的变量名,查看Show Refereances选项,如:

更新:

  • 连接在堆中创建对象。
  • 要确保look语句不能包含具有相同值的多个字符串,请执行以下操作
  • 在这里,str7-8是从池中引用的对象,这与第7点的屏幕截图中描述的str4-5-6不同。
  • 您还可以通过使用str5str7进行比较来确认它,如果它返回true,则连接在池中创建对象,因为str7引用池,并且都引用相同的对象,但由于两者不相同,所以返回false。
票数 3
EN

Stack Overflow用户

发布于 2021-01-10 11:31:39

在阅读我的评论之前,要记住两点。

  1. 连接期间任何运行时操作的结果都将在堆区域创建对象。
  2. intern()方法从字符串常量池(scp)区域获取引用。

现在,

代码语言:javascript
复制
String s = "you";       // s in scp
String s1 = s + "me";   // "me" in scp and runtime operation here will put s1 in heap
String s2 = "youme";    // s2 in scp

要确定我上面的观点,请参阅下面的代码。

代码语言:javascript
复制
System.out.println(s1 == s2);          // false , since s1 is in heap and s2 is in scp
System.out.println(s1.intern() == s2); // true , since s2 in scp and s1.intern() in scp

如果有像下面这样。

代码语言:javascript
复制
String s3 = "you" + "me"; //operation is compile time now, s3 in scp

所以,

代码语言:javascript
复制
System.out.println(s3 == s2); // true, s3 in scp and s2 in scp

注意:字符串的"abc“值是编译时常数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50636396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档