使用String或+运算符中的concat操作进行串联

时间:2018-07-16 14:47:41

标签: java string

我知道String的不可变性,但是我对String与串联的关系感到困惑。输出的是什么,为什么是下面的代码:

String str1="my string";
System.out.println(str1);
System.out.println(str1.concat(" gets appended")); 
System.out.println(str1+" getting updated");

根据我的理解,str1不应因为其不变性而被更改。因此,对于所有情况,输出应为我的字符串。

感谢您的所有澄清。但是,请查看下面的代码及其输出,

代码:

    String str1= new String("First string");
    String str2= "Second string";

    System.out.println("String1: "+str1);
    System.out.println("String2: "+str2);

    str1 = str1.concat(" is now appended");             
    System.out.println(str1);

    str2 = str2.concat(" is now appended");             
    System.out.println(str2);

    str1 = str1+" is getting added";
    System.out.println(str1);

    str2 = str2+" is getting added";
    System.out.println(str2);

输出:

    String1: First string
    String2: Second string
    First string is now appended
    Second string is now appended
    First string is now appended is getting added
    Second string is now appended is getting added

谁能告诉我为什么要修改它?我知道要修改一个字符串,我们需要使用StringBuilder类或StringBuffer类。但是,这里没有使用那些类,即使我使用了String,它也被修改了。 它在内部使用StringBuilder类还是StringBuffer类?我正在使用jdk版本8。

谢谢。

4 个答案:

答案 0 :(得分:3)

点处,您要更改str1的参考值。在您的示例中,您正在创建两个 new String实例,它们的值为str1以及您要附加的其他内容。

答案 1 :(得分:3)

调用Stringstr1.concat(" gets appended")时将返回新的str1 + "getting updated",但不会影响原始的str1

System.out.println(str1); // my string
System.out.println(str1.concat(" gets appended")); // my string gets appended
System.out.println(str1 + " getting updated"); // my string getting updated
System.out.println(str1); // my string

更新:

您需要强调变量对象之间的区别。 str1变量,它是指字符串对象第一个字符串。当您呼叫str1 = str1+" is getting added";时,实际上是让变量 str1引用新的字符串现在添加的第一个字符串正在添加

尝试一下:

String string = "original string";
String string_holder = string;
string = string + " contact";
System.out.println(string); // original string contact
System.out.println(string_holder); // original string, the original string is not affected

答案 2 :(得分:1)

System.out.println(str1.concat(" gets appended")); 
System.out.println(str1+" getting updated"); 

原始字符串不变,都创建了一个新的字符串,并打印出来。

答案 3 :(得分:0)

调用str.concat1(str2)时String不变的原因是因为该方法是如何在String类中编写的。假设我们创建了自己的小示例类:

public class MutStr {
    private String str;
    public MutStr(String str) {
        this.str = str;
    }
    public String addString(String input) {
        str = str + input;             //changes the object itself
        return str;                    //returns the changed object
    }
}

此类并非一成不变,因为在运行方法addString()时,我们更改了对象本身。但是,当我们更改方法时,可以使对象不可变:

    public String addString(String input) {
        String output = str + input;   //create a new object
        return output;                 //returns the new object
    }

两个方法都返回相同的东西;将新的String添加到旧的String中,但是在内部,第一个方法更改对象本身,而第二个方法则不更改。

关键实现是方法返回的事物(println命令使用的事物)与对象本身不是同一事物。