toString(),==,equals()对象方法如何在引用和基元类型上以不同或相似的方式工作?

JAV*_*BIE 6 java

toString()方法,==运算符和equals()方法如何在引用和基元类型上以不同或相似的方式工作?

Ste*_*n C 8

对于常规类型(包括String):

  • ==比较对象引用.它测试两个对象引用是否相等; 即如果他们引用同一个对象.
  • equals(Object)测试此对象是否"等于"另一个对象."等于"意味着取决于对象的类如何定义相等性.的java.lang.Object类定义equals(other)this == other,但很多类重写这个定义.
  • toString()提供对象到String的简单转换.结果字符串的格式和内容是特定于类的,并且(从java.lang.Object合同的角度来看)不保证它是有意义的.

对于(真)原始类型:

  • == 比较类型的值,和
  • equals()toString()没有定义.Java不允许您在原始值上调用方法.

然而,由于在某些情况下 Java语言表示原始类型可以"自动装箱"以给出基本类型的相应包装类型的实例,因此这很复杂.例如,int对应于java.lang.Integer,等等.对于包装类:

  • == 定义与任何其他引用类型相同,
  • equals() 比较包装的值,和
  • toString() 格式化包装的值.

工程中的扳手如下图所示:

int a = ...
int b = a;
Integer aa = a;        // autoboxing occurs
Integer bb = b;        // autoboxing occurs

assert a == b;         // always succeeds
assert aa.equals(bb);  // always succeeds
assert aa == bb;       // sometimes succeeds, sometimes fails.
Run Code Online (Sandbox Code Playgroud)

最后一次失败的原因是JLS不保证给定原始值的自动装箱将始终给出相同的包装器对象.它在某些情况下(例如小整数),而不会用于其他情况(例如大整数).

从上面的示例中学到的教训是,您需要非常小心地使用==引用类型.只有当你真的要测试两个引用是否属于同一个对象时才使用它.如果您只是想测试对象是否"相等"而没有调用的开销,请不要使用它equals().

(另请注意,在许多情况下,这String是另一种==会给你错误答案的类型;请参阅如何比较Java中的字符串?)


Bab*_*fas 2

对于引用类型, == 将比较实际引用(对象驻留在内存中的位置),而 equals 方法则执行数据比较。

出于性能原因,JVM 有时会“字符串实习”您的不可变字符串。造成这样的情况:

String a = "abc";
String b = "abc";
if (a == b){ 
    //The if statement will evaluate to true, 
    //if your JVM string interns a and b, 
    //otherwise, it evaluates to false. 
}
Run Code Online (Sandbox Code Playgroud)

http://en.wikipedia.org/wiki/String_interning