判断两个变量是否相等有两种方式:
- 一种是利用 == 运算符;
- 一种是利用equals方法。
用处:
① 比较java基本类型:
比较基本类型只能用"= =",不能用"equals",这里的"=="比较的是两个基本类型的值;
② 比较包装类:
这里拿Integer,Character 来举例
public static void main(String[] args) {
Character a = new Character('a');
Character b = new Character('a');
//a与b值相同、但是地址不同
System.out.println(a == b); //false
System.out.println(a.equals(b));//true
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
//i1与i2值相同、但是地址不同
System.out.println(i1 == i2);//false
System.out.println(i1.equals(i2));//true
}
结果:
这边"=="比较的是对象的内存地址,new了两个不同的对象所存放的地址是不一样的,这边的"equals"比较的就是值,这里为什么比较的是值呢,包装类里的重写了equals的方法。
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
注:
但是要注意对于整型的包装类(Integer Long 等,通过Integer a = 127,Integer b = 127创建时,127保存在常量区编译时创建,使用==判断a与bs时返回true;但当定义数值不在(-128~127)之间的话 定义时会在堆中创建对象,此时a= =b,返回false!
用Integer举例说明:
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
System.out.println(a==b);//true
Integer c = 128;
Integer d = 128;
System.out.println(c==d);//false
}
结果:
③ 比较String:
"=="比较的是内存地址,"equals"比较的是值;
public static void main(String[] args) {
String a = new String("aa");
String b = new String("aa");
//a与b值相同、但是指向地址不同
System.out.println(a == b); //false
System.out.println(a.equals(b));//true
String i1 = "aa";
String i2 = "aa";
//i1与i2值相同、指向地址也相同
System.out.println(i1 == i2);//true
System.out.println(i1.equals(i2));//true
//i1与a值相同、指向指向地址不同
System.out.println(i1 == a);//false
System.out.println(i1.equals(a));//true
}
结果:
④ 比较对象:
这里"=="比较的是内存地址,"equals"比较的也是地址,没有重写equals方法的类都是调用的Object的equals的方法。
Person p1 = new Person(1001, "kangknag");
Person p2 = new Person(1001, "kangknag");
System.out.println(p1 == p2);//f
System.out.println(p1.equals(p2));
结果: