双列集合,键不允许重复,值可以重复
null键 null值都可以添加 5--4 6--4 都能添加进去 5--4 5--6 最后添加的是后者(覆盖前者)
1. HashMap 是以key–value对的形式存储的,key值是唯一的,一个key只能对应着一个value,但是value是可以重复的
2. HashMap 如果再次添加相同的key值,它会覆盖key值所对应的内容,这也是与HashSet不同的一点,Set通过add添加相同的对象,不会再添加到Set中去
3. HashMap 提供了get方法,通过key值取对应的value值,但是HashSet只能通过迭代器Iterator来遍历数据,找对象
常见方法
- put(Object key, Object value) map.put("是的", "的数");
- remove(Object key) map.remove("啊")
- containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true (键和对应的值一起删除)
- containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true
- get(Object key) 返回键所映射的值
- size 返回此映射中的键-值映射关系数
- isEmpty 如果此映射未包含键-值映射关系,则返回 true
- keySet() 返回此映射中包含的键的 Set 视图 Set<K>
- entrySet() Set<Map.Entry<K,V>> Map.Entry是接口,里面有getkey和getValue方法,返回此映射中包含的映射关系的 Set 视图。(Map中没有iterator 只能间接通过Set来遍历)
遍历方式
方式一:通过调用keySet方法
Map map = new HashMap();
//① 得到所有的键
Set keys = map.keySet();
//② 遍历所有键(遍历Set)
Iterator iterator = keys.iterator();
while (iterator.hasNext()) {
//每一个键
Object key = iterator.next();
//根据键得到对应值
Object value = map.get(key);
System.out.println(key+" 对应的值是:"+value);
}
// 方式二:通过调用entrySet方法
//① 得到所有的关系(结婚证)
Set entrys = map.entrySet();
//② 遍历所有关系(遍历Set)
Iterator iterator = entrys.iterator();
while (iterator.hasNext()) {
//得到每一对关系
Map.Entry entry = (Entry) iterator.next();
//得到对应的键
Object key = entry.getKey();
//得到对应的值
Object value = entry.getValue();
}
实现类HashMap
- HashSet的底层就是HashMap的底层
- HashSet底层是数组(table数组)+单向链表(上一个元素指向下一个元素)组成的哈希表,有数组就有容量且必须是2^n
- 扩容机制:有加载因子决定,默认为0.75,也就是容量达到4分之3时就会扩容
特点:无序的(指键无序) 跟HashSet一样的地方都是指键
不能重复 添加对象类型时过滤方法同HashSet 与HashSet的用法类似,对象类型需要重写hashCode和equals方法
null键 null值都可以添加 null--null null--2 2--null都可以
HashMap 键无序,,,, TreeMap 键自然排序
Map map = new HashMap(); //并没有把数组创建出来,只是给属性赋了值:初始容量16,加载因子0.75
map.put("k","v"); //第一次添加时会创建table数组并根据初始容量扩容(会判断是否是2^n)
map集合中数组的容量必须是2^n的原因:
存储在数组table中的位置是通过key的hash值计算得到的,2^n能确保数组的每个位置都可能是计算的结果,使数据均匀分配到各个位置中,不至于使某一个位置链表过长而其他位置没有造成的空间浪费
数据结构:table+单向链表+红黑树
HashMap和Hashtable使用方法基本相同
底层结构 线程同步 安全性 效率 允许null键null值 版本
HashMap 哈希表 不同步 不安全 高 允许 1.2
Hashtable 哈希表 同步 安全 低 不允许 1.0
HashMap 和 Hashtable 有什么区别?
- hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
- hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。
- hashMap允许空键值,而hashTable不允许
HashMap和TreeMap的区别
底层结构 特点 使用注意
HashMap 哈希表 键无序 对象类型需要重写hashCode和equals方法
TreeMap 二叉树 键自然排序 对象必须实现比较性(有两种方式)
对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择