== 和 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,不要赌缓存区间。