目录
Map集合基本内容:
特点:
扩容:
遍历:
Map集合实现:
1.HashMap
基本原理:
Table数组中的的Node
2.HashTable
3.ConcurrentHashMap
4.TreeMap
5.LinkedHashMap
Map集合基本内容:
Map集合没有继承Collection接口,,Map中不能包含相同的key值,每个key只能影射一个相同的value.key值还决定了存储对象在映射中的存储位置.但不是key对象本身决定的,而是通过散列技术进行处理,可产生一个散列码的整数值,散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象在映射中的存储位置.Map集合包括Map接口以及Map接口所实现的类.
——————百度百科
特点:
- 键值对(key,value),键不能重复,值可以重复,每个键可以映射到最多一个值;
- 键重复则覆盖,没有继承Collection接口;
- 可以不同键指向同一Value;
- 支持用户自由绑定Key值与Value;
- 可以直接访问Key值获得对应Value
扩容:
初始容量16,负载因子0.75,扩容增量1倍
遍历:
首先建立一个Set集合并往里面放入Key和value
private Map map = new HashMap<>();
@Before
public void setup() {
map.put("1", "zs");
map.put("2", "ls");
map.put("3", "ww");
map.put("4", "zl");
}
方法一:先获取所有键的Set集合,在遍历(通过键获得值)
@Test
public void demo2() {
Iterator it = map.keySet().iterator();
while(it.hasNext()) {
String key = it.next();
System.out.println(map.get(key));
}
}
方法二:取出保存所有Entry的Set,再遍历此Set即可
@Test
public void demo9() {
Iterator> it = map.entrySet().iterator();
while(it.hasNext()) {
Entry entry = it.next();
System.out.println(entry.getKey() + ": " + entry.getValue());
}
Map集合实现:
1.HashMap
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低
——————百度百科
首先建立一个Set集合并往里面放入Key和value
private Mapmap = new HashMap<>(); @Before public void setup() { map.put("1", "zs"); map.put("2", "ls"); map.put("3", "ww"); map.put("4", "zl"); }
方法一:先获取所有键的Set集合,在遍历(通过键获得值)
@Test
public void demo2() {
Iterator it = map.keySet().iterator();
while(it.hasNext()) {
String key = it.next();
System.out.println(map.get(key));
}
}
方法二:取出保存所有Entry的Set,再遍历此Set即可
@Test
public void demo9() {
Iterator> it = map.entrySet().iterator();
while(it.hasNext()) {
Entry entry = it.next();
System.out.println(entry.getKey() + ": " + entry.getValue());
}
1.HashMap
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低
——————百度百科
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低
——————百度百科
特点:线程不安全,最常用,速度快
内部采用数组来存放数据
基本原理:
put(key,val)方法的执行过程
Table数组中的的Node
链表结构示意图
红黑树结构示意图
2.HashTable
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
线程安全,不太常用
——————百度百科
3.ConcurrentHashMap
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
线程安全,不太常用
——————百度百科
线程安全,比HashTable性能高
jdk8之前,使用的是分段锁,共16段
jdk8之后,使用一桶一锁,加CAS操作
4.TreeMap
TreeMap类不仅实现了Map接口,还实现了java.util.SortMap接口,因此集合中的映射关系具有一定的顺序.但是在添加,删除,和定位映射关系上,TreeMap类比HashMap类的性能差一些.TreeMap类实现的Map集合中的映射关系是根据键值对象按一定的顺序排列的.因此不允许键对象是null.
——————百度百科
TreeMap类不仅实现了Map接口,还实现了java.util.SortMap接口,因此集合中的映射关系具有一定的顺序.但是在添加,删除,和定位映射关系上,TreeMap类比HashMap类的性能差一些.TreeMap类实现的Map集合中的映射关系是根据键值对象按一定的顺序排列的.因此不允许键对象是null.
——————百度百科
key 值一定的顺序排序
添加或获取元素时性能较HashMap慢
因为需求维护内部的红黑树,用于保证key值的顺序
5.LinkedHashMap
继承HashMap
LinkedHashMap是有序的,且默认为插入顺序
当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了
示例:
MaplinkedHashMap = new LinkedHashMap<>(); linkedHashMap.put("name1", "josan1"); linkedHashMap.put("name2", "josan2"); linkedHashMap.put("name3", "josan3"); Set > set = linkedHashMap.entrySet(); Iterator > iterator = set.iterator(); while(iterator.hasNext()) { Entry entry = iterator.next(); String key = (String) entry.getKey(); String value = (String) entry.getValue(); System.out.println("key:" + key + ",value:" + value); }
这篇文章就到这里结束了,拜拜( ゚д゚)つBye。



