“==”如何用于对象?

时间:2009-12-11 12:02:49

标签: java

public static void main(String [] a)
{
    String s = new String("Hai");
    String s1=s;
    String s2="Hai";
    String s3="Hai";
    System.out.println(s.hashCode());
    System.out.println(s1.hashCode());
    System.out.println(s2.hashCode());
    System.out.println(s3.hashCode());
    System.out.println(s==s2);
    System.out.println(s2==s3);

}

从上面的代码可以解释当JVM遇到这一行(s == s2)时会发生什么?

8 个答案:

答案 0 :(得分:17)

它比较引用 - 即两个变量都指的是完全相同的对象(而不仅仅是相同的对象)。

  • ss2引用不同的对象,因此表达式的计算结果为false。
  • 由于分配,
  • ss1引用相同的对象(彼此相同)。
  • 由于字符串实习,
  • s2s3引用相同的对象(彼此)。

如果这没有多大帮助,请询问有关特定位的更多详细信息。对象和引用可能会引起混淆。

请注意,默认情况下只会锁定字符串文字 ...所以即使ss2引用相等的字符串,它们也是'还是两个独立的对象。同样,如果你写:

String x = new String("foo");
String y = new String("foo");

然后x == y将评估为false。您可以强制实习,在这种情况下实际上会返回实习文字:

String x = new String("foo");
String y = new String("foo");
String z = "foo";

// Expressions and their values:
x == y: false
x == z: false
x.intern() == y.intern(): true
x.intern() == z: true

编辑:评论表明new String(String)基本没有意义。事实并非如此。

String是指char[],具有偏移量和长度。如果你接受一个子字符串,它将创建一个新的字符串,引用相同的 char[],只是具有不同的偏移量和长度。如果您需要长时间保留长字符串的小子字符串,但不需要长字符串本身,那么使用new String(String)构造函数创建副本会很有用只需要你需要的部分,允许更大的char[]被垃圾收集。

这方面的一个例子是读取一个字典文件 - 许多短文字,每行一个。如果使用BufferedReader.readLine(),则分配的char数组将至少为80个字符(无论如何都在标准JDK中)。这意味着即使是像“和”这样的短字也会占用160字节+开销的字符数组......你可以用这种方式快速耗尽空间。使用new String(reader.readLine())可以节省一天。

答案 1 :(得分:1)

==比较对象而不是对象的内容。 s和s2是不同的对象。如果要比较内容,请使用s.equals(s2)。

答案 2 :(得分:1)

我想你知道,当你使用'=='测试变量之间的相等性时,你实际上在测试内存中的引用是否相同。这与equals()方法不同,equals()方法结合了算法和属性以返回结果,表明两个对象被认为是相同的。在这种情况下,如果结果为true,则通常意味着两个引用都指向同一个Object。这让我想知道为什么s2 == s3返回true,并且String实例(它们是不可变的)是否可以在某处汇总使用。

答案 3 :(得分:1)

Think of it like this.
  Identical twins look the same but they are made up differently.
If you want to know if they "look" the same use the compare.
If you want to know they are a clone of each other use the "=="

:)

答案 4 :(得分:1)

==比较Object的内存(引用)位置。您应该使用.equals()来比较对象的内容。

您可以将==用于intdouble,因为它们是原始数据类型

答案 5 :(得分:0)

这应该是一个明显的错误。 JVM就像使用Memory中存在的字符串一样。因此s2,s3指向已经实例化一次的相同String。如果你做了类似s5 =“Hai”的事情,那就等于s3。

然而,new会创建一个新的Object。无论String是否已经存在,无论如何。因此s不等于s3,s4。

现在如果你做s6 = new String(“Hai”),即使这不等于s2,s3或s。

答案 6 :(得分:0)

文字s2和s3将指向内存中与编译时相同的字符串。 s在运行时创建,并指向内存中不同的“Hai”实例。如果你想让s指向与s2和s3相同的“Hai”实例,你可以通过调用实习生让Java为你做这件事。所以s.intern == s2将是真的。

好文章here

答案 7 :(得分:-3)

您正在为String类使用'=='重载...