1. 用==做比较
- 如果比较的都是基础数据类型,那么比较的就是他们的值。
- 如果比较的是包装类或String类,那么比较的是两个对象的内存地址。
- 如果比较的一个是基础数据类型,一个是包装类,那么包装类会拆箱为基础数据类型进行比较。
举例:
int a =10;
int b = 10;
System.out.println(a == b);
比较的是a和b的值都是10,所以会输出true;
String a = "123";
String b = "123";
System.out.println(a == b);
这时候,ab是两个常量,都指向了运行时常量池中的“123”,一个对象。
Integer a = 200;
Integer b = 200;
System.out.println(a == b);
这时候比较的是a和b所指向的对象的内存地址,由于他们不在-128和127的缓存范围中,所以他们各自都会装箱new 一个对象,在堆上开辟2个内存空间,所以是false。
如果是除Integer之外的包装类,由于没有Integer缓存机制,会直接装箱为堆上的对象。如:
Double a = 20.0;
Double b = 20.0;
System.out.println(a == b); //结果为false
如果是int和Integer做比较的话,那么Integer会拆箱为基础数据类型然后进行值的比较。
Double a = 20.0;
double b = 20.0;
System.out.println(a == b); //结果为true
2.equals做比较
equals是Object下的方法,各个包装类重写了此方法,如果两个相同数据类型的对象做比较,equals只比较他们的值是否相等。
例如String源码下的:
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;
}
Integer下的equals:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
这里要注意一定是两个相同的数据类型,如果是这样的,就会返回false
Integer a = 200;
System.out.println(a.equals("200")); //结果为false