- 区别
"equals" 和"=="这两个实际上都是都是比较物理地址,前者是方法后者是运算符;在比较对象时两者的比较结果都是false,重写后equals可以用于比较值;在比较String时可以理解为:“==”:比较地址;“equals”:比较值。
2.比较对象时(object)
使用equals时涉及到hashcode码,所以需要对hashcode码做处理才能比较;Object类的hashcode返回的内存地址经过处理后的机构,由于每个对象的内存地址都不一样,所以hashcode码也不一样。
public class TextObject {
public static void main(String [] args){
Student stu1= new Student ("张三" ,20,10001);
Student stu2= new Student ("张三" ,20,10001);
//对象地址
System.out.println(stu1);
System.out.println(stu2.toString());
//判断俩个是否相等 系统默认地址相等 我们改为某个主键相等
System.out.println(stu1.equals(stu2));//true
System.out.println(stu1==stu2);//永远 false
}
}
class Student{
public String name;
public int age;
public int id;
public Student(){
}
public Student(String name,int age,int id){
this.name = name;
this.age = age;
this.id = id;
}
//重写Object
public String toString() {
//return getClass().getName() + "@" + Integer.toHexString(hashCode());
return "姓名:"+this.name+"年龄:"+this.age +"学号:"+this.id;
}
//重写 equals
public boolean equals(Object obj){
if(this ==obj){
return true;
}else{
if(obj instanceof Student){
Student stu = (Student)obj;
if(this.name.equals(stu.name)&&this.age==stu.age&&this.id==stu.id){
return true;
}
}else{
return false;
}
}
return false;
}
public int hashCode(){
return 0;
}
}
3、比较字符串(string)
String类的hashcode根据String类的包含的字符串的内容,根据一种特殊的算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码就相同。
public class Compare {
public static void main(String[] args){
String str1 = "aa";
String str2 = "bb";
String str3 = "aa";
System.out.println(str1.hashCode());//3104
System.out.println(str2.hashCode());//3136
System.out.println(str3.hashCode());//3104
System.out.println(str1==str2);//false 地址不同,值不同
System.out.println(str1==str3);//true 地址相同(没有出现new关键字,内容又相同的,变量指向同一个值)
System.out.println(str1.equals(str2));//false 值不同
System.out.println(str1.equals(str3));//true 值相同
}
}