JavaSE9️⃣集合 - Map 体系

Map 接口

Map:存储 K-V 键值对(也称记录)。

无序,无下标,Key 唯一

Hashtable 类 HashMap 类 TreeMap 类
Java 版本 1.0 1.2 1.2
存储结构 数组+链表 数组+链表、红黑树 红黑树
线程安全
说明 K/V 非空 K 和 V 可空 对集合元素自动排序(需实现 Comparable 接口)

1、Hashtable

简单了解即可

1.1、成员结构

1.1.1、Entry<K, V>

Hashtable 的私有静态内部类。

  1. 哈希值

  2. 关键码值、元素值

  3. 后继结点

    private static class Entry<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Entry<K,V> next;
        ...
    }
    

1.1.2、成员变量

重要的成员变量(均由 private 修饰)

数据类型 说明 取值
table Entry<?, ?>[] 哈希表 -
threshold int 当存储元素个数超过该阈值时进行扩容 扩容阈值 = 容量 * 加载因子
loadFactor float 加载因子 默认 0.75f
keySet Set<K> 包含所有 key 的集合 -
values Collection<V> 包含所有 value 的集合 -
entrySet Set<Map.Entry<K,V>> 包含所有 key-value 的集合 -

1.1.3、构造方法

  1. 指定初始容量、加载因子

  2. 指定初始容量:默认加载因子 0.75f

  3. 无参构造默认初始化容量 11,默认加载因子 0.75f(此时扩容阈值 8)。

    public Hashtable(int initialCapacity, float loadFactor) {
        ...
    }
    
    public Hashtable(int initialCapacity) {
        this(initialCapacity, 0.75f);
    }
    
    public Hashtable() {
        this(11, 0.75f);
    }
    

1.2、Properties 类

Hashtable 子类,表示一组持久的属性。

  1. KeyValue 是 String 类型。

  2. 常用于保存和读取配置文件。

    class Properties extends Hashtable<Object,Object> {
    
        public synchronized Object setProperty(String key, 
                                               String value) {
            return put(key, value);
        }
    
    }
    

2、HashMap

篇幅有限,移步以下 2 篇博客。

👉 哈希及 Java 实现

  1. 哈希:
    1. 哈希表
    2. 哈希冲突
  2. 哈希在 Java 中的实现:
    1. 存储结构:数组 + 位桶(bucket)
    2. 哈希冲突:链地址法
    3. 检索机制
    4. 重写 equals()hashCode()

👉 漫谈 HashMap

  1. 底层结构
    1. 数据结构:数组 + 位桶 (Java 1.8+ 红黑树)
    2. 版本区别
  2. 成员结构
    1. 位桶:Node<K, V>
    2. 成员变量
      1. 默认初始容量:16
      2. 默认加载因子:0.75f
      3. 扩容阈值 = 容量 * 加载因子
      4. 树化阈值:8
      5. 退化阈值:6
      6. 最小树化容量:64
  3. 构造方法
    1. 初始容量、加载因子
    2. 初始容量
    3. 无参
    4. Map
  4. 确定存储位置
    1. 扰动函数 hash()
    2. 计算下标 indexfor()
  5. 操作
    1. 添加元素 put()
    2. 扩容 resize()
    3. 查询 get()
    4. 删除 remove()
    5. 迭代器
  6. 对比 Hashtable

3、TreeMap

3.1、存储结构

红黑树

3.2、检索机制

基于 compareTo() 判断元素是否相等。

  1. 相等条件compareTo() 返回 0,无关 equals() 和 hashCode()。
  2. 使用方式
    1. Comparable:对象实现 Comparable 接口。
    2. Comparator:创建 TreeSet 时,传入 Comparator 匿名内部类。

3.3、使用

3.3.1、Comparable 接口

对象实现 Comparable 接口,TreeMap 可直接存储对象。

  1. 对象

    public class Student implements Comparable<Student> {
        private String name;
        private int age;
    
        @Override
        public int compareTo(Student s) {
            // 规则:先比较姓名,再比较年龄
            int c1 = this.name.compareTo(s.getName());
            int c2 = this.score - s.getScore();
    
            return c1 != 0 ? c1 : c2;
        }
    }
    
  2. 使用集合

    TreeSet<Student> set = new TreeSet<>;
    // 使用
    

3.3.2、Comparator

创建 TreeSet 时声明 Comparator 匿名内部类

  1. 对象

    public class Student {
        private String name;
        private int age;
    }
    
  2. 使用集合

    // 一般形式
    TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {
        @Override
        public int compare(Student s1, Student s2) {
            int c1 = s1.getName().compareTo(s2.getName());
            int c2 = s1.getScore() - s2.getScore();
    
            return c1 != 0 ? c1 : c2;
        }
    });
    
    // lambda表达式
    TreeSet<Student> set = new TreeSet<>((s1, s2) -> {
        int c1 = s1.getName().compareTo(s2.getName());
        int c2 = s1.getScore() - s2.getScore();
    
        return c1 != 0 ? c1 : c2;
    });
    
posted @ 2023-03-15 00:33  Jaywee  阅读(20)  评论(0编辑  收藏  举报

👇