1. 使用 ==
1.1 基本类型比较
int a = 1;
int b = 1;
byte c = 1;
Integer d1 = new Integer(1);
Integer d2 = new Integer(1);
System.out.println(a == b);
//结果:true
System.out.println(a == c);
//结果:true
System.out.println(a == d1);
//结果:true
System.out.println(d2 == a);
//结果:true
System.out.println(d1 == d2);
//结果:false
java中的基本类型,包含:int、long、short、byte、char、boolean、float、
double这8种,可以使用==号判断值是否相等。
如果出现了基本类型的包装类,比如:Integer,用一个基本类型和一个包装类,
使用号也能正确判断(a == d1),返回true,因为Integer和int比较时,会自动拆
箱,这是比较值是否相等。
但如果有两个包装类(d1 == d2),使用==号判断的结果可能是false,因为
两个Integer比较时,比较的是它们指向的引用(即内存地址)是否相等。
Integer d3 = 1;
Integer d4 = 1;
Integer d5 = 128;
Integer d6 = 128;
System.out.println(d3 == d4);
//结果:true
System.out.println(d5 == d6);
//结果:false
为什么结果不一样呢
答:因为Integer有一个常量池,-128~127直接的Integer数据直接缓存进入常量池。所以1在常量池,而128不在。
new的Integer对象不适用常量池(如d1 == d2)
1.2 字符串比较
String e = "abc";
String f = "abc";
String g = new String("abc");
String h = new String("abc");
System.out.println(e == f);
//结果:true
System.out.println(e == g);
//结果:false
System.out.println(g == h);
//结果:false
普通的字符串变量,使用==号判断,也能返回正确的结果。
但如果一个普通的字符串变量,跟new出来的字符串对象使用 == 号判断时,
返回false。这一点,跟之前说过的用一个基本类型和一个包装类,
使用 == 号判断的结果有区别,字符串没有自动拆箱的功能,这一点需要特别注意。
此外,两个new出来的字符串对象使用 == 号判断时,也返回false,因为
他们比较比较的两个对象的内存地址,而不是内存地址所存放的值。
总结:使用 == 号,可以非常快速判断8种基本数据类型是否相等,除此之外,还能判断两个对象的引用是否相等。
2. 使用equals方法
那怎么判断两个new对象的值是否相等呢?
答:使用equals方法。但不是直接调用,需要重写equals。
equals方法其实是Object类中的方法:只判断两个对象的引用是否相等。
public boolean equals(Object obj) {
return (this == obj);
}
重写equals
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
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;
}
它依然会先判断两个对象引用是否相等,如果相等返回true。接下来,会把两个字符串的挨个字符进行比较,只有所有字符都相等才返回true。
String g = new String("abc");
String h = new String("abc");
System.out.println(g.equals(h)); //重写的equals方法
//结果:true
3.总结:
== 的作用:
基本类型:比较值是否相等
引用类型:比较内存地址值是否相等
equals 的作用:
引用类型:默认情况下,比较内存地址值是否相等。可以按照需求逻辑,重写对象的equals方法。