Java HashMap的实现

java手动实现hashmap package com.haixintext.java; //哈希节点 public class HashMapNode { int hash; Object key; Object value; HashMapNode next; } package com.haixintext.java; //hashmap方法 public class HashMap... 阅读详情

HashMap是Java中经常使用的集合类。HashMap的每个元素是一个<Key,Value>键值对,在内部用数组来保存每个元素,hash函数将Key作为参数,计算出Value的存储位置,即数组的下标。实现HashMap,关键在于找到一个hash函数,使其尽量少的发生冲突。那么,何为冲突?如下图所示,


当值“F"插入HashMap集合时,发现他所对应的位置已有数据插入,此时便发生了冲突。解决冲突的办法这里列举三种:linear probing, double hashing, 和chaining。


linear probing方法

linear probing解决冲突的方式是:当冲突发生,后来的数据依次往后寻找空闲位置,一旦找到,便插入。如下图所示:



当值"F"插入时,因为原有位置已被"D"占领,则依次往后查找,在值"C"之后发现空闲位置并插入。查找到数组的尾部时,返回到头部继续查找,如下图所示:


如果查找到本应输入的位置,依旧没有可插入的位置,说明hashmap存满,如下图所示:


类HashMapNode表示HashMap中的每个元素,它主要有两个成员:Key和Value。实现如下:

public class HashMapNode {
	private Object key;
	private Object value;
	// construction
	public HashMapNode(Object key, Object value){
		this.key = key;
		this.value = value;
	}
	// get methods
	public Object getKey(){
		return key;
	}
	public Object getValue(){
		return value;
	}
	// set method
	public void setValue(Object newValue){
		this.value = newValue;
	}
}


类HashMap是采用linear probing方式的hashmap实现,具体如下:

import java.util.ArrayList;
import java.util.List;

public class HashMap<K, V> {
  private int multiplier;
  private int modulus;
  private int hashMapSize;//HashMap容量
  private HashMapNode[] array;
  private int size = 0;//HashMap现有元素个数

  
  // construction
  // construct a HashMap with 4000 places and given hash paarameters
  public HashMap(int multiplier, int modulus){
    this.multiplier = multiplier;
    this.modulus = modulus;
    this.hashMapSize = 4000;
    this.array = new HashMapNode[this.hashMapSize];
  }
  
   // construct a HashMap with given capacity and given hash parameters
  public HashMap(int hashMapSize, int multiplier, int modulus){
    this.multiplier = multiplier;
    this.modulus = modulus;
    this.hashMapSize = hashMapSize;
    this.array = new HashMapNode[this.hashMapSize];
  }
 
  // hashing
  public int hash(K key){
    return Math.abs(multiplier * key.hashCode()) % modulus % this.hashMapSize;
  }
  
  // size
  public int size(){
    return size;
  }
  
  // return the number of nodes currently stored in the map
  public boolean isEmpty(){
    return size == 0;
  }
  
  // interface methods
  @SuppressWarnings("unchecked")
  public List<K> keys(){
    List<K> list = new ArrayList<K>();
    for(int i = 0; i < this.hashMapSize; i++){
      if(array[i] != null){
        list.add((K)array[i].getKey());
      }
    }
    return list;
  }
  
  @SuppressWarnings("unchecked")
  public V put(K key, V value){
    int hashCode = hash(key);//hashCode是value本应存放的位置
    if(array[hashCode] == null){//该位置是空的,则直接放入,不需要处理冲突
      HashMapNode node = new HashMapNode(key,value);
      array[hashCode] = node;
      size++;
      return null;
    }else if(key.equals((K)array[hashCode].getKey())){//该主键已存在,则更新对应的值
      V oldValue = (V)array[hashCode].getValue();
      array[hashCode].setValue(value);
      return oldValue;
    }
    int probe = (hashCode + 1) % this.hashMapSize;//开始处理冲突
    while(probe != hashCode){
      if(array[probe] == null){//找到空闲位置
        HashMapNode node = new HashMapNode(key,value);
        array[probe] = node;
        size++;
        return null;
      }else if(key.equals((K)array[probe].getKey())){//该主键已存在,则更新对应的值
        V oldValue = (V)array[probe].getValue();
        array[probe].setValue(value);
        return oldValue;
      }else{
        probe = (probe + 1) % this.hashMapSize;
      }
    }
    return null;
  }

