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中
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