Map接口实现类-Hashtable
文章目录
Hashtable 的基本介绍
- 存放的元素是键值对:即 k-v
- Hashtable 的键和值都不能为 null,否则会抛出NullPointerException
- Hashtable 的使用方法基本上和 HashMap 一样
- Hashtable 是线程安全的(synchronized),而 HashMap 是线程不安全的
简单分析底层
Hashtable hashtable = new Hashtable();
hashtable.put("john",100);
- 底层有数组 Hashtable$Entry[] 初始化大小为11
- 临界值 threshold 8 = 11 * 0.75
扩容机制
- 执行方法 addEntry(hash, key, value, index); 添加k-v 封装到Entry
- 当 if (count >= threshold) 满足时,就进行扩容
- 按照 int newCapacity = (oldCapacity << 1) + 1; 的大小扩容,即2倍+1
与HashMap 的比较
版本 | 线程安全(同步) | 效率 | 允许null键null值 | |
---|---|---|---|---|
HashMap | 1.2 | 不安全 | 高 | 可以 |
Hashtable | 1.0 | 安全 | 较低 | 不可以 |
Map接口实现类-Properties
Properties 的基本介绍
- Properties 类继承自 Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存数据
- 它的使用特点和Hashtable类似
- Properties 还可以用于 从xxx.properties 文件中,加载数据到 Properties类对象,并进行读取和修改
- 说明:xxx.properties 文件通常作为配置文件
Map接口实现类-TreeMap
代码演示以及源码分析
TreeMap treeMap = new TreeMap();
treeMap.put("HongKong","China");
treeMap.put("Tokyo","Japan");
treeMap.put("Boston","USA");
treeMap.put("London","UK");
System.out.println(treeMap);
运行结果:{Boston=USA, HongKong=China, London=UK, Tokyo=Japan}
提供一个构造器
TreeMap treeMap = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((String) o2).compareTo((String)o1);
}
});
运行结果:{Tokyo=Japan, London=UK, HongKong=China, Boston=USA}
- 构造器把传入的实现了Comparator接口的匿名内部类(对象),传给TreeMap 的comparator
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
- 调用 put方法
- 第一次添加,把k-v封装到 Entry对象,放入root
Entry<K,V> t = root;
if (t == null) {
compare(key, key); // type (and possibly null) check
root = new Entry<>(key, value, null);
size = 1;
modCount++;
return null;
}
- 以后添加
Comparator<? super K> cpr = comparator;
if (cpr != null) {
do {//遍历所有的key,给当前key找到适当位置
parent = t;
cmp = cpr.compare(key, t.key);//动态绑定到匿名内部类的compare方法
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else//遍历过程中发现准备添加的 key 和当前已有的 key 相等就不添加
return t.setValue(value);
} while (t != null);
}