  @SuppressWarnings("unchecked")
  public V get(K key){
    int hashCode = hash(key);
    if(array[hashCode] != null && key.equals((K)array[hashCode].getKey())){
      return (V)array[hashCode].getValue();
    }
    int probe = (hashCode + 1) % this.hashMapSize;
    while(probe != hashCode){//依次往后查找,直到回到原点
      if(array[probe] == null){
        probe = (probe + 1) % this.hashMapSize;
        continue;
      }else if(key.equals((K)array[probe].getKey())){
        return (V)array[probe].getValue();
      }else{
        probe = (probe + 1) % this.hashMapSize;
      }
    }
    return null;
  }

  @SuppressWarnings("unchecked")
  public V remove(K key){
    int hashCode = hash(key);
    if(array[hashCode] != null && key.equals((K)array[hashCode].getKey())){
        V oldValue = (V)array[hashCode].getValue();
        array[hashCode] = null;//该位置设置为null,表示被删除
        size--;
        return oldValue;
    }
    int probe = (hashCode + 1) % this.hashMapSize;
    while(probe != hashCode){
      if(array[probe] == null){
        probe = (probe + 1) % this.hashMapSize;
        continue;
      }else if(key.equals((K)array[probe].getKey())){
        V oldValue = (V)array[probe].getValue();
        array[probe] = null;
        size--;
        return oldValue;
      }else{
        probe = (probe + 1) % this.hashMapSize;
      }
    }
    return null;
  }
}

double hashing 方法

double hashing方法,思想是当发生冲突时,结合第二个hash函数,新生成一个hashCode,直到不发生冲突为止。此处使用的第二个hash函数如下:secondaryModulus   (abs(hashCode(key)) mod secondaryModulus),计算元素下标值的方法如下:hash(key) + j * secondary(key)。j从0开始逐渐递增,直到不冲突为止。具体实现如下:

import java.util.ArrayList;
import java.util.List;

public class DoubleHashMap<K, V> {
	private int multiplier;
	private int modulus;
	private int secondaryModulus;
	private int hashMapSize;
	private HashMapNode[] array;
	private int size = 0;
	
	// construction
	// construct a HashMap with 4000 places and given hash paarameters
	public DoubleHashMap(int multiplier, int modulus, int secondaryModulus){
		this.multiplier = multiplier;
		this.modulus = modulus;
		this.secondaryModulus = secondaryModulus;
		this.hashMapSize = 4000;
		this.array = new HashMapNode[this.hashMapSize];
	}
	
	// construct a HashMap with given capacity and given hash parameters
	public DoubleHashMap(int hashMapSize, int multiplier, int modulus, int secondaryModulus){
		this.multiplier = multiplier;
		this.modulus = modulus;
		this.secondaryModulus = secondaryModulus;
		this.hashMapSize = hashMapSize;
		this.array = new HashMapNode[this.hashMapSize];
	}
	
	// hashing
	public int hash(K key){
		return Math.abs(multiplier * key.hashCode()) % modulus;
	}
	
	public int secondaryHash(K key){
		return this.secondaryModulus - Math.abs(key.hashCode()) % this.secondaryModulus;
	}
	
	// size
	public int size(){
		return size;
	}
	// return the number of nodes currently stored in the map
	public boolean isEmpty(){
		return size == 0;
	}
	
	// interface methods
	@SuppressWarnings("unchecked")
	public List<K> keys(){
		List<K> list = new ArrayList<K>();
		for(int i = 0; i < this.hashMapSize; i++){
			if(array[i] != null){
				list.add((K)array[i].getKey());
			}
		}
		return list;
	}
	
	@SuppressWarnings("unchecked")
	public V put(K key, V value){
		int hashCode = hash(key);//calculating the hash code
		if(array[hashCode % this.hashMapSize] == null){//if the hash item is empty, add the data straight away
			HashMapNode node = new HashMapNode(key,value);
			array[hashCode % this.hashMapSize] = node;
			size++;
			return null;
		}else if(key.equals((K)array[hashCode % this.hashMapSize].getKey())){
			V oldValue = (V)array[hashCode % this.hashMapSize].getValue();
			array[hashCode % this.hashMapSize].setValue(value);
			return oldValue;
		}

		int secondHashCode = secondaryHash(key);
		int probe = 0;//variable to store probing location
		int j = 0;
		V retValue = null;
		while(true){
			j++;
			probe = (hashCode + j * secondHashCode) % this.hashMapSize;
			if(array[probe] == null){
				HashMapNode node = new HashMapNode(key,value);
				array[probe] = node;
				size++;
				break;
			}else if(key.equals((K)array[probe].getKey())){
				retValue = (V)array[probe].getValue();
				array[probe].setValue(value);
				break;
			}
		}
		return retValue;
	}

