集合类基础概念
目录
集合类概述
集合框架的体系结构
单列集合(Collection)
List接口
Set接口
双列集合(Map)
Map接口
线程安全与性能考虑
集合与数组的区别
大小是否固定
数据类型与存储
操作方法丰富性
内存与性能
类型安全与泛型支持
多态性和接口支持
选择集合适用的原则
集合类概述
集合(Collection)是用来存储、获取和操作一组对象的容器,是程序中非常重要的数据结构。Java 集合框架(Java Collections Framework, JCF)提供了一组接口和实现,方便开发者进行各种数据的存储和操作。
集合框架的体系结构
集合框架主要分为两大类:一类是单列集合父类接口为Collection,另一类是双列集合父类接口是Map
单列集合(Collection)
List接口
List是有序集合,允许元素重复,可以通过索引访问元素。
主要实现类:
-
Vector:基于数组实现,线程安全(方法同步),但性能较低
-
ArrayList:基于动态数组实现,非线程安全,随机访问快,增删慢
-
LinkedList:基于双向链表实现,非线程安全,增删快,随机访问慢
Set接口
Set不允许重复元素,通常用于去重场景。
主要实现类(图中有些Set实现类被错误地归类在List下):
-
HashSet:基于哈希表实现,无序
-
LinkedHashSet:基于哈希表和链表实现,维护插入顺序
-
TreeSet:基于红黑树实现,元素按自然顺序或Comparator排序
双列集合(Map)
Map接口
Map存储键值对(key-value)映射,key不可重复。
主要实现类:
-
HashTable:早期实现,线程安全(方法同步),不允许null键/值
-
HashMap:基于哈希表实现,非线程安全,允许null键/值
-
LinkedHashMap:维护插入顺序或访问顺序
-
ConcurrentHashMap:线程安全实现,比HashTable性能更好
-
TreeMap:基于红黑树实现,键按自然顺序或Comparator排序
线程安全与性能考虑
线程安全集合:Vector、HashTable、ConcurrentHashMap
非线程安全集合:ArrayList、LinkedList、HashMap等
性能优化:
-
频繁查询用ArrayList
-
频繁增删用LinkedList
-
需要排序用TreeSet/TreeMap
-
需要保持插入顺序用LinkedHashSet/LinkedHashMap
-
多线程环境用ConcurrentHashMap替代HashTable
集合与数组的区别
大小是否固定
数组(Array):
-
创建时需要指定固定的大小,长度一旦确定,就不可更改。
-
如果需要改变容量,只能创建新的数组,拷贝原数组数据,比较麻烦且低效。
-
适合已知数据量且大小固定的场景。
集合(Collection):
-
大小是动态可变的,可以随时添加或删除元素,容量自动扩展或收缩。
-
以
ArrayList
为例,底层使用动态数组实现,容量不足时会自动扩容。 -
适合数据量不确定或需要频繁增删改的场景。
数据类型与存储
数组:
-
可以存储基本类型(如
int[]
,char[]
)或对象类型(如String[]
)。 -
基本类型数组性能高,因为直接存储数据。
-
对象数组存储的是对象引用。
集合:
-
只能存储对象类型(引用类型),不能存储基本类型,需用包装类(如
Integer
代替int
)。 -
支持泛型(Generics),可以指定存储对象的类型,提高代码安全性和可读性。
-
泛型是编译时类型检查,避免了强制类型转换的麻烦。
操作方法丰富性
数组:
-
操作较为基础,只能通过索引访问元素,增删操作需手动处理(如复制和移动元素)。
-
Java标准库提供了
Arrays
工具类支持排序、搜索、填充等静态方法,但使用不如集合方便。
集合:
提供了丰富的操作接口,如:
-
添加元素:
add(E e)
-
删除元素:
remove(Object o)
、removeIf(Predicate<? super E> filter)
-
查找元素:
contains(Object o)
、indexOf(Object o)
-
遍历:支持迭代器(Iterator)、增强for循环
-
排序:如
Collections.sort()
,或者流式操作(Stream API) -
批量操作:
addAll()
,removeAll()
,retainAll()
等
使用方便,代码简洁,功能强大。
内存与性能
数组:
-
内存连续分配,访问速度快,尤其是基本类型数组。
-
对于大量数据和性能敏感场景,数组效率更高。
集合:
-
实现一般基于数组或链表,可能有额外的内存开销。
-
动态扩容和复杂操作可能影响性能,但带来了灵活性。
-
不同集合实现有不同性能特点(如
ArrayList
随机访问快,LinkedList
插入删除快)。
类型安全与泛型支持
数组:
-
支持存储具体类型,编译时进行类型检查。
-
但数组不支持泛型,不能创建泛型数组(
new T[]
非法)。 -
数组存在类型协变(covariant),可能导致运行时异常(
ArrayStoreException
)。
集合:
-
支持泛型,提供编译时类型安全。
-
避免了运行时的类型转换异常,代码更安全。
多态性和接口支持
数组:
-
是语言内置的基本结构,不支持接口或多态。
-
不能直接用于面向接口编程。
集合:
-
集合是接口和实现类的体系,支持多态。
-
可以灵活切换不同实现,比如从
ArrayList
切换为LinkedList
,不影响业务代码。
选择集合适用的原则
-
需要有序用
List
或LinkedHashSet
-
需要无重复元素用
Set
-
需要键值对存储用
Map
-
需要频繁随机访问用
ArrayList
-
需要频繁插入删除用
LinkedList
-
需要线程安全用
Vector
、Hashtable
、或并发集合类如ConcurrentHashMap