1 概述
== 比较的是 所指向的对象的地址
equals 比较的是 所指向的对象的内容
注:
equals方法不能作用于基本数据类型的变量
用 == 比较基本数据类型的变量,比较的是它们的值
equals是基类 Object 中的方法,它也是用 == 来实现的,所以使用中的其他类,基本上都对 equals进行了重写,让其比较的是内容
总结:
因为比较引用所指向的对象的地址不常用(一般意义不大),在开发中
如果 比较基本类型变量的值是否相同,用 ==,其他用 equals
1.1 ==
基本上分为三种类型
1) 基本类型 == 基本类型
比较的是数值
2) 引用类型 == 引用类型
比较的是 引用变量所指向的地址
3) 基本类型 == 引用类型
即 基本类型变量和它的封装类型变量比较,封装类型会自动拆箱为基本类型后再进行比较,比较的是它们的数值
实例代码:
public class EqualDemo {
public static void main(String[] args) {
int x = 10;
int y = 10;
Integer i = new Integer(10);
Integer j = new Integer(10);
String s1 = "abc";
String s2 = "abc";
s2 = "efg";
String s3 = new String("abc");
String s4 = new String("abc");
// true 基本类型的变量的比较只能用 == , 比较的是值 它们不能 new
System.out.println(x==y);
// false 比较的是 i j 首地址的值,当然不一样
System.out.println(i==j);
// true 会对 j 进行拆箱操作,还原为 int, 这就是值的比较了
System.out.println(x==j);
// true s1 s2 都是存储在常量池中,如果 s1的值常量池中没有,就创建一个 "abc",如果有,s1就直接指向它,s2直接指向 s1 的 地址
System.out.println(s1==s2);
// false 首地址
System.out.println(s3==s4);
System.out.println(s1==s3); // false
System.out.println(s1); // abc
System.out.println(s2); // efg
}
}
1.2 equals
equals方法是基类 Object中的方法,其实现
public boolean equals(Object obj){
return (this == obj);
}
可以看到,源码中的 equals比较方法也是用 == 实现的,比较的是地址,如果指向的是同一个对象,为 true, 否则为 false
Java中大部分类都重写了 equals方法,直接拿来用,比较的就是内容,但是
自己自定义的类,如果没有重写 equals方法,比较的是地址,想要比较的是内容,需要自己重写equals方法或者继承的直接父类不是Object
Java String类的 默认 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;
}
自定类 实现 equals比较内容的方法
1 不重写 equals方法
public class Person {
private String name;
private Integer age;
public Person(String name,Integer age){
this.age = age;
this.name = name;
}
public static void main(String[] args) {
Person p1 = new Person("test",24);
Person p2 = new Person("test",24);
System.out.println(p1.equals(p2)); // false
}
}
2 重写 equals方法
public class Person1 {
private String name;
private Integer age;
public Person1(String name,Integer age){
this.age = age;
this.name = name;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public Integer getAge(){
return age;
}
public void setAge(Integer age){
this.age = age;
}
public boolean equals(Object o){
if(this == o) return true;
if(o == null || getClass() != o.getClass() ) return false;
Person1 person1 = (Person1) o;
if(name !=null ? !name.equals(person1.name):person1.name != null) return false;
return age != null ? age.equals(person1.age) : person1.age == null;
}
public static void main(String[] args) {
Person1 p1 = new Person1("li",18);
Person1 p2 = new Person1("li",18);
System.out.println(p1.equals(p2)); // true
}
}