数据:以键-值对的方式存储
key:无序,唯一(set);value:无序,可重复(collection)
底层:数组+链表
优缺点:添加、删除、修改效率都很高
存储自定义对象作为键时,要保证当前自定义类重写hashcode和equals方法。
键是唯一的,值可以重复。
向同一个键多次存储值时,后面的值会覆盖先前的值。
HashMap含义:
基于哈希表的Map接口实现。此实现提供所有可选的映射操作,并允许 null值和null键。(HashMap 该类大致相当于Hashtable,除了它是不同步的并且允许空值。)这个类不保证地图的顺序; 特别是,它不保证订单会随着时间的推移保持不变。
该实现为基本操作(get和put)提供了恒定时间性能,假设散列函数在桶之间正确地分散元素。对集合视图的迭代需要与HashMap实例的“容量” (桶的数量)加上其大小(键 - 值映射的数量)成比例的时间 。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低)非常重要。
HashMap具有影响其性能的两个参数的实例:初始容量和负载因子。的 容量是在哈希表中桶的数量,和初始容量是简单地在创建哈希表中的时间的能力。该 负载系数是的哈希表是如何充分允许获得之前它的容量自动增加的措施。当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表将被重新哈希(即,重建内部数据结构),以便哈希表具有大约两倍的桶数。
作为一般规则,默认加载因子(.75)在时间和空间成本之间提供了良好的权衡。较高的值会减少空间开销,但会增加查找成本(反映在类的大多数操作中HashMap,包括 get和put)。在设置其初始容量时,应考虑映射中的预期条目数及其加载因子,以便最小化重新散列操作的数量。如果初始容量大于最大条目数除以加载因子,则不会发生重新加载操作。
如果要在HashMap 实例中存储多个映射,则使用足够大的容量创建映射将允许映射更有效地存储,而不是根据需要执行自动重新散列来扩展表。请注意,使用具有相同键的许多键hashCode()是降低任何哈希表性能的可靠方法。为了改善影响,当键出现时Comparable,这个类可以使用键之间的比较顺序来帮助打破关系。
创建HashMap对象并指定泛型为String
Map<String,String> mps = new HashMap<>();
常见方法:
方法 | 作用 |
---|---|
clear() | 清除所有映射 |
get(object key) | 根据键获取对应的值 |
isEmpty() | 判断是否为空 |
keySet() | 返回所有的键 |
put(k key,v value) | 添加键-值对 |
putAll() | 添加一个映射集合到此映射集合中 |
remove() | 根据键删除对应的值,如果存在 |
size() | 返回映射的个数 |
values() | 返回所有的值 |
containsKey() | 查看是否包含这个键 |
containsValue() | 查看是否包含这个值 |
迭代方法:
- 获取键: 迭代键的过程中通过get方法获取值
for(Object key:keySet()){
sout(k+"="+map.get(k));
}
- 获取Entry对象,通过getKey和getValue获取键和值
//获取entry对象
Set<Entry<String, String>> kvs = mps.entrySet();
// 返回一个set集合 该集合中的每个元素都是entry对象
// 实际是 HashSet中的Node对象 因为Node实现了Map中的Entry接口
for(Entry<String, String> entry:kvs) {
System.out.println(entry.getKey()+"==="+entry.getValue());
}
网友评论