Java重修笔记 第四十六天 Map 接口、HashMap 类

  • Map 接口

1. 用于保存具有映射关系的数据:Key-Value(双列元素)

2. Map 中的 key 和 value 可以是任何引用类型的数据,会封装到 HashMap$Node 对象中

3. Map 中的 key 不允许重复,原因和 HashSet 一样,value 可以重复

4. 添加重复的 key ,会导致 value 的值被替换

5. HashMap 的 key 和 value 都可以传入 Object 类型的数据, 但常用 String 类型的数据来当做 key

6.  Key-Value 是放在 HashMap$Node 中的,又因为 Node 类实现了 Map.Entry 接口,所以有些书上也说 一对 Key-Value 就是一个 Entry 结点

7. HashMap将所有 Node 结点全部封装到 EntrySet 的内部类里,方便遍历(KeySet 和 Values同理,不过一个分装 key 集合,一个分装 value 集合)

  • HashMap 接口的方法

1. public V put(K key, V value)

        添加一组新的键值对,如果 key 的值冲突,则会将就得 value 值替换为新的 value 值

2. public V remove(Object key)

        通过 key 的值删除该键值对

3. public V get(Object key)

        根据 key 获取 value

4. public int size()

        获取键值对数量

5. public boolean isEmpty()

        判断该集合键值对的数量是否为零

6. public void clear()

        将所有键值对全部删除

7. public boolean containsKey(Object key)

        查找包含 key 的键值对是否存在

8. public boolean containsValue(Object value)

        查找包含 value 的键值对是否存在

  • HashMap 的遍历方式

1. 增强for循环取出所有的 key ,再通过 key 取 value 

System.out.println("-----第一种方式-----");
Set<Integer> keySet = hashMap.keySet();
for (Object i :
        keySet) {
    System.out.println(i + " - " + hashMap.get(i));
}

2.  通过迭代器获取 key 和 value

System.out.println("-----第二种方式-----");
Iterator<Integer> iterator = keySet.iterator();
while (iterator.hasNext()) {
    Integer next = iterator.next();
    System.out.print(next + " - " + hashMap.get(next) + "\t");
}

3. 增强for循环取出 value

System.out.println("-----第三种方式-----");
Collection<Integer> values = hashMap.values();
for (Object i :
        values) {
    System.out.print(hashMap.get(i) + "\t");
}

4.  通过迭代器获取 value

System.out.println("-----第四种方式-----");
Iterator<Integer> iterator1 = values.iterator();
while (iterator1.hasNext()) {
    Integer next = iterator1.next();
    System.out.print(next + "\t");
}

5. 增强for循环使用 EntrySet 获取键值对

System.out.println("-----第五种方式-----");
Set<Map.Entry<Integer, Integer>> entries = hashMap.entrySet();
for (Map.Entry m :
        entries) {
    System.out.print(m.getKey() + " - " + m.getValue() + "\t");
}

6. 通过迭代器使用 EntrySet 获取键值对

Iterator<Map.Entry<Integer, Integer>> iterator2 = entries.iterator();
while (iterator2.hasNext()) {
    Map.Entry<Integer, Integer> next = iterator2.next();
    System.out.print(next.getKey() + " - " + next.getValue() + "\t");
}

  • HashMap 小结

1.  Map接口的常用实现类:HashMap、Hashtable 和 Properties

2. HashMap是 Map 接口使用频率最高的实现类

3. HashMap 是以 key-val 对的方式来存储数据(HashMap$Node 类型)

4. key 不能重复,但是值可以重复,允许使用 null 键和 null 值

5. 如果添加相同的 key , 则会覆盖原来的 key-val ,等同于修改(key不会替换, val会替换)

6. 与 HashSet 一样,不保证映射的顺序,因为底层是以 hash 表的方式来存储的

7. HashMap 没有实现同步,因此是线程不安全

  • HashMap 的扩容机制(复习)

1. HashMap 底层维护了 Node 类型的数组 table ,默认为 null
2. 当创建对象时,将加载因子 loadfactor 初始化为 0.75
3. 当添加 key-val 时,通过 key 的哈希值得到在 table 上的索引。然后判断该索引处是否有元素如果没有元素直接添加。如果该索引处有元素,继续判断该元素的 key 是否和准备加入的 key 是否相等,如果相等,则直接替换 val;如果不相等需要判断是树结构还是链表结构,做出相应处理。如果添加时发现容量不够,则需要扩容。
4. 第1次添加,则需要扩容table容量为16,临界值 threshold) 为12
5. 以后再扩容,则需要扩容 table 容量为原来的2倍,临界值也是原来的2倍,依次类推
6. 在Java8中,如果一条链表的元素个数超过 TREEIFY THRESHOLD(默认是8),并且 table 的大小 >= MIN TREEIFY CAPACITY(默认64),就会进行树化(红黑树)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值