List
接口 | ||||
List | Java中的List接口是Java集合框架的一部分,它代表了一个有序的集合(也称为序列),并且它允许包含重复的元素。List接口继承了Collection接口,并添加了一些额外的功能,如通过索引访问元素。 | |||
add(E e) | :在列表的末尾添加一个元素。 | |||
get(int index) | 返回列表中指定位置的元素。 | |||
set(int index, E element) | 替换列表中指定位置的元素。 | |||
remove(int index) | 移除列表中指定位置的元素。 | |||
size() | 返回列表中的元素数量。 | |||
主要实现类 | 实现类 | 说明 | 底层实现方式 | |
ArrayList | 它是最常用的List实现 | 底层使用一个动态数组(Object[])来存储元素。 当数组填满时,会创建一个新的更大的数组,并将旧数组的内容复制到新数组中。 |
||
底层使用动态数组实现,所以随机访问元素非常快。 | ||||
插入和删除操作在列表的末尾是快的,但在列表的中间可能会慢,因为可能需要移动元素。 | ||||
LinkedList | 底层使用双向链表实现。 | 底层使用双向链表实现。 每个元素都存储在一个节点中,每个节点都有一个指向前一个节点和后一个节点的引用。 |
||
在列表的开头和结尾进行插入和删除操作非常快。 | ||||
但随机访问元素相对较慢,因为需要从列表的开头或结尾遍历到所需的位置。 | ||||
Vector | 类似于ArrayList,但它是同步的,这意味着它是线程安全的。 | 底层使用动态数组,与ArrayList相似。 但它使用synchronized关键字来确保线程安全,这会导致性能开销。 |
||
由于同步开销,它通常比ArrayList慢。 | ||||
底层也是使用动态数组实现。 | ||||
Stack | 继承自Vector,它实现了栈的后进先出(LIFO)行为。 | 底层使用Vector实现。 它通过限制元素的插入和删除位置(仅在栈顶)来实现栈的行为。 |
||
提供了push, pop, peek等方法。 | ||||
总结: | ||||
尽管Stack和Vector是线程安全的,但在现代Java应用中,通常建议使用ArrayList和LinkedList,并通过适当的并发控制(如Collections.synchronizedList或CopyOnWriteArrayList)来实现线程安全,因为Stack和Vector的性能通常不如其他选项。 |
Set
接口 | ||||
Set | Java中的Set接口也是Java集合框架的一部分,它代表了一个不包含重复元素的集合。Set接口继承了Collection接口,但与List不同,它不保证元素的顺序(除非使用特定的实现类,如LinkedHashSet或TreeSet)。 | |||
主要方法 | add(E e) | 向集合中添加一个元素(如果该元素尚未存在于集合中)。 | ||
remove(Object o) | 从集合中移除一个元素(如果存在)。 | |||
contains(Object o) | 检查集合是否包含指定的元素。 | |||
size() | 返回集合中的元素数量。 | |||
主要实现类 | 实现类 | 说明 | 底层实现方式 | |
HashSet | 它是最常用的Set实现。 | 底层使用HashMap来实现,元素存储在HashMap的键中,而值则是一个常量(通常是PRESENT),用于表示键的存在。 哈希表允许快速查找、添加和删除元素。 |
||
底层使用哈希表(实际上是HashMap)来实现,因此查找、添加和删除操作的平均时间复杂度为O(1)。 | ||||
不保证元素的顺序。 | ||||
LinkedHashSet | 类似于HashSet,但它使用链表维护了元素的插入顺序。 | 底层也使用HashMap,但与HashSet不同,它使用双向链表维护了元素的插入顺序。 这使得迭代顺序与插入顺序一致。 |
||
底层基于HashMap和双向链表实现。 | ||||
TreeSet | 是一个有序集合,它根据元素的自然顺序(实现Comparable接口)或提供的Comparator进行排序。 | 底层使用红黑树实现,这是一种自平衡的二叉搜索树。 红黑树保证了元素的有序性,并且在添加、删除和查找元素时提供了良好的性能。 |
||
底层使用红黑树实现,因此查找、添加和删除操作的时间复杂度为O(log n)。 | ||||
EnumSet | 是一个专为枚举类型设计的Set实现。 | 底层使用位向量实现,每个枚举常量都表示为一个位。 这种实现方式非常高效,尤其是当枚举类型有很少的值时。 |
||
底层使用位向量实现,非常高效且紧凑。 | ||||
只能在运行时知道所有的可能元素(即枚举类型的所有值)。 | ||||
CopyOnWriteArraySet | 是一个线程安全的Set实现。 | 底层使用CopyOnWriteArrayList来实现。 当进行修改操作时,会复制底层数组,而不是锁定它,从而允许多个线程同时读取数据,而不会影响写入操作。 |
||
在进行修改操作(如添加、删除)时,会复制底层数组,而不是锁定它。 | ||||
适用于读操作远多于写操作的并发场景。 | ||||
总结: | ||||
在选择适当的Set实现时,应考虑集合的大小、是否需要排序、并发需求以及内存使用情况等因素。 |
Map
接口 | ||||
Map | Java中的Map接口是Java集合框架的一部分,它表示一个对象映射到另一个对象的关系。Map中不能包含重复的键,但每个键可以映射到最多一个值。这个接口提供了将键映射到值的方法,键和值都可以是任何对象。 | |||
主要方法 | put(K key, V value) | 将指定的值与此映射中的指定键相关联。 | ||
get(Object key) | 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回null。 | |||
remove(Object key) | 如果存在一个键的映射关系,则将其从此映射中移除。 | |||
containsKey(Object key) | 如果此映射包含指定键的映射关系,则返回true。 |