在Java开发中,集合框架是面试和实际开发中非常重要的内容。以下是一些常见的Java集合八股文问题和场景题,以及详细答案和示例代码。
答案:
Java集合框架主要分为三大接口:Collection
、Map
和Queue
。
List
和Set
。
List
:有序集合,允许重复元素,如ArrayList
、LinkedList
和Vector
。Set
:无序集合,不允许重复元素,如HashSet
、LinkedHashSet
和TreeSet
。HashMap
、TreeMap
和LinkedHashMap
。LinkedList
和PriorityQueue
。示例代码:
import java.util.*;
public class CollectionFramework {
public static void main(String[] args) {
// List
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
System.out.println("List: " + list);
// Set
Set<String> set = new HashSet<>();
set.add("Java");
set.add("Python");
System.out.println("Set: " + set);
// Map
Map<String, Integer> map = new HashMap<>();
map.put("Java", 1);
map.put("Python", 2);
System.out.println("Map: " + map);
// Queue
Queue<String> queue = new LinkedList<>();
queue.add("Java");
queue.add("Python");
System.out.println("Queue: " + queue);
}
}
答案:
ArrayList
基于动态数组实现,支持快速随机访问,但插入和删除效率较低。LinkedList
基于双向链表实现,插入和删除效率高,但不支持快速随机访问。ArrayList
适合频繁读取,LinkedList
适合频繁插入和删除。LinkedList
每个节点需要额外存储前后指针,内存占用较大。示例代码:
import java.util.*;
public class ArrayListVsLinkedList {
public static void main(String[] args) {
// ArrayList
List<String> arrayList = new ArrayList<>();
arrayList.add("Java");
arrayList.add("Python");
System.out.println("ArrayList: " + arrayList.get(0)); // 快速随机访问
// LinkedList
List<String> linkedList = new LinkedList<>();
linkedList.add("Java");
linkedList.add("Python");
linkedList.add(0, "C++"); // 插入操作
System.out.println("LinkedList: " + linkedList);
}
}
答案:
HashMap
基于哈希表实现,主要由两部分组成:数组和链表(或红黑树)。
size / capacity
)达到阈值(默认0.75)时,数组会扩容为原来的两倍。示例代码:
import java.util.*;
public class HashMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Java", 1);
map.put("Python", 2);
map.put("Java", 3); // 键重复,值覆盖
System.out.println("HashMap: " + map);
// 遍历
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
答案:
HashMap
和ArrayList
不是线程安全的,需要手动同步。Vector
是线程安全的,但性能较差,因为它的每个方法都加了synchronized
锁。HashMap
和ArrayList
:非线程安全,性能高。Vector
:线程安全,性能低。Collections.synchronizedMap()
或ConcurrentHashMap
替代HashMap
。CopyOnWriteArrayList
替代ArrayList
。示例代码:
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ConcurrentHashMap;
public class ThreadSafeCollections {
public static void main(String[] args) {
// 线程安全的Map
Map<String, Integer> map = new ConcurrentHashMap<>();
map.put("Java", 1);
// 线程安全的List
List<String> list = new CopyOnWriteArrayList<>();
list.add("Java");
System.out.println("Thread-safe Map: " + map);
System.out.println("Thread-safe List: " + list);
}
}
答案:
可以通过Collections.synchronizedList()
或Collections.synchronizedMap()
实现线程安全的集合。
还可以使用CopyOnWriteArrayList
或ConcurrentHashMap
。
示例代码:
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
public class SingletonCollection {
private static SingletonCollection instance;
private List<String> list;
private SingletonCollection() {
list = new CopyOnWriteArrayList<>();
}
public static SingletonCollection getInstance() {
if (instance == null) {
synchronized (SingletonCollection.class) {
if (instance == null) {
instance = new SingletonCollection();
}
}
}
return instance;
}
public void addElement(String element) {
list.add(element);
}
public List<String> getElements() {
return list;
}
public static void main(String[] args) {
SingletonCollection singleton = SingletonCollection.getInstance();
singleton.addElement("Java");
System.out.println("Elements: " + singleton.getElements());
}
}
答案:
可以通过实现Comparable
接口或使用Comparator
接口对集合进行排序。
示例代码:
import java.util.*;
class Person implements Comparable<Person> {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age); // 按年龄升序排序
}
@Override
public String toString() {
return name + ": " + age;
}
}
public class CustomSort {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("Alice", 25));
list.add(new Person("Bob", 30));
list.add(new Person("Charlie", 20));
Collections.sort(list); // 使用Comparable接口排序
System.out.println("Sorted by age: " + list);
// 使用Comparator接口排序
list.sort(Comparator.comparingInt(p -> p.age));
System.out.println("Sorted by age using Comparator: " + list);
}
}
答案:
可以使用Set
接口实现去重,如HashSet
或LinkedHashSet
。
示例代码:
import java.util.*;
public class UniqueCollection {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("Java");
list.add("C++");
Set<String> set = new HashSet<>(list);
System.out.println("Unique elements: " + set);
}
}
答案:
可以使用LinkedHashMap
实现一个简单的LRU(最近最少使用)缓存。
示例代码:
import java.util.*;
class LRUCache<K, V> extends LinkedHashMap<K, V> {
private final int capacity;
public LRUCache(int capacity