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进去!!!!




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

相关文章推荐

Java中的equals和hashCode方法详解

Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法,今天就来介绍一些这两个方法的作用。 e...

两个对象值相同,有相同的hash code

两个对象值相同(x.equals(y) == true),则一定有相同的hash code。 这是java语言的定义:  因为:Hash,一般翻译做“散列”,也有直接音译为"哈...

Hashpmap的原理,HashMap怎样保证key的唯一性

1.    HashMap概述    HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒...

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

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

关于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
  • 3559

Java中String类hashCode()和equals()问题

Java中String类hashCode()和equals()问题         在网络上看到一个有趣的问题:能否定义两个字符串s1和s2对象,使得以下结论同时成立:1. s1.equals(s...

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

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

Java的HashCode,Equal和==

转自: 1:http://zhaoxudonglove.iteye.com/blog/257186 2:http://cangzhitao.com/java/equals-hashcode.htm...
  • xmulynn
  • xmulynn
  • 2012年11月13日 18:17
  • 2744

HashSet 中储存先判断对象的hash值 如果一样 在调用 对象equals方法判断是否是同一个对象

HashSet 添加元素,首先比较hash值 是否有相同hash,没有则添加成功,有则继续比较equals,如果不同则添加成功,否则不添加。 测试方法,使用一个Java Bean的perso...

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

hashCode 顾名思义是一个“散列值码” 散列值,并不能表现其唯一性,但是有离散性,其意义在于类似于进行hashMap等操作时,加快对象比较的速度,进而加快对象搜索的速度。 hashC...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA--HashCode 基础(判断对象是否相等)
举报原因:
原因补充:

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