1. Java中的HashMap
和Hashtable
有什么区别?
答案:
-
线程安全性:
-
HashMap
是线程不安全的,适合单线程环境。如果在多线程环境下使用,可能会出现数据不一致的问题。 -
Hashtable
是线程安全的,内部方法通过synchronized
关键字进行了同步,适合多线程环境。
-
-
性能:
-
HashMap
由于没有线程同步的开销,性能通常比Hashtable
更高。
-
-
空值支持:
-
HashMap
允许键和值为null
。 -
Hashtable
不允许键或值为null
,否则会抛出NullPointerException
。
-
-
迭代器:
-
HashMap
的迭代器是fail-fast的,如果在迭代过程中修改了集合,会抛出ConcurrentModificationException
。 -
Hashtable
的迭代器也是fail-fast的。
-
-
初始容量和加载因子:
-
HashMap
默认初始容量为16,加载因子为0.75。 -
Hashtable
默认初始容量为11,加载因子为0.75。
-
2. Java中的ArrayList
和LinkedList
有什么区别?
答案:
-
底层实现:
-
ArrayList
基于动态数组实现,随机访问性能高,适合频繁的读取操作。 -
LinkedList
基于双向链表实现,插入和删除操作性能高,适合频繁的增删操作。
-
-
内存占用:
-
ArrayList
连续存储,内存占用相对紧凑。 -
LinkedList
每个节点存储了前后节点的引用,内存占用相对较大。
-
-
性能:
-
随机访问:
ArrayList
通过索引访问元素的时间复杂度为O(1),而LinkedList
需要从头或尾遍历,时间复杂度为O(n)。 -
插入和删除:
LinkedList
在链表中间插入或删除元素的时间复杂度为O(1),而ArrayList
需要移动元素,时间复杂度为O(n)。
-
-
扩容机制:
-
ArrayList
在容量不足时会扩容为原来的1.5倍。 -
LinkedList
不需要扩容,因为链表的大小是动态的。
-
3. Java中volatile
和synchronized
的区别是什么?
答案:
-
作用范围:
-
volatile
只能修饰变量,用于保证变量的可见性。 -
synchronized
可以修饰方法或代码块,用于保证方法或代码块的同步。
-
-
锁机制:
-
volatile
不涉及锁机制,只是保证变量的读写操作对所有线程可见。 -
synchronized
通过锁机制实现线程同步,保证同一时刻只有一个线程可以执行同步代码。
-
-
性能:
-
volatile
的开销较小,因为它只保证变量的可见性。 -
synchronized
的开销较大,因为它涉及到锁的获取和释放。
-
-
适用场景:
-
volatile
适用于变量的读写操作简单且不需要复杂的原子性操作。 -
synchronized
适用于需要对多个变量进行复杂操作的场景。
-
这些题目和答案涵盖了Java中的集合框架、线程安全和并发编程等热点知识,是面试中常见的问题。