黑马程序员------- "==",equals和hashcode

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

  在java中,可以通过==和equals()来比较变量和对象是否相同,那么他们都哪些区别呢
  首先是变量

	int x = 1;
	int y = 1;
	System.out.println(x==y);   //返回true
	System.out.println(x.equals(y)); //编译无法通过

  打开java源码查看equals()方法发现,只有两边都是一个Object的实例才可以进行比较,所以八种基础类型只能通过"=="来比较,转换成对应的包装类型后就可以进行比较。示例:

	Integer x = new Integer(1);
	Integer y = 1;
	Integer z = 1;
	System.out.println(x.hashCode());	//返回值为1
	System.out.println(y.hashCode()); //返回值为1
	System.out.println(x==y);      	  //他们引用的不是一个对象,返回false
	System.out.println(x.equals(y));	//hash值相同,返回true
	System.out.println(z==y);					//指向同一内存地址,返回true			

  尽管三个Integer实例都是1,但是x并非直接引用,而是new了一个新实例,所以使用"=="为false,那么为什么equals()返回true呢?查看Integer源码发现Integer的equals是通过转换成int再"=="的方法。

 

public boolean equals(Object obj) {
      if (obj instanceof Integer) {
          return value == ((Integer)obj).intValue();
      }
      return false;
  }	


再重新给他们赋值,发现了有趣的现象

	int x = 200;
	int y = 200;
	Integer i=200; 
	Integer j=200; 
	System.out.println(x==y);           //true
	System.out.println(i==j);	          //false    
  System.out.println(i.equals(j));    //true	 

    i和j虽然都是200,但他们的200却是不同的对象,因为Integer 对-128~127做了类似缓存的处理,这个范围内的值可以认为都是从一个池里面取出来的。不在这个范围的可以认为他new了一个新的对象,地址不同。
  
  "=="是通过内存中地址判断是否相等,就联想到hashCode()。
  hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。因此,两个同类对象相等,他们的hashCode肯定是相同。但是hashCode相同,却不一定是相同的对象。我们在给一个类定义equals方法时,很有必要重写他的hashCode方法。
  在hashSet和hashMap中,则一定要重写hashCode方法,不然会出现元素重复。

	class Demo{
		private int x;
		Demo(int x){
			this.x = x ;
		}
		public static void main (String []args) {
			Demo d1 = new Demo(3);
			Demo d2 = new Demo(3);
			System.out.println(d1.hashCode());
			System.out.println(d2.hashCode());
		}
	}

  "=="则是对比两个变量或者对象的引用是否相同。
  equals()是java.lang.Object类的方法,在Object中,equals()直接调用了"==",返回true或false。子类可以通过重写来重新定义比较方法,通过字符数字等其余数学判断是否相同。
  hashCode()和equals虽然没有必然的关系,但是他们在判断对象是否相同,可以互相参考。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值