目录
Java集合框架详解
一、集合框架概述
1. 为什么需要集合?
2. 集合框架的体系结构
二、Collection接口
三、List接口
1. ArrayList
2. LinkedList
3. Vector
四、Set接口
1. HashSet
2. LinkedHashSet
3. TreeSet
五、泛型
1. 泛型集合
2. 自定义泛型类
六、增强的for循环
七、工具类
1. Arrays
2. Collections
八、面试题
1. Collection和Collections的区别
2. ArrayList和LinkedList的区别
总结
Java集合框架详解
Java集合框架是Java编程中非常重要的一部分,它提供了丰富的数据结构和算法,用于存储和操作数据。集合框架的核心接口和类位于java.util
包中,主要包括List
、Set
、Map
等。本文将详细介绍集合框架的体系结构、常用方法以及常见集合类的使用。
一、集合框架概述
1. 为什么需要集合?
-
数组的局限性:
-
数组长度固定,无法动态扩展。
-
数组功能单一,缺乏插入、删除、搜索等操作。
-
数组不支持泛型,类型安全性较差。
-
-
集合的优势:
-
动态扩展:集合长度可以根据需要自动调整。
-
功能丰富:提供了插入、删除、搜索、排序等操作。
-
类型安全:通过泛型支持类型检查。
-
多样化的数据结构:支持列表、集合、映射等多种数据结构。
-
2. 集合框架的体系结构
Java集合框架主要分为两大类:
-
单列集合:
Collection
接口及其子接口(List
、Set
)。 -
双列集合:
Map
接口及其实现类(HashMap
、TreeMap
等)。
二、Collection
接口
Collection
是单列集合的根接口,定义了集合的基本操作。常用方法包括:
-
添加元素:
-
add(E e)
:添加单个元素。 -
addAll(Collection<? extends E> c)
:添加另一个集合的所有元素。
-
-
删除元素:
-
remove(Object o)
:删除指定元素。 -
removeAll(Collection<?> c)
:删除与指定集合相同的元素。 -
clear()
:清空集合。
-
-
判断元素:
-
contains(Object o)
:判断是否包含指定元素。 -
isEmpty()
:判断集合是否为空。
-
-
转换为数组:
-
toArray()
:将集合转换为数组。
-
三、List
接口
List
是有序集合,允许元素重复,支持索引访问。常用实现类包括ArrayList
、LinkedList
和Vector
。
1. ArrayList
-
特点:
-
底层基于数组实现。
-
支持动态扩容,初始容量为10,每次扩容为原来的1.5倍。
-
查询效率高,增删效率低(需要移动元素)。
-
线程不安全。
-
-
示例:
List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add(1, "C"); // 在索引1处插入元素 System.out.println(list); // 输出:[A, C, B]
2. LinkedList
-
特点:
-
底层基于双向链表实现。
-
增删效率高,查询效率低(需要遍历链表)。
-
线程不安全。
-
-
示例:
List<String> list = new LinkedList<>(); list.add("A"); list.add("B"); list.addFirst("C"); // 在头部插入元素 System.out.println(list); // 输出:[C, A, B]
3. Vector
-
特点:
-
底层基于数组实现。
-
线程安全,但性能较低。
-
初始容量为10,每次扩容为原来的2倍。
-
-
示例:
Vector<String> vector = new Vector<>(); vector.add("A"); vector.add("B"); System.out.println(vector); // 输出:[A, B]
四、Set
接口
Set
是无序集合,不允许元素重复。常用实现类包括HashSet
、LinkedHashSet
和TreeSet
。
1. HashSet
-
特点:
-
基于哈希表实现。
-
元素唯一,允许一个
null
值。 -
线程不安全。
-
-
示例:
Set<String> set = new HashSet<>(); set.add("A"); set.add("B"); set.add("A"); // 重复元素不会被添加 System.out.println(set); // 输出:[A, B]
2. LinkedHashSet
-
特点:
-
基于链表和哈希表实现。
-
元素唯一,且保持插入顺序。
-
线程不安全。
-
-
示例:
Set<String> set = new LinkedHashSet<>(); set.add("B"); set.add("A"); set.add("C"); System.out.println(set); // 输出:[B, A, C]
3. TreeSet
-
特点:
-
基于红黑树实现。
-
元素唯一,且按自然顺序或自定义顺序排序。
-
不允许
null
值。 -
线程不安全。
-
-
示例:
Set<String> set = new TreeSet<>(); set.add("B"); set.add("A"); set.add("C"); System.out.println(set); // 输出:[A, B, C]
五、泛型
泛型用于在编译时检查类型安全性,避免类型转换错误。集合框架广泛使用泛型。
1. 泛型集合
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
// list.add(123); // 编译错误,类型不匹配
2. 自定义泛型类
class Box<T> {private T value;public void setValue(T value) { this.value = value; }public T getValue() { return value; }
}Box<String> box = new Box<>();
box.setValue("Hello");
System.out.println(box.getValue()); // 输出:Hello
六、增强的for
循环
增强的for
循环用于遍历数组或集合,语法简洁。
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");for (String s : list) {System.out.println(s);
}
七、工具类
1. Arrays
-
常用方法:
-
toString()
:将数组转换为字符串。 -
sort()
:对数组排序。 -
binarySearch()
:对数组进行二分查找。 -
asList()
:将数组转换为List
。
-
2. Collections
-
常用方法:
-
sort()
:对集合排序。 -
reverse()
:反转集合。 -
shuffle()
:随机打乱集合。
-
八、面试题
1. Collection
和Collections
的区别
-
Collection
是集合的根接口。 -
Collections
是操作集合的工具类,提供了排序、查找等方法。
2. ArrayList
和LinkedList
的区别
-
ArrayList
基于数组,查询效率高,增删效率低。 -
LinkedList
基于链表,增删效率高,查询效率低。
总结
Java集合框架是Java编程的核心内容之一,掌握集合框架的使用对于编写高效、可维护的代码至关重要。本文详细介绍了集合框架的体系结构、常用方法以及常见集合类的使用,希望对读者有所帮助。