Java细碎知识小结(2)

LinkedHashSet

HashSet的子类, 可以实现插入顺序和输出顺序保持一致, 但是效率较低
1). 在LinkedHashSet 中维护了一个hash表和双向链表
2). 每一个节点都有pre和next属性, 这样可以形成双向链表,
3). 在添加一个元素时, 先求hash, 再求索引, 确定该元素的位置, 然后将添加的元素加入双向链表

Hashtable

使用方法基本和hashmap一样
1). hashtable的键值不能为空
2). 是线程安全的, (hashmap不是线程安全的)
3). 底层是数组Hashtable$Entry[] 初始化大小为11
4). hashtable的put方法

5). addEntry()方法 用来添加一个Entry 到 table中

  1. rehash() 方法扩容

可以发现int newCapacity = (oldCapacity << 1) + 1; 就是扩容核心语句

Properties

继承自Hashtable类并且实现了Map接口, 可以存储键值对, 通常用于取出配置文件的信息

1). 有Hashtable的所有方法, 不多赘述
2). 有一个getProperties() 方法, 也可以获得值, 在IO流时会使用

TreeSet与TreeMap

可以实现排序功能

1). 当使用无参构造器创建TreeSet时, 仍然是无序的
2). 如果要实现排序功能, 创建的时候可以传入Comparator 对象

TreeSet treeSet = new TreeSet(new Comparator() {
    @Override
    public int compare(Object o1, Object o2) {
        return ((String) o1).compareTo((String) o2);
    }
});

3). 构造器会把传入的比较器对象, 赋给TreeSet底层的TreeMap 的属性this.comparator
4). add() 时, 会根据cpr来比较. 找到自己的合适的位置然后插入

Comparator<? super K> cpr = comparator;

集合总结

1. 单列 -> [Collection 接口]
    1). 允许重复: List 子接口
        Ⅰ. 增删多 -> LinkedList: [底层维护了一个双向链表]
        Ⅱ. 改查多 -> ArrayList: [底层维护了一个Object类型的可变数组]
    2) 不允许重复: Set 子接口
        Ⅰ. 无序 -> HashSet [底层是HashMap, 维护了一个哈希表, 即(数组 + 链表 + 红黑树)]
        Ⅱ. 排序 -> TreeSet [底层是TreeMap, 可以传入Comparator排序]
        Ⅲ. 插入和取出顺序一致: LinkedHashSet [维护数组 + 双向链表]
            PS: 底层: LinkedHashSet -> LinkedHashMap -> HashMap

2. 双列键值对 -> [Map 接口]
    1). 键无序 -> HashMap [底层是哈希表, 即(数组 + 链表 + 红黑树)]
    2). 键排序 -> TreeMap [可以传入Comparator排序]
    3). 键插入和取出顺序一致 -> LinkedHashMap [维护数组 + 双向链表]
    4). 读取文件 -> Properties
posted @ 2023-11-17 17:28  Xingon2356  阅读(11)  评论(0编辑  收藏  举报