【问题标题】:Immutable strings in javajava中的不可变字符串
【发布时间】:2013-05-01 16:20:24
【问题描述】:

这怎么会是真的:

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");

他们不应该都打印假吗?...我知道字符串是不可变的,但我不明白为什么不使用构造函数初始化会导致不同的输出

【问题讨论】:

    标签: java string immutability


    【解决方案1】:

    因为文字"one" 在它出现的任何地方都引用了相同的字符串对象;字符串文字总是被实习的。第一个示例中的两个变量将引用同一个对象。

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

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

    【讨论】:

    • 它不仅仅是被实习的普通文字——它是任何常量字符串表达式,这意味着字符串文字两个(或更多)的连接(使用+) ) 字符串文字。见JLS 15.28JSL 3.10.5
    【解决方案2】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 2013-05-08
      • 2022-06-28
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      相关资源
      最近更新 更多