2.== 与 equals 区别
使用= =时
- 比较基本数据类型:= = 比较值;
- 比较引用数据类型:= = 比较内存地址;
- 使用包装类,如new Integer() == 基本数据类型,如int 。结果为拆箱后比较值;
- 使用new Integer() ==与 final Integer 常量相比较时看取值范围 ,范围为常量池大小,如 Integer常量范围在-128~127之间,在此期间比较值,不在此期间比较地址,不建议直接比较,且浮点数类型的包装类无常量池;
使用equals()
- object基类中定义了equals(), 默认==比较
public boolean equals(Object obj) { return (this == obj); }
- 包装类重写了equals(),如Integer 会做拆箱操作,比较值
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
- java.lang.String.equals()重写后,先比较内存地址,内存地址不相同时比较值
public boolean equals(Object anObject) {
//比较地址 if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length;
//判断长度,char对比 if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }