java中的不可变字符串

java中的不可变字符串,java,string,immutability,Java,String,Immutability,这是怎么回事: String sOne = new String(); sOne = "one"; String sTwo = new String(); sTwo = "one"; System.out.println(sOne == sTwo ? "true": "false"); 但这是假的: String sOne = new String("one"); String sTwo = new String("one"); System.out.println(sOne == sTwo

这是怎么回事:

String sOne = new String();
sOne = "one";
String sTwo = new String();
sTwo = "one";
System.out.println(sOne == sTwo ? "true": "false");
但这是假的:

String sOne = new String("one");
String sTwo = new String("one");
System.out.println(sOne == sTwo ? "true": "false");
他们不是都应该打印假的吗?。。。我知道字符串是不可变的,但我不明白为什么不使用构造函数初始化会导致不同的输出,因为文本
“one”
在任何地方都引用相同的字符串对象;字符串文本始终处于内部状态。第一个示例中的两个变量将引用同一个对象

在第二种情况下,在两个赋值中强制构造一个新的字符串对象,因此字符串是相等的,但是不同的实例;这两个变量引用等效但不同的对象

    String v1 = "Test";
    String v2 = v1;

    if(v1 == v2)
        System.out.println("1true");

    v2 = "Test"; // referencing the same object
    if(v1 == v2)
        System.out.println("2true");
    if(v1.equals(v2))
        System.out.println("3true");

    v2 = new String("Test");  // new object/pointer same content
    if(v1 == v2)
        System.out.println("4true");
    if(v1.equals(v2))
        System.out.println("5true");
表达式
sOne.equals(sTwo)
在两个示例中都应返回true,因为它将对字符串内容执行相等测试。

因为文本
“one”
在其出现的任何地方都引用相同的字符串对象;字符串文本始终处于内部状态。第一个示例中的两个变量将引用同一个对象

在第二种情况下,在两个赋值中强制构造一个新的字符串对象,因此字符串是相等的,但是不同的实例;这两个变量引用等效但不同的对象

    String v1 = "Test";
    String v2 = v1;

    if(v1 == v2)
        System.out.println("1true");

    v2 = "Test"; // referencing the same object
    if(v1 == v2)
        System.out.println("2true");
    if(v1.equals(v2))
        System.out.println("3true");

    v2 = new String("Test");  // new object/pointer same content
    if(v1 == v2)
        System.out.println("4true");
    if(v1.equals(v2))
        System.out.println("5true");

表达式
sOne.equals(sTwo)
在这两个示例中都应该返回true,因为它将对字符串内容执行相等测试。

在Java中,如果像在C x==y中那样进行比较,则会比较对象(即指针),但不会比较其内容。这就是为什么需要使用obj.equals(other_obj)来确保它们在功能上是相同的对象。这类似于比较C中的指针。如果指针相同,则您正在查看相同的对象。如果指针不同,这两个对象仍然可以具有相同的值,但它们是不同的对象

    String v1 = "Test";
    String v2 = v1;

    if(v1 == v2)
        System.out.println("1true");

    v2 = "Test"; // referencing the same object
    if(v1 == v2)
        System.out.println("2true");
    if(v1.equals(v2))
        System.out.println("3true");

    v2 = new String("Test");  // new object/pointer same content
    if(v1 == v2)
        System.out.println("4true");
    if(v1.equals(v2))
        System.out.println("5true");
输出:

1true
2true
3true
5true

在Java中,如果像C x==y那样进行比较,则会比较对象(即指针),但不会比较其内容。这就是为什么需要使用obj.equals(other_obj)来确保它们在功能上是相同的对象。这类似于比较C中的指针。如果指针相同,则您正在查看相同的对象。如果指针不同,这两个对象仍然可以具有相同的值,但它们是不同的对象

    String v1 = "Test";
    String v2 = v1;

    if(v1 == v2)
        System.out.println("1true");

    v2 = "Test"; // referencing the same object
    if(v1 == v2)
        System.out.println("2true");
    if(v1.equals(v2))
        System.out.println("3true");

    v2 = new String("Test");  // new object/pointer same content
    if(v1 == v2)
        System.out.println("4true");
    if(v1.equals(v2))
        System.out.println("5true");
输出:

1true
2true
3true
5true

它不仅仅是插入的普通文本——它是任何常量字符串表达式,这意味着一个字符串文本或两个(或更多)字符串文本的串联(使用
+
)。请参阅和。插入的不仅仅是普通文本,而是任何常量字符串表达式,这意味着一个字符串文本或两个(或更多)字符串文本的串联(使用
+
)。见和。