1.equals方法
publicboolean equals(Object obj) 表示某个对象是否与此对象相等
Object
类的equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值x
和 y
,当且仅当x
和 y
引用同一个对象时,此方法才返回true
(x == y
具有值true
)。
注意:当此方法被重写时,通常有必要重写hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
public class Person {
private String name;
private int age;
Person(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写Person类的equals方法,比较两个人的年龄
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(!(obj instanceof Person)){
return false;
}
Person p=(Person)obj;
return false;
}
}
2.equals和“==”的区别
Equals
只能比较两个引用数据类型的值
主要用于根据设计者的要求而被重写
==
既可以比较基本数据类型,也可以比较引用数据类型
当==两边是引用数据类型的时候,比较的是两个对象的地址值
不可以被重写
public class EqualsDemo {
public static void main(String[] args) {
String s1="hello";
String s2="hello";
String s3= new String("hello");
String s4= new String("hello");
//下面三个的结果都为true,因为String类重写了equals方法,根据字符串的内容来进行比较
System.out.println("s1 equals s2:"+s1.equals(s2));
System.out.println("s1 equals s3:"+s1.equals(s3));
System.out.println("s3 equals s4:"+s3.equals(s4));
//结果为true,因为s1和s2都指向了方法区内常量池的同一片内存,地址是一样的
System.out.println("s1==s2:"+(s1==s2));
//结果为false,因为s3和s4都在堆内存中创建了对象,分别指向了不同的地址
System.out.println("s3==s4:"+(s3==s4));
System.out.println("s1==s3:"+(s1==s3));
Integer i1 =127;
Integer i2 =127;
Integer i3 = new Integer(127);
Integer i4 = new Integer(127);
//下面结果都为true,这是因为Integer类重写了equals方法,只比较值的大小
System.out.println("i1 equals i2:"+i1.equals(i2));
System.out.println("i1 equals i3:"+i1.equals(i3));
System.out.println("i3 equals i4:"+i3.equals(i4));
//结果为true,JAVA将小于-128到127的数字存入常量池中,因此s1和s2指向同一片内存
System.out.println("1==i2:"+(i1==i2));
//结果为false,因为i3和i4都在堆内存中创建了对象,分别指向了不同的地址
System.out.println("i3==i4:"+(i3==i4));
System.out.println("i1==i3:"+(i1==i3));
}
}
上面用String类和Integer类,详细阐述了equals和==的不同
3.hashCode方法
public inthashCode()返回该对象的哈希码值。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
如果根据equals(java.lang.Object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
4.toString方法
返回该对象的字符串表示。
getClass().getName() + '@' + Integer.toHexString(hashCode())
如果没有重写toString方法,则返回该对象的地址值
程序设计者可以根据需要来编写toString方法
//重写Person类中的toString方法,将返回该对象的姓名 和年龄
public String toString(){
return this.name+"....."+this.age;
}
学习感悟:hashCode值是根据内存地址算出来的哈希值,并不是对象实际存放的地址值。equals方法和hashCode方法对于学习集合很重要。