当我们使用+运算符

时间:2018-06-01 05:04:10

标签: java string string-concatenation

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

在以下代码中:

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

我知道str1和str2会创建一个对象" Hello"和"世界"分别内部 字符串常量池。对于str3,在外部创建一个新对象 String Constant Pool ,它指向" HelloWorld"在 字符串常量池中创建

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

是否会在 String str3 的情况下在外部中创建一个新对象,或者str4将直接指向该对象" HelloWorld" 内部 字符串常量池

  

PS:和 IF 这种情况类似于创建新对象外部池,那么如何在不使用 关键字?

5 个答案:

答案 0 :(得分:2)

首先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 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

答案 1 :(得分:1)

首先,这不是一个答案,这是您自己回答或解释情况的方法。
两个字符串的连接总是创建字符串的新对象 为了符合这一点,你可以做一件事,就是如何在内存堆和池中进行管理。

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-> Debugging-> Variables),如下所示:

enter image description here

6:现在右键单击str8并选择标记对象... ,并为该对象提供一些标记,如Same Object

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

enter image description here

这表明两个引用str7' and str8`都引用相同的对象。

7:现在通过使用不同的标记行标记str3-4-5-6所有引用来检查此内容:

enter image description here

对于该对象的更多内部管理,只需在变量窗口中右键单击变量名称即可查看Show Refereances选项,如:

enter image description here enter image description here

<强>更新
  - 连接在堆中创建对象   - 确保声明该池的look语句不能包含具有相同值的多个字符串   - 此处str7-8是池中的对象,与str4-5-6不同,如第7点的屏幕截图所示。
  - 您还可以通过使用str5运算符将str7==进行比较来确认它,如果它返回true,则连接会在池中创建对象,因为 str7引用池并且两者都被引用相同的对象,但它将返回false,因为它们都不相同。

答案 2 :(得分:1)

为回答您的问题,在池外创建了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");
    }

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

答案 3 :(得分:1)

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

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

现在

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

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

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

有没有像下面这样的。

String s3 = "you" + "me"; //operation is compile time now, s3 in scp

所以,

System.out.println(s3 == s2); // true, s3 in scp and s2 in scp

注意:String 的 "abc" 值为编译时常量

答案 4 :(得分:0)

        **str4 is stored in heap.**        
                String str1 = "Hello";
                String str2 = "World";
                String str3 = new String("HelloWorld");
                String str4 = str1 + str2;
                String str5="HelloWorld";
            if str4 is stored on string pool then str5 will point to same object where str4 is pointing.
            but this statement giving me false output-:
                **System.out.println(str4 == str5);**
            ***************output****************
            false

                 String str4 = (str1 + str2).intern();
                 String str5="HelloWorld";
                but if you are using  String.intern then this method will try to find a String with the same sequence of characters in the pool.
    **System.out.println(str4 == str5);**
    ***************output******************
    true


  [1]: https://i.stack.imgur.com/IjMhP.png