==和equals
一、equals
基本类型没有equals方法,但是可以通过包装类,发生装箱操作,使基本类型变为引用类型,这样的话比较的是值是否相同
找到Integer 比较时的源码 发现他们比较的是值是否相同,没有比较地址值。
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
引用类型比较的是两者的地址值
public String name="abc";
public static void main(String[] args) {
Test test=new Test();
Test testB=new Test();
System.out.println(test.equals(testB));//比较地址值 false
System.out.println(test.name.equals(testB.name));//对于String类型,还要比较内容是否相等 true
}
下面我们来看看equals的源码
public boolean equals(Object anObject) {
*[HTML]://先用==比较二者的地址值是否相等,相等的话直接返回true。
if (this == anObject) {
return true;
}
*[HTML]:地址值不相等继续执行下面的代码
*[HTML]:比较的值是否是String类型,如果不是String类型直接返回false,即地址值不相等且不是String类型返回false
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
*[HTML]://比较长度,长度相等继续执行,不相等直接false
if (n == anotherString.value.length) {
*[HTML]://将两个字符串拆成字符一个一个比较
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
*[HTML]://如果有不相同的字符,返回false
if (v1[i] != v2[i])
return false;
i++;
}
*[HTML]://字符串长度,内容都相等了
return true;
}
}
return false;
}
二、==
对于基本类型==是比较的两者的值是否相等,对于引用类型比较的是二者的地址值是否相等。
1. 基于基本类型的比较
public static void main(String[] args) {
int i=10;
int j=20;
System.out.println(i==j);//false
int x=20;
Integer y=new Integer(20);
System.out.println(x==y);//true
}
因为i,j,x,y都是基本类型比较的就是值是否相同,与地址值无关,所以即使第二次地址值不同但是还是打印true。
2.基于引用类型的比较
String i="abc";
String j=new String("abc");
System.out.println(i==j);//false
对于引用类型,==比较的是他们的地址值。
三、==和equals区别
==对于基本类型比较二者的值,对于引用类型比较的地址值。
equals对于包装类 比较的是值是否相同,equals对于引用类型比较的是地址值是否相同,但是对于String类型是偏爱,如果地址值不相同还会比较内容是否相同。
注意基本类型和包装类型比较时候会发生自动拆箱操作,会变成基本类型比较。
四、重写equals方法
假如现在定义一个学生类,创造了很多学生对象,现在根据地址值判断,若对象地址值相等,那么对象的实例数据一定是相等的,但是现在我们规定,当学生类中其他属性是相同的时候,,也认为学生对象是相同的,这时候我们就需要根据自己的需求来重写equals方法了
根据自己的需求 年龄 性别 名字相同 但是地址不相同也认为是相同的学生对象
public static void main(String[] args) {
Student s1=new Student();
s1.setAge(18);
s1.setName("YY");
s1.setSex("nv");
Student s2=new Student();
s2.setAge(18);
s2.setName("YY");
s2.setSex("nv");
//System.out.println(s1.equals(s2));//调用Object的equals 地址值不相同 false
System.out.println(s1.equals(s2));//调用自己的equals方法 根据自己的需求 返回true
}
}
class Student{
private String name;
private String sex;
private int age;
//重写equals方法
@Override
public boolean equals(Object obj) {
//判断是否是学生类
if (!(obj instanceof Student)) {
return false;
}
Student stu=(Student)obj;
//判断地址值是否相同
if(this==obj){
return true;
}
if(stu.name.equals(this.name)&&stu.sex.equals(this.sex)&&stu.age==this.age) {
return true;
}else {
return false;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}