集合-Map

1.常用方法

1、添加操作(与之前的有点不同)

  • V put(K key,V value)
  • void putAll(Map<? extends K,? extends V> m)

2、删除

  • void clear() 清空所有键值对
  • V remove(Object key) 移除指定key的键值对

3、元素查询的操作

  • V get(Object key)
  • boolean containsKey(Object key) 查找指定key的键值对
  • boolean containsValue(Object value) 类似上
  • boolean isEmpty()

4、元视图操作的方法:

  • Set keySet()
  • Collection values()
  • Set<Map.Entry<K,V>> entrySet()

5、其他方法

  • int size()

2.遍历

  • foreach
  • 通过Iterator对象遍历
  • 注意!!!!!!!!!!!(先看这个)
    • Map的遍历,不能支持foreach,因为Map接口没有继承java.lang.Iterable接口,也没有实现Iterator iterator()方法。
    • 分开遍历:
      • 单独遍历所有key
      • 单独遍历所有value
    • 成对遍历:
      • 遍历的是映射关系Map.Entry类型的对象,Map.Entry是Map接口的内部接口。每一种Map内部有自己的Map.Entry的实现类。在Map中存储数据,实际上是将Key---->value的数据存储在Map.Entry接口的实例中,再在Map集合中插入Map.Entry的实例化对象,
        img

3.Map实现类

1、HashMap重点

特点

  • key
    • 无序:
      • 不是添加顺序
    • 唯一
      • key不重复
  • value
    • 只要满足泛型要求即可
    • 注意:
      • 如果key 重复 新的value 会替换旧的value

key 存储自定义类型数据

需要重写 hashCode equals()

与Hashtable的区别

  • HashMap和Hashtable都是哈希表。
  • HashMap和Hashtable判断两个 key 相等的标准是:两个 key 的hashCode 值相等,并且 equals() 方法也返回 true。因此,为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。
  • Hashtable是线程安全的,key和value都不能为null
  • HashMap是线程不安全的,key和value可以使用 null (可以单独一个使用)。

从源码解释HashMap

  • \1.创建HashMap
    • 将默认的负载因子 0.75f 赋值给了成员变量
  • \2. 数据添加 第一次添加时 给底层Node[] 16 threshold 12
    • 2.1 key null
      • 将数据添加到哈西表内下标为0的位置
    • 2.2 key 非null
      • 2.2.1 插入位置没有数据
        • 直接添加
      • 2.2.2 插入位置有数据 key 不一样
        • 原有节点的后面进行追加
        • 七上八下 jdk8 下 后面追加
      • 2.2.3 插入位置有数据 key相同
        • 将新的value 替换 旧的value 并将旧的value返回
      • 2.2.4
        • 扩容
          • 当集合中元素的数量>阈值 触发扩容 数组<<1 阈值<<1
        • 树化
          • 0.插入位置节点的数量>=8
          • \1. 底层数组长度 >=64
          • \3. 插入新的数据 新数据的位置不能为null

2、TreeMap

定义:

基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

当其key存储自定义类型数据

需要指定key的比较规则

特点

  • key
    • 有序:
      • 自然顺序
    • 唯一
      • key不重复
  • value
    • 只要满足泛型要求即可
    • 注意:
      • 如果key 重复 新的value 会替换旧的value

3、LinkedHashMap

定义

LinkedHashMap 是 HashMap 的子类。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。

特点

  • key
    • 有序:
      • 添加顺序
    • 唯一
      • key不重复
  • value
    • 只要满足泛型要求即可
    • 注意:
      • 如果key 重复 新的value 会替换旧的value

key 存储自定义类型数据

需要重写 hashCode equals()

4、Properties

  • Properties 类是 Hashtable 的子类,Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
  • 存取数据时,建议使用setProperty(String key,String value)方法和getProperty(String key)方法。

4.拓展

  • HashSet 底层采用的是 HashMap将存储的值放到了 Map key 的位置
  • LinkedHashSet 底层采用的是 LinkedHashMap将存储的值放到了 Map key 的位置
  • TreeSet 底层采用的是 TreeMap将存储的值放到了 Map key 的位置
posted @ 2021-11-19 11:28  KaneQi  阅读(21)  评论(0编辑  收藏  举报