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

  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 int hashCode()返回该对象的哈希码值。

      如果根据 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方法对于学习集合很重要。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值