Java字符串对象

时间:2013-11-19 04:47:48

标签: java object

我有以下代码:

public class Porow{
    public static void main (String[] args){
        String s1 = "foo";
        String s2 = "foo";

        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));

        String s3 = new String ("foo");
        System.out.println(s1 == s3);
        System.out.println(s1.equals(s3));
    }
}

输出:

true
true
false
true

我想了解并解释这里发生了什么。我需要一些指导。我是否正确地说s1和s2是存储在内存不同部分的相同对象,这就是为什么我们得到前2 true s?

为什么第3个输出false? s3是一个不同的对象?为什么它会在s1上使用true方法生成equals?我很感激一些帮助。谢谢:)。

编辑: 这个问题与==equals()无关。我知道它们是什么。我的问题与内存引用和地址有关。所以不要只是假设我在询问字符串比较。我在这里问一个完全不同的事情。

4 个答案:

答案 0 :(得分:1)

这是因为在第三种情况下,创建了一个新对象(new关键字创建了一个新的字符串对象),==用于对象引用相等。这就是它返回false的原因。

equals()方法用于String值相等,因此返回true

在第一种和第二种情况下,“foo”字符串文字是interned,因此,s1s2都引用相同的字符串文字。

答案 1 :(得分:1)

==运算符检查引用等价。如果两个引用是等价的,那么它们就是同一个实例。

您的第一个示例有效,因为字符串是实例化的 - 但不依赖于此。 equals()实际检查两个字符串是否包含相同的数据。

使用new关键字,为另一个字符串创建一个新引用 - 因此,它们不再指向同一个实例。

答案 2 :(得分:0)

因为==测试字符串引用相同的对象并且等于测试它们是否相同。你的行

String s3 = new String ("foo");

构造对常量“foo”String的新引用。再看一下What is String interning?,但请注意,实习将使用PermGen space

答案 3 :(得分:0)

将字符串放入字符串池

当你有

String s1 = "foo";
String s2 = "foo";

只有一个“foo”放入String池中。

所以

s1 == s2 is true becuase they reference the Same String "foo" in the pool

要回答你的问题,你的假设是正确的!

最后一个真s1.equals(s3)比较值“foo”,这就是它们相等的原因。

所以请记住使用Strings

== compares Object reference

equals compares value.