	@SuppressWarnings("unchecked")
	public V get(K key){
		int hashCode = hash(key) % this.hashMapSize;
		if(array[hashCode] != null && key.equals((K)array[hashCode].getKey())){
			return (V)array[hashCode].getValue();
		}
		int probe = (hashCode + 1) % this.hashMapSize;
		while(probe != hashCode){
			if(array[probe] == null){
				probe = (probe + 1) % this.hashMapSize;
				continue;
			}else if(key.equals((K)array[probe].getKey())){
				return (V)array[probe].getValue();
			}else{
				probe = (probe + 1) % this.hashMapSize;
			}
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public V remove(K key){
		int hashCode = hash(key) % this.hashMapSize;
		if(array[hashCode] != null && key.equals((K)array[hashCode].getKey())){
				V oldValue = (V)array[hashCode].getValue();
				array[hashCode] = null;
				size--;
				return oldValue;
		}
		int probe = (hashCode + 1) % this.hashMapSize;
		while(probe != hashCode){
			if(array[probe] == null){
				probe = (probe + 1) % this.hashMapSize;
				continue;
			}else if(key.equals((K)array[probe].getKey())){
				V oldValue = (V)array[probe].getValue();
				array[probe] = null;
				size--;
				return oldValue;
			}else{
				probe = (probe + 1) % this.hashMapSize;
			}
		}
		return null;
	}
	
}

chaining 方法

chaining方法的核心思想是,当发生冲突时,将冲突的元素用链表的形式连接起来,如下图所示:


ChainingHashMap类表示每个元素,具体实现如下:

public class ChainingHashMapNode {
	private Object key;
	private Object value;
	private ChainingHashMapNode next;
	// construction
	public ChainingHashMapNode(Object key, Object value){
		this.key = key;
		this.value = value;
		this.next = null;
	}
	// get methods
	public Object getKey(){
		return key;
	}
	public Object getValue(){
		return value;
	}
	public ChainingHashMapNode getNext(){
		return next;
	}
	// set methods
	public void setValue(Object newValue){
		this.value = newValue;
	}
	public void setNext(ChainingHashMapNode next){
		this.next = next;
	}
}


使用chaining方法的HashMap实现如下:

import java.util.ArrayList;
import java.util.List;

public class ChainingHashMap<K, V> {
	private int multiplier;
	private int modulus;
	private ChainingHashMapNode[] array;
	private int hashMapSize;
	private int size;
	
	// construction
	// construct a HashMap with 4000 places and given hash parameters
	public ChainingHashMap(int multiplier, int modulus){
		this.multiplier = multiplier;
		this.modulus = modulus;
		this.hashMapSize = 4000;
		this.array = new ChainingHashMapNode[this.hashMapSize];
		this.size = 0;
	}

	// construct a HashMap with given capacity and given hash parameters
	// hashing
	public ChainingHashMap(int hashMapSize, int multiplier, int modulus){
		this.multiplier = multiplier;
		this.modulus = modulus;
		this.hashMapSize = hashMapSize;
		this.array = new ChainingHashMapNode[this.hashMapSize];
		this.size = 0;
	}

	public int hash(K key){
		return Math.abs(multiplier * key.hashCode()) % modulus  % this.hashMapSize;
	}
	// size
	public int size(){
		return size;
	}
	// return the number of nodes currently stored in the map
	public boolean isEmpty(){
		return size == 0;
	}
	// interface
	
	
	@SuppressWarnings("unchecked")
	public List<K> keys(){
		List<K> list = new ArrayList<K>();
		for(int i = 0; i < this.hashMapSize; i++){
			ChainingHashMapNode node = array[i];
			while(node != null){
				list.add((K)node.getKey());
				node = node.getNext();
			}
		}
		return list;
	}
	
	@SuppressWarnings("unchecked")
	public V put(K key, V value){
		int hashCode = hash(key);
		if(array[hashCode] == null){//没有发生冲突,放入首位
			ChainingHashMapNode node = new ChainingHashMapNode(key,value);
			array[hashCode] = node;
			size++;
			return null;
		}
		ChainingHashMapNode node = array[hashCode];
		ChainingHashMapNode pre = node;
		while(node != null){
			if(key.equals((K)node.getKey())){//已存在Key,更新值
				V oldValue = (V)node.getValue();
				node.setValue(value);
				return oldValue;
			}else{
				pre = node;
				node = node.getNext();
			}
		}
		ChainingHashMapNode newNode = new ChainingHashMapNode(key,value); //在链表末尾添加冲突的元素
		pre.setNext(newNode);
		size++;
		return null;
	}

	@SuppressWarnings("unchecked")
	public V get(K key){
		int hashCode = hash(key);
		ChainingHashMapNode node = array[hashCode];
		while(node != null){
			if(key.equals((K)node.getKey())){
				return (V)node.getValue();
			}else{
				node = node.getNext();
			}
		}
		return null;
	}
	@SuppressWarnings("unchecked")
	public V remove(K key){
		int hashCode = hash(key);
		ChainingHashMapNode node = array[hashCode];
		if(node != null && key.equals((K)node.getKey())){
			array[hashCode] = node.getNext();
			size--;
			return (V)node.getValue();
		}
		ChainingHashMapNode pre = node;
		node = node.getNext();
		while(node != null){
			if(key.equals((K)node.getKey())){
				pre.setNext(node.getNext());
				size--;
				return (V)node.getValue();
			}else{
				pre = node;
				node = node.getNext();
			}
		}
		return null;
	}
}

参考: http://www.cs.rmit.edu.au/online/blackboard/chapter/05/documents/contribute/chapter/05/linear-probing.html

Java手写实现HashMap 我们将创建一个名为HashMap的类,其中包含一个构造函数,用于初始化哈希表。首先,我们定义一个数组bucket,用来存储桶的信息。在构造函数中,我们可以指定哈希表的大小,例如size。然后,我们初始化bucket数组,并将每个桶都初始化为一个空链表。这样,我们就完成了哈希表的初始化。i < size;i++) {通过本篇博客,我们了解了如何用 Java 手写一个简单的 HashMap。 阅读详情

相关推荐

Modbus4J vs EasyModbus4J:哪个Java库更适合你的工业项目?

本文深入对比了Java领域两大Modbus通信库Modbus4J与EasyModbus4J。Modbus4J设计稳健、类型安全,适合复杂业务集成;EasyModbus4J基于Netty,在高并发场景下性能更优。文章从架构、性能、API及生产环境多维度分析,为工业物联网项目选型提供决策依据。

weixin_28475533的博客 310

【Linear Probing | 线性探测】深度学习 线性层

深度学习linear probing

欢迎来到我的博客~ 1万+

算法-基于MACD的Adaboost股价涨跌预测模型

MACD是一个指标,具体用法是MACD>0看涨,反之看跌,果真是这样的吗?由于所有的技术指标都基于对历史数据的统计,指标的滞后性也就难免,有时候MACD明明大于0,股价仍然跌,有时候macd小于0,股价仍然涨。 本文基于Adaboost算法提出了一种基于macd的线性阀值分类器作为若分类器,通过在限定的解空间内寻找使得错误率最小的阀值和偏置,这样做避免了训练若分类器的复杂性,经验证,这种方法有效。

mtaxot的博客 8023

深度学习笔记:finetune和linear probing的区别

finetune和linear probing一般和预训练搭配出现,是预训练模型适配下游任务时可选的训练方式

weixin_48018951的博客 7448

斗罗大陆叙事体系与战斗系统设计解析

在文学创作与游戏设计中,世界观构建和战斗系统设计是两大核心技术要素。世界观作为故事发生的背景框架,需要融合东西方文化元素并建立量化标准,如《斗罗大陆》中武魂觉醒与魂环等级体系。战斗系统则需突破简单数值对抗,发展出武魂特性、魂技组合与环境互动的三维体系,其中魂导器技术的引入展现了科技与魔法的创新融合。这些设计原理在RPG游戏开发、网络文学创作等领域具有广泛应用价值,特别是对需要长期运营的IP作品,完善的系统设定能有效支撑剧情延展与商业化开发。本文以现象级作品为例,剖析其武魂拟态理论和魂师工业化构思如何成就经典

weixin_29291069的博客 250

电蚊拍为什么能秒杀蚊子?深入解析两种四倍压整流电路设计差异

本文深入解析电蚊拍秒杀蚊子的核心原理——四倍压整流电路设计,对比对称式与级联式两种方案的性能差异。通过详细电路分析、实测数据对比和选型建议,揭示高压电路设计的关键技术要点,为电子爱好者和工程师提供实用参考。

rust6ferris的博客 750

“不可能学不会的”--视觉大模型的迁移方法(Linear Probing、Finetune、Adapter、Prompt)

当需要快速评估预训练模型表征能力时,可以选择Linear probing;当目标任务与预训练任务相似且数据集较大时,可以选择Finetune;当需要参数高效且任务独立的迁移学习方法时,可以选择Adapter;而当希望避免微调模型参数且任务灵活性要求较高时,可以选择Prompt。

2301_77897903的博客 3323

某物data魔改与变种算法还原(含加解密Py纯算)

某物data加解密、设备指纹魔改、变异、自定义加密分析与纯算还原

吴秋霖的博客 1281

Linear probing accuracy(线性探测精度)是什么?评价表征学习的质量的方式

Linear probing accuracy 的关键在于它提供了一个简单而直接的方式来评估模型学习到的特征的质量。如果一个自监督学习模型能够学习到有用的、丰富的特征表示,那么即使是一个简单的线性分类器也能在这些特征上取得良好的分类性能。在这种方法中,使用一个简单的线性分类器(通常是一个线性层或者一个全连接层)来测试模型学习到的特征的质量。:然后,在提取的特征上训练一个简单的线性分类器。:最后,评估这个线性分类器在一个标记的测试集上的性能,通常是准确率(accuracy)。

Drug discovery 2759

第3.4章 机器人第三方库实战总结(四):G2O优化库从入门到实战(附SLAM实例代码)

自定义边同样是满足复杂应用需求的重要手段。自定义边时,需要明确边所连接的顶点类型以及边所表示的误差项的计算方式。假设我们要定义一条边,用于约束两个上述自定义顶点之间的相对位姿和传感器偏移量关系。我们可以这样定义边类:public:// 计算误差// 计算雅可比矩阵// 读盘和存盘函数,这里暂不实现。

行知SLAM 358

YOLOv5源码逐行超详细注释与解读(2)——推理部分detect.py

全网最详细的YOLOv5之推理部分detect.py源码逐行注释,近四万字的超详细讲解!小白入门必看!

路人贾的博客 5万+

CVPR 2023 | iTPNs: 谁说 Linear probing 不适用 MIM 任务?

掩码图像重建是一种利用图像掩码去执行计算机视觉任务的技术。相比于基于对比学习等方法,基于 MIM 的方法能提供更有竞争力的结果。说到这,那就让我们先简单回顾下对比学习的知识吧。本文提出了一个用于预训练 HiViT 的完整框架,其核心贡献在于利用特征金字塔统一重建和识别任务,从而最大限度地减少预训练和微调任务之间的迁移差距。此外,为了更好的优化特征金字塔,本文提出了一种掩码特征建模任务,旨在补充掩码图像建模能力。最后,预训练的 iTPN 在一些主流的视觉识别任务中报告了卓越的识别能力。

专注计算机视觉全栈知识分享 663

《QGIS快速入门与应用基础》079:KML/KMZ格式:Google Earth兼容

KML/KMZ是专为地理可视化设计的空间数据格式,原生兼容Google Earth,支持点线面要素标注与多媒体集成。KML为XML文本格式,KMZ是其压缩版本。该格式优势在于可视化表现力强、跨平台共享便捷,适合地理标注、路线分享等场景,但存在属性支持弱、大数据量处理效率低等局限。QGIS中可便捷加载和导出KML/KMZ数据,需注意编码设为UTF-8、勾选"导出样式"以保留可视化效果。建议中小规模标注数据使用KMZ格式,确保关联资源完整,提升共享效率。

LuckyHanMo的博客 769

Java实现HashMap

HashMap是一种基于哈希表实现的键值对存储结构,具有快速查找的特点。本文介绍了HashMap的基本概念、数据结构(数组+链表)、工作原理(哈希函数与冲突处理)以及常用方法(put/get/remove)。重点分析了扩容机制resize()的实现过程,包括数组扩容、重新哈希等步骤。代码实现部分展示了自定义HashMap的核心逻辑,包括哈希计算、链表处理、扩容触发条件等关键功能。该实现支持null键值存储,并通过链表解决哈希冲突问题。

Vivian_0682的博客 1815

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java实现hashmap_Java的HashMap实现

java实现hashmapHashMap is a dictionary data structure provided by java. It’s a Map-based collection class that is used to store data in Key & Value pairs. In this article, we’ll be creating our own ...

weixin_26737625的博客 708

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java HashMap实现原理2——HashMap详解

博主的前两篇文章Java HashMap实现原理0——从hashCode,equals说起,Java HashMap实现原理1——散列表已经讲述了HashMap设计的知识点,包括:hashCode(),equals(),散列表结构,散列函数、冲突解决等,在散列表一文最后,还给出了一个极简版本的实现。从极简版出发,理解java.util.HashMap,就容易多了。 最近博主偶遇了几家公司的技术文章

Kerwin的学习历程 1574

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

HashMap之Java实现

HashMap是使用最频繁、最重要的数据结构之一,提供了字典操作功能,Insert、Search、Delete操作的效率都很高。本文将尝试用Java实现一个最简单的HashMap。因为简单,才容易看到HashMap的本真设计思想。 什么是Hash 依我的理解,Hash就是把一个对象转化为一个正整数的过程。相同的对象产生相同的Hash Code,但不同的对象的Hash Code具有随机的特点,不

永无止境,上下求索 1万+

Java中实现一个HashMap

在Java中,HashMap是一个常用的,它实现了Map接口,允许我们通过键值对的形式存储和快速查找数据。HashMap的底层是基于哈希表(hash table)的实现,它的高效性和灵活性使其在各种编程场景中广受欢迎。哈希表的实现通常通过数组加链表来实现(当链表的长度超过8时,将链表换为红黑树)hashmap以键值对(key,value)来存储数据,每个key都对应一个对应的value。

Ylxb_的博客 553

java中HashMap排序中实现Comparator接口

1、通过观察Collections.sort()源码,如下: public static void sort(List list, Comparator c) { Object[] a = list.toArray(); Arrays.sort(a, (Comparator)c); ListIterator i = list.listIterat

iCoding91 1833

Java中HashMap的实现原理详解

HashMap通过哈希函数链地址法和动态扩容哈希函数:扰动算法减少冲突。冲突解决:链表 + 红黑树平衡性能。扩容优化:翻倍容量,高位比特判断新索引。树化退化:根据元素数量动态调整数据结构。📌最佳实践:预估数据量设置初始容量(避免频繁扩容),重写hashCode()和equals()确保键对象正确性。

JMY_2016的博客 1359

Java中HashMap的实现原理

一、Java中的hashCode和equals 1、关于hashCode hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的 如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同 如果对象的equals方法被重写,那么对象的hash...

大仁哥、的博客 817

手动实现java常用的容器-hashmap

手动实现java常用的容器-hashmap (方法只是模拟java源码,效率没有底层源码高,纯属学习熟悉底层源码) 节点结构图 容器结构图 节点源码 package com.alan.alanhashmap; /** * author Mr.ALan * DESCRIPTION 一个自定义的hashmap节点对象 * create 2019/4/11 */ public cla...

LAN961205的博客 579

【Java集合类】HashMap实现原理

ConcurrentHashMap将哈希表分成多个段,每个段拥有一个独立的锁,这样可以在多个线程同时访问哈希表时,只需要锁住需要操作的那个段,而不是整个哈希表,从而提高了并发性能。简单点说,就是为了把高位的特征和低位的特征组合起来,降低哈希冲突的概率,也就是说,尽量做到任何一位的变化都能对最终得到的结果产生影响。,即将哈希表分成多个段,每个段拥有一个独立的锁。当上面的操作完结后,HashMap会检测两个链表的长度,当元素小于等于6的时候,就会执行取消树化的操作,否则就会将新生成的链表重新树化。

xueping_wu的博客 758

Java中HashMap底层实现原理

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

weixin_40387773的博客 739
上一篇: Java Iterable interface[Algorithm]
下一篇: Java垃圾回收
Hooting
博客等级 码龄17年 11粉丝 44原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值