hashcode HashMap Arrays HashMap线程安全问题 比较器

hashcode

1.存储键值对的数据 key value->在哈希表结构中
2.key获取hashcode()值一个int和整数,根据hash算法进行计算,算出桶的位置
hash算法:

  • hashcode()值 % 数组的长度
  • hashcode()值 & 数组的长度-1 ---->数组的长度必须为2的整数幂,通过左移右移来分别作出乘和除
    3.先判断对应桶中是否已经存在数据,判断桶中的数据是否与我当前的key相等,使用equals(),如果相等value覆盖,如果不相等,把数据放入链表的最后; 对应桶中是否已经存在数据那就直接放入桶中就行

注意:如果equals相等,hashcode一定要保证相等,保证相等的数据桶的位置一样,才会比较equals进行去重; hashcode相等,equals不一定相等,所以我才要放入桶的时候比较equals()

总结: 如果使用hashMap存储数据,key是自定义的引用的数据类型,一定要重写hashcode()和equals()方法

java8(java1.8):哈希表(数组+链表+红黑树):当桶中的数据超过8个,把结构当前链表结构变为红黑树
初始容量:16
加载因子:0.75 当16*0.75达到临界点12进行扩容,就是12(但是容量可以自定义)
扩容: 扩容位桶的大小

HashMap

自定义简单实现 HashMap

package Heiko0115;

public class MyHashMap {
   
	Node[] table;//位桶数组
	int size;//存储数据的个数
	public MyHashMap() {
   
		table=new Node[16];//默认初始容量为16  length为2的整数幂
	}
	//添加put功能
	public void put(Object key,Object value){
   
		int hash=myHash(key.hashCode(),table.length);
		Node newNode=new Node();//存储当前键值对的节点
		newNode.hash=hash;
		newNode.key=key;
		newNode.value=value;
		newNode.next=null;
		
		Node node=table[hash];//hash是刚刚根据key计算出来的桶的位置|数组的索引
		if(node==null){
   //现在桶中没有节点数据,我当前节点newNode就作为第一个
			table[hash]=newNode;
			size++;
		}else{
   
			while(true){
   //1.拿到链表头节点  如果node不等于null,就作为链表头节点存在
				if(node.key.equals(key)){
   //如果当前key与桶中的已有节点key相等,value覆盖
					node.value=value;
					break;
				}
				if(node.next==null){
   //判断当前是否就为最后一个节点
					node.next=newNode;
					size++;
					break;
				}
				//如果没有覆盖,继续从我这个节点找到我的下一个节点
				node=node.next;//node用于是当前要比较的桶中的数据节点
			}
		}
		
	}
/*	 * 根据key的hashcode()码计算hash值
	 * 返回值:桶的位置
	 * 参数1: key的hashcode()
	 * 参数2: 数组的长度
	 **/
	public int myHash(int hashCode, int length) {
   
		//System.out.println(keycode % length);
		//System.out.println(keycode & length-1);
		return hashCode &length-1;	
	}
	public static void main(String[
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值