- == 首先用在比较基本类型数据时,比较的是值是否相同,用在比较引用类型,则比较的是引用地址是否相同。
- equals 是Object的一个方法,在没有被重写的情况下,是和==等效的,在被重写的情况下一般比较的是内容是否相同,比如常见的String,Integer等类都重写了equals方法,比较的是内容是都相同。
-
一些特殊情况下的比较
1.当使用==比较两个字符串时,
String a = "1" ; String b = "1"; 此时 a == b为true,
但如果String a = new String("1"); String b = new String("1")则 a == b 为false。
这是因为通过字面量赋值的字符串的地址都是在常量池中共享的,所以引用地址相同,但通过其他方式创建的字符串则不在常量池中。
2.当使用==比较Integer类型数据时。
Integer a = 1; Integer b = 1; 此时 a == b为true,
Integer a = 128; Integer b = 128; 此时 a == b为false,
Integer a = new Integer(1); Integer b = new Integer(2); 此时 a == b 为false;
出现上述原因:Integer包装类在被加载时,会执行其一个静态方法,将-128~127的Integer对象存放在一个数组中缓存,在通过字面量赋值或者Integer.valueOf()方式赋值使用时如果需要的是在-128~127之间的Integer对象,则直接在缓存中获取不再重新创建,所以上述第一种情况是true,当超过这个范围则会重新创建对象,所以第二种情况为false。第三种情况则是直接使用构造方法创建的不同的实例引用地址不同,所以为false。
3.其他包装类型对象类似。
所有综上:基本类型比较相等使用==,引用类型比较时如果比较内容建议使用重写的equals方法比较(包括包装类型比较大小时,建议使用compareTo()方法)