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. Key 和 Value 是 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  阅读(63)  评论(0)    收藏  举报

☝

👇