集合判空
判断集合是否为空可以通过 isEmpty() 或 size() 方法:
List<String> list = new ArrayList<>();
if (list.isEmpty()) {
System.out.println("集合为空");
}
小于 1 分钟
判断集合是否为空可以通过 isEmpty() 或 size() 方法:
List<String> list = new ArrayList<>();
if (list.isEmpty()) {
System.out.println("集合为空");
}
HashMap 和 Hashtable 的区别:线程安全性:
Hashtable 是线程安全的,它的所有方法都被 synchronized 修饰。由于对整个数据结构加锁,性能会有一定的影响,尤其在多线程环境下竞争较激烈时,可能导致较低的效率。HashMap 是非线程安全的,但性能较高。为了保证线程安全,可以使用 ConcurrentHashMap 代替。对 null 值的支持:
Hashtable 不允许 null 键和值。若尝试插入 null,会抛出 NullPointerException。HashMap 允许一个 null 键和多个 null 值。初始化容量和扩容规则:
Hashtable 默认初始容量为 11,负载因子为 0.75,扩容时将容量变为原来的 2n + 1。HashMap 默认初始容量为 16,负载因子为 0.75,扩容时将容量翻倍。HashMap 使用 2 的幂次方来扩展容量,这是为了提高性能,避免哈希冲突。继承体系:
Hashtable 继承自 Dictionary 类,Dictionary 是 JDK 1.0 引入的,已被弃用。HashMap 继承自 AbstractMap,并实现了 Map 接口。迭代器:
Hashtable 使用 Enumeration 进行迭代,而 Enumeration 并不支持 fail-fast 机制,即修改集合时不会抛出异常。HashMap 使用 Iterator,它是 fail-fast 的,如果在迭代过程中修改集合,将抛出 ConcurrentModificationException。底层实现:
Hashtable 底层使用的是数组加链表来存储数据,但没有进行链表转红黑树的优化。HashMap 在 JDK 1.8 以后对哈希冲突的处理做了优化,当链表长度超过阈值时(默认为 8),会将链表转换为红黑树以提高查询性能。List 是一个有序集合,允许元素重复,并且可以通过索引访问元素。它实现了 RandomAccess 接口,意味着它支持基于索引的快速访问,因此在频繁进行随机访问时具有优势。常见实现包括 ArrayList 和 LinkedList。
Set 是一个不允许元素重复的集合,元素的顺序通常不确定(对于 HashSet 来说)。TreeSet 提供了按自然顺序或自定义排序的功能。LinkedHashSet 保持插入顺序。
Queue 是一种遵循 FIFO(先进先出)原则的集合,用于在队列中按顺序处理元素。PriorityQueue 根据元素的优先级而非插入顺序出队。
Map 是一个键值对集合,其中每个键映射到一个唯一的值。HashMap 提供了最快的查找速度,而 TreeMap 按键的自然顺序进行排序,LinkedHashMap 保留插入顺序。