Java hashmap原理

Java hashmap原理

Java hashmap原理

线性表:存储在连续的内存地址,查询快,插入和删除慢。
链式表:存储在间断的,大小不固定,插入和删除快,但是查询的速度慢。
hashmap是以上两种者折中的解决方案,插入或者删除只需要动一部分即可。
这里写图片描述

单个结点的属性有:

  • hash:用于快速定位;
  • key:标识符
  • Value:存储的数值
  • next:引用地址,便于插入、删除操作

注:a7的链式表 成为hash桶

通过hash查询的流程:

  • 1.先判断key是否为空
  • 2.在不为空的情况下,通过hash定位

hashmap的常用方法:
存值: map.put(key,value)
读值: map.get(key)
判断是否为空:map.isEmpty()
判断是否含有key:map.containsKey(key)
判断是否含有value:map.containsValue(value)
删除key值下的value:map.remove(key) //只删除了Value
显示所有value值:map.values()
元素的个数:map.size()
显示所有key:map.keySet()
显示所有key和value:map.entrySet()
合并2个类型相同的map:map.putAll(map1)
删除这个key和Value:map.remove(key,value)
替换key下的value:map.replace(key,newValue)
清洗整个map:map.clear()
map的克隆:map.clone()

Hash线程安全:
1.多线程对相同key进行put操作
2.多线程同时对Node数组进行扩容,导致数据丢失
线程安全,避免多线程对共享数据进行操作时,产生的脏读、误读。

三种线程安全的方法:
a.hashtable 通过关键字synchroized标记临界区来实现
b.ConcurrentHashMap jdk1.8引入CAS算法 它的性能最好
c.SyschroniedMap 通过类间接使用 syschroized

HashCode和equals方法
使用hashmap时需要同时重写 HashCode和equals方法。

  • 单一重写HashCode和equals都不能保证数据的唯一性。
  • Hashcode()的作用:将对象的内部地址转换成一个整数返回。(即获取hash桶的编号)
  • equals()的作用:只是比较2个对象之间的内容是否相同

重写时注意:
1. equals true ->hashcode返回的int要相同
2. equals false ->hashcode 返回的int一定不相同
3. hashcode int 相同 ->equals 可以是true 也可以是false
4. hashcode int 不同 ->equals一定要是false

比较 HashSet 和 HashMap

HashSet:
1.必须要重写hasdcode 和 equals 从而确保对象的唯一性
2.利用对象获取hashcode 元素以对象的形式
3.add()增加元素

HashMap:
1.必须要重写hashcode 和equals
2.利用key获取hashcode 以<key,value>的形式
3.put()增加元素

在这里插入图片描述

本文来源蹊源的奇思妙想,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/14734

发表评论