JAVA--HashCode 基础(判断对象是否相等)

原创 2015年11月18日 13:35:47

HashCode基础

hashCode在JAVA中,代表了对象的一种特征。不同的对象哈希码是不同的。
哈希码是一种数据结构算法,在JAVA中,常见的哈希码算法获取到的哈希码具体值是怎么获取到的呢?
来分析一下:
1.在String类中的hashCode是根据String类中包含的字符串获取的,根据哈希算法获取到一个哈希码,那么只要我的字符内容是相等的,我的哈希码也是相同的。eg:
public static void main(String[] args) {
String a ="cx";
String b = "cx";
System.out.println(b.hashCode()==a.hashCode());
	}
结果我想大家已经猜到了,true!

2.Integer类中的hashCode和String是一样的,也是根据类中包含的值去生成的哈希码。两个相同大小的integer值,那么它的hashCode也是相等的。eg:
Integer a =11;
		Integer b = 11;
		System.out.println(b.hashCode()==a.hashCode());
结果还是true!

3.Object类中的hashCode则和之前的不一样了,他是根据对象的内存地址经过哈希算法之后获取到的哈希码,由于每个对象的内存地址不相同,所以hashCode是不同的。


我们常常会去用hashCode和equals去判断对象是否相等!

在Hashtable、HashMap、HashSet、LinkedHashMap中,我们去判断集合中是否有相同的对象,我们就要去重写对象的hashCode和equals来帮助我们获取到集合中相同的对象!
在上述的Hash运用的集合里面,执行操作时,都会自动执行对象的hashCode方法。去进行判断是否是同一个对象。

**如HashMap在put的时候key不能相同,那么在我添加对象到key的时候就会去调用hashcode和equals方法,去判断是否是同一个对象,如果不是那么就加入集合,是的话则不加入。
所以我们重写hashCode,可以return 一个对象的uuid.hashCode()这样去进行判断

HashSet也是如此,原理是相同的。
	Map<StaticTest, String> map = new HashMap<StaticTest, String>();
		StaticTest st = new StaticTest();
		st.setI(55);
		st.setName("cx");
		map.put(st, "OK");
		Set<StaticTest> set = map.keySet();
		StaticTest obj = new StaticTest();
		obj.setI(55);
		obj.setName("cx1");
		map.put(obj, "OK");
		for (StaticTest staticTest : set) {
			System.out.println(staticTest.getName());
		}
	}
重写的hashCode()和equals():
	@Override
	public int hashCode() {
		System.out.println("执行hashCode");
		return i.hashCode();
	}
	
	@Override
	public boolean equals(Object obj) {
		System.out.println("equals");
		if(this.getClass() == obj.getClass()){
			return i.equals(((StaticTest)obj).getI());
		}
		return false;
	}

最终输出的结果是cx,map里面就一个对象,就是我第一次添加的那个。第二次添加的由于i是相同的所以判断它们是同一个对象,就没有被Put进去!!!!




版权声明:本文为博主原创文章,未经博主允许不得转载。

HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)

1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。       数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度...
  • hxpjava1
  • hxpjava1
  • 2017年02月18日 20:01
  • 4855

Java常考面试题6 equals相同的对象对于的hashCode是否相等?

equals和hashcode的关系
  • HZ_LIZX
  • HZ_LIZX
  • 2017年02月09日 17:49
  • 2031

判断两个对象是否相等,为什么必须同时重写equals()和hashcode()方法

hashCode 顾名思义是一个“散列值码” 散列值,并不能表现其唯一性,但是有离散性,其意义在于类似于进行hashMap等操作时,加快对象比较的速度,进而加快对象搜索的速度。 hashC...
  • yangmeijing
  • yangmeijing
  • 2015年11月26日 10:40
  • 1435

Java中“equals比较为true,那么hashcode就一定相等”这条真理探秘!

从刚接触java时候在面试时就时常遇到面试官问这样的问题:equals相等那么hashcode相等吗?也一直没有怀疑过这个逻辑的正确性。直道上个月,公司一个技术主管居然说:equals相等hashco...
  • liujian19790518
  • liujian19790518
  • 2011年05月17日 14:57
  • 3206

equals相等而hashCode是否一定相等的分析

 原文地址:http://www.laozizhu.com/view.jsp?articleId=29答案是不一定。因为equals到底如何工作,完全取决于你的方法是如何写的。默认的集合的Hash实现...
  • java2000_net
  • java2000_net
  • 2009年01月11日 21:32
  • 2983

关于hashCode,你一定听说过会重复,那么你见过2个不同的字符串hashCode值却是相同的吗

java中String.hashCode()方法的算法如下:str.charAt(0) * 31n-1 + str.charAt(1) * 31n-2 + ... + str.charAt(n-1)...
  • hl_java
  • hl_java
  • 2017年05月09日 21:02
  • 5293

Java中为满足两对象根据类的属性值相等 从而对象equal hashcode相等,需要重写equal hashcde

在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。  目录: ...
  • u011921490
  • u011921490
  • 2015年07月10日 00:07
  • 1012

Java的Object.hashCode()的返回值到底是不是对象内存地址?

java的Object.hashCode()返回的到底是不是对象的内存地址?相信大家都曾对此问题有所怀疑,本文通过实验探究 和 ART(Android Runtime)、OpenJDK的源码分析为大家...
  • xusiwei1236
  • xusiwei1236
  • 2015年05月03日 13:25
  • 6522

解析Java对象的equals()和hashCode()的使用

解析Java对象的equals()和hashCode()的使用 前言 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多...
  • RichardSundusky
  • RichardSundusky
  • 2007年02月12日 07:58
  • 27970

Java语言中Object对象的hashCode()取值的底层算法是怎样实现的?,object hashcode

http://www.bkjia.com/ASPjc/919437.html  Java语言中,Object对象有个特殊的方法:hashcode(), hashcode()表示的是JVM虚拟...
  • bluetjs
  • bluetjs
  • 2016年09月21日 17:22
  • 3892
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA--HashCode 基础(判断对象是否相等)
举报原因:
原因补充:

(最多只允许输入30个字)