HashCode和hashMap hashTable

本文详细解析了Java中的哈希码概念及其在HashMap中的应用,包括哈希码的产生依据、常用算法以及如何正确重写equals和hashCode方法以确保HashMap能正确获取对应值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看看Java中的HashCode 

在Java中,哈希码代表对象的特征。

  例如对象 String str1 = “aa”, str1.hashCode= 3104
  String str2 = “bb”, str2.hashCode= 3106
  String str3 = “aa”, str3.hashCode= 3104
  根据HashCode由此可得出str1!=str2,str1==str3
  哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
  下面给出几个常用的哈希码的算法。
  1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
  2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。

  3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样更多资料请参考这里

类 HashMap<K,V>

java.lang.Object
  java.util.AbstractMap<K,V>
      java.util.HashMap<K,V>
类型参数:
K - 此映射所维护的键的类型
V - 所映射值的类型

基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

HashCode和HashMap之间的关系

先如下代码:

import java.util.HashMap;
public class Test {

	//重写Equals不重写HashCode
	static class Key {
		private Integer id;
		private String value;
		
		public Key(Integer id, String value) {
			super();
			this.id = id;
			this.value = value;
		}
		@Override
		public boolean equals(Object o) {
			if(o == null || !(o instanceof Key)) {
				return false;
			}else {
				return this.id.equals(((Key)o).id);
			}
		}
	}
	//重写Equals也重写HashCode
		static class Key_ {
			private Integer id;
			private String value;
			
			public Key_(Integer id, String value) {
				super();
				this.id = id;
				this.value = value;
			}
			@Override
			public boolean equals(Object o) {
				if(o == null || !(o instanceof Key_)) {
					return false;
				}else {
					return this.id.equals(((Key_)o).id);
				}
			}
			@Override
			public int hashCode() {
				 return id.hashCode();
			}
			 
		}
	public static void main(String[] args) {
		//test hashcode
		HashMap<Object, String> values = new HashMap<Object, String>(5);
		Test.Key key1 =   new Test.Key(1, "one");
		Test.Key key2 =   new Test.Key(1, "one");
		System.out.println(key1.equals(key2));
		values.put(key1, "value 1");
		System.out.println(values.get(key2));
		
		Test.Key_ key_1 =   new Test.Key_(1, "one");
		Test.Key_ key_2 =   new Test.Key_(1, "one");
		System.out.println(key_1.equals(key_2));
		System.out.println(key_1 == key_2);
		values.put(key_1, "value 1");
		System.out.println(values.get(key_2));
	}
}
输出如下: 由上述例子可见: 只重写了equasl方法的Key类 在用做Hash中的键值的时候 两个equasl为true的对象不能获取相应 的Value的 而重写了hashCode方法和equals方法的key_类 两个相等的对象 可以获取同一个Value的,这样更符合生活中 的逻辑 HashMap对象是根据Key的hashCode来获取对应的Vlaue 因而两个HashCode相同的对象可以获取同一个Value

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值