Skip to content

== 和 equals 都在问「相等」,比的不是同一件事。

== ​

  • 基本类型:比的是值。10 == 10 为 true。
  • 引用类型:比的是两个引用是不是指向同一块对象。
java
int x = 10;
int y = 10;
String a = new String("abc");
String b = new String("abc");
System.out.println(x == y); // true
System.out.println(a == b); // false

== 不能重载。

equals ​

equals 定义在 Object 里,默认实现就是 ==。自己写的类如果不重写,equals 仍然在比地址。

JDK 里多数常用类重写过,改成比内容。String、Integer 都是。

java
String a = new String("abc");
String b = new String("abc");
System.out.println(a.equals(b)); // true
System.out.println(a == b);      // false

字符串字面量和 new ​

java
String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2)); // true
System.out.println(s1 == s2);      // true

"abc" 进字符串常量池,两次字面量常常是同一个对象,所以 == 也可能是 true。new String("abc") 会在堆上再做一个对象,两个 new 的 == 就是 false。

Integer 缓存 ​

java
Integer a = 128;
Integer b = 128;
Integer c = 127;
Integer d = 127;
System.out.println(a == b); // false
System.out.println(c == d); // true
System.out.println(a.equals(b)); // true
System.out.println(c.equals(d)); // true

自动装箱走 Integer.valueOf。默认缓存 -128 到 127,这段里的装箱对象可以复用,== 为 true。超出范围每次都是新对象,== 为 false。equals 比的是数值,两边都是 true。

Byte、Short、Long、Character 也有类似缓存;Float / Double 没有。业务代码里比较包装类型,优先 equals,不要赌缓存区间。

测试开发工程师 · 专注自动化与系统架构 | 邮箱: hansblog@atumsoul.win