Object类中equals,hashCode和toString方法的学习

时间:2023-02-27 09:42:46

  1.equals方法

    publicboolean equals(Object obj) 表示某个对象是否与此对象相等

    Object 类的equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值xy,当且仅当x 和 y 引用同一个对象时,此方法才返回truex == 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方法对于学习集合很重要。