关于Hashtable集合及其子类Properties:
1、Hashtable的底层是哈希表,也是以键值对的形式存储数据。
其中键值对的key和value都不能为null。
回顾前面学的集合能否存null:
List接口下的ArrayList,LinkedList,Vector都能存null。
Set接口下的HashSet可以存null,TreeSet不能存null。
Map接口下的HashMap可以存<null, null>,Hashtable的key和value都不能为null,
TreeMap的key不能为空,但value可以存null。
2、Hashtable中的方法都用了synchronized关键字修饰,属于线程安全的。
因为是线程安全的,所以在处理线程安全之后,效率较低。
我们处理线程安全有别的方案,故Hashtable使用较少。
3、Hashtable的初始化容量默认为11,默认加载因子是0.75。
当容量达到75%,底层数组自动扩容至(原容量的2倍 + 1)。
参考Hashtable的源代码:其中的rehash()方法有扩容计算表达式。
(1)回顾一下前面学的集合的默认容量及扩容大小:
-
List接口下的ArrayList和Vector底层都是是数组,初始化容量默认为10。
ArrayList满时自动扩容到1.5倍。
Vector满时自动扩容到2倍。 -
Set接口下的HashSet的底层是HashMap,初始化容量默认为16,默认加载因子是0.75,自动扩容到2倍。
-
Map下的HashMap底层是哈希表,初始化容量默认为16,默认加载因子是0.75,自动扩容到2倍。
-
Map下的Hashtable底层是哈希表,初始化容量默认是11,默认加载因子是0.75,自动扩容到(原容量的2倍 + 1)。
4、Hashtable集合效率低,使用少,但其子类Properties会用到。
目前只需要掌握Properties属性类的相关方法就可以。
Properties是一个Map集合,继承Hashtable,也是线程安全的,底层也是一个哈希表。
Properties的key和value都只能是String类型,且都不能为null。当然也是无序不可重复的。
Properties被称为属性类。
测试代码:
import java.util.Properties;
public class Test05 {
public static void main(String[] args) {
// 创建一个Properties对象
Properties pro = new Properties();
// 目前只需掌握存和取方法,等学了IO再来看其他方法
// 存数据,只能存<String, String>
pro.setProperty("userId", "1001");
pro.setProperty("userName", "张三");
pro.setProperty("password", "abc123");
System.out.println(pro.size()); // 3
// 取数据
String userId = pro.getProperty("userId");
String userName = pro.getProperty("userName");
String password = pro.getProperty("password");
System.out.println(userId + ", " + userName + ", " + password);
// 注意,存取的时候字符串千万别写错了,写错了没提示的
}
}