作者:木维韵_538 | 来源:互联网 | 2023-06-04 18:37
Javahashmap原理-Javahashmap原理线性表:存储在连续的内存地址,查询快,插入和删除慢。链式表:存储在间断的,大小不固定,插入和删除快,但是查询的速度慢。h
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 以的形式
3.put()增加元素