Java 集合框架包括以下接口:
Collection 接口:表示一组对象,用于存储和操作这些对象。
List 接口:继承自 Collection 接口,表示一组有序的对象。
Set 接口:继承自 Collection 接口,表示一组无序的、唯一的对象。
Map 接口:表示一组键值对,其中每个键对应一个唯一的值。
Java 集合框架包括以下类:
ArrayList 类:实现了 List 接口,使用动态数组来存储对象。
LinkedList 类:实现了 List 接口,使用双向链表来存储对象。
HashSet 类:实现了 Set 接口,使用哈希表来存储对象。
TreeSet 类:实现了 Set 接口,使用红黑树来存储对象。
HashMap 类:实现了 Map 接口,使用哈希表来存储键值对。
TreeMap 类:实现了 Map 接口,使用红黑树来存储键值对。
Java 集合框架提供了许多方法来操作集合中的元素,例如添加、删除、查找等。同时,Java 集合框架还支持迭代器(Iterator)和 foreach 循环,使得遍历集合变得非常方便。
HashMap 是 Java 集合框架中的一种实现,它实现了 Map 接口,使用哈希表来存储键值对。HashMap 允许使用 null 作为键或值,但是要注意 null 值可能会引发 NullPointerException。从下图中可以看出,HashMap底层就是一个数组结构,数组中的每一项又是一个链表或者红黑树。当新建一个HashMap的时候,就会初始化一个数组。
Open image-20240217-055631.png image-20240217-055631.png HashMap 的特点包括:
键和值都可以为 null。
非线程安全的,不适用于多线程环境。
不保证元素的顺序,遍历时可能是随机的。
基于哈希表实现,插入、删除和查找元素的时间复杂度为 O(1)。
HashMap 的基本操作包括:
添加元素:使用 put(key, value) 方法添加元素到 HashMap 中。
获取元素:使用 get(key) 方法获取指定键对应的值。
删除元素:使用 remove(key) 方法删除指定键对应的元素。
遍历元素:使用迭代器(Iterator)或者 foreach 循环遍历 HashMap 中的元素。
注意,由于 HashMap 不保证元素的顺序,如果需要保证元素的顺序,可以使用 LinkedHashMap 类来替代 HashMap。如果需要在多线程环境中使用 Map,可以使用 ConcurrentHashMap 类来替代 HashMap,它是线程安全的。
LinkedList 是 Java 集合框架中的一种实现,实现了 List 接口,使用双向链表来存储元素。LinkedList 允许添加 null 元素,但要注意 null 值可能会引发 NullPointerException。
LinkedList 的特点包括:
非线程安全的,不适用于多线程环境。
内部实现是双向链表,插入、删除元素的时间复杂度为 O(1),查找元素的时间复杂度为 O(n)。
支持快速的添加和删除操作,但是访问元素的速度相对较慢。
可以用作栈、队列、双向队列等数据结构的实现。
LinkedList 的基本操作包括:
添加元素:使用 add() 方法将元素添加到 LinkedList 的末尾。
获取元素:使用 get() 方法获取指定位置的元素。
删除元素:使用 remove() 方法删除指定位置的元素。
插入元素:使用 add(index, element) 方法在指定位置插入元素。
遍历元素:使用迭代器(Iterator)或者 foreach 循环遍历 LinkedList 中的元素。
需要注意的是,在需要频繁访问元素的情况下,LinkedList 的性能可能不如 ArrayList,因为访问元素的时间复杂度为 O(n)。
ArrayList 是 Java 集合框架中的一种实现,实现了 List 接口,使用动态数组来存储元素。ArrayList 允许添加 null 元素,但要注意 null 值可能会引发 NullPointerException。
ArrayList 的特点包括:
非线程安全的,不适用于多线程环境。
内部实现是动态数组,插入、删除元素的时间复杂度为 O(n),查找元素的时间复杂度为 O(1)。
支持随机访问,可以快速地获取指定位置的元素。
适用于需要频繁访问元素、但是不经常进行插入、删除操作的情况。
ArrayList 的基本操作包括:
添加元素:使用 add() 方法将元素添加到 ArrayList 的末尾。
获取元素:使用 get() 方法获取指定位置的元素。
删除元素:使用 remove() 方法删除指定位置的元素。
插入元素:使用 add(index, element) 方法在指定位置插入元素。
遍历元素:使用迭代器(Iterator)或者 foreach 循环遍历 ArrayList 中的元素。
需要注意的是,在需要频繁进行插入、删除操作的情况下,ArrayList 的性能可能不如 LinkedList,因为插入、删除元素的时间复杂度为 O(n)。
HashSet 是 Java 集合框架中的一种实现,实现了 Set 接口,使用哈希表来存储元素。HashSet 不允许存储重复元素,也不保证元素的顺序。HashSet 允许使用 null 元素,但要注意 null 值可能会引发 NullPointerException。
HashSet 的特点包括:
非线程安全的,不适用于多线程环境。
内部实现是哈希表,插入、删除、查找元素的时间复杂度为 O(1)。
不保证元素的顺序,遍历时可能是随机的。
适用于需要存储唯一元素的情况。
HashSet 的基本操作包括:
添加元素:使用 add() 方法将元素添加到 HashSet 中。
删除元素:使用 remove() 方法删除指定元素。
判断元素是否存在:使用 contains() 方法判断指定元素是否存在于 HashSet 中。
遍历元素:使用迭代器(Iterator)或者 foreach 循环遍历 HashSet 中的元素。
需要注意的是,在需要按顺序遍历元素的情况下,应该使用 TreeSet 类来代替 HashSet,因为 TreeSet 可以保证元素的顺序。
TreeSet 是 Java 集合框架中的一种实现,实现了 SortedSet 接口,使用红黑树来存储元素。TreeSet 不允许存储重复元素,可以按照元素的自然顺序或者指定的比较器进行排序。TreeSet 允许使用 null 元素,但要注意 null 值可能会引发 NullPointerException。
TreeSet 的特点包括:
非线程安全的,不适用于多线程环境。
内部实现是红黑树,插入、删除、查找元素的时间复杂度为 O(log n)。
元素可以按照自然顺序或者指定的比较器进行排序。
不允许存储重复元素。
适用于需要存储有序、唯一元素的情况。
TreeSet 的基本操作包括:
添加元素:使用 add() 方法将元素添加到 TreeSet 中。
删除元素:使用 remove() 方法删除指定元素。
判断元素是否存在:使用 contains() 方法判断指定元素是否存在于 TreeSet 中。
遍历元素:使用迭代器(Iterator)或者 foreach 循环遍历 TreeSet 中的元素。
需要注意的是,在使用 TreeSet 时,要保证元素实现了 Comparable 接口或者指定了比较器,否则会抛出 ClassCastException 异常。
TreeMap 是 Java 集合框架中的一种实现,实现了 SortedMap 接口,使用红黑树来存储键值对。TreeMap 可以按照键的自然顺序或者指定的比较器进行排序。TreeMap 不允许键为 null,但允许值为 null。
TreeMap 的特点包括:
非线程安全的,不适用于多线程环境。
内部实现是红黑树,插入、删除、查找键值对的时间复杂度为 O(log n)。
键可以按照自然顺序或者指定的比较器进行排序。
不允许键为 null。
适用于需要存储有序、唯一键值对的情况。
TreeMap 的基本操作包括:
添加键值对:使用 put() 方法添加键值对到 TreeMap 中。
删除键值对:使用 remove() 方法删除指定键的键值对。
获取键值对:使用 get() 方法获取指定键的值。
判断键是否存在:使用 containsKey() 方法判断指定键是否存在于 TreeMap 中。
遍历键值对:使用迭代器(Iterator)或者 foreach 循环遍历 TreeMap 中的键值对。
需要注意的是,在使用 TreeMap 时,要保证键实现了 Comparable 接口或者指定了比较器,否则会抛出 ClassCastException 异常。
Hashtable 是 Java 集合框架中的一种实现,它实现了 Map 接口,可以存储键值对。Hashtable 的特点包括:
线程安全的,适用于多线程环境。
内部使用数组实现,插入、删除、查找键值对的时间复杂度为 O(1)。
键和值都不能为 null。
不保证键值对的顺序。
Hashtable 的基本操作包括:
添加键值对:使用 put() 方法添加键值对到 Hashtable 中。
删除键值对:使用 remove() 方法删除指定键的键值对。
获取键值对:使用 get() 方法获取指定键的值。
判断键是否存在:使用 containsKey() 方法判断指定键是否存在于 Hashtable 中。
遍历键值对:使用迭代器(Iterator)或者 foreach 循环遍历 Hashtable 中的键值对。
需要注意的是,在使用 Hashtable 时,键和值都不能为 null。如果尝试使用 null 作为键或值,会抛出 NullPointerException 异常。此外,Hashtable 的遍历方式不保证键值对的顺序,如果需要有序遍历,可以使用 TreeMap。在 Java 1.2 之后,推荐使用 HashMap 来替代 Hashtable。
Vector 是 Java 集合框架中的一种实现,它实现了 List 接口,可以存储一组有序的元素。与 ArrayList 不同,Vector 是线程安全的,适用于多线程环境。
Vector 的特点包括:
线程安全的,适用于多线程环境。
内部使用数组实现,插入、删除、查找元素的时间复杂度为 O(1)。
可以在任意位置插入和删除元素,不需要先移动其他元素。
支持在指定位置插入和删除多个元素。
自动调整容量大小,以适应元素数量的变化。
可以通过枚举器(Enumerator)或迭代器(Iterator)遍历元素。
可以通过子列表(subList)获取部分元素。
Vector 的基本操作与 ArrayList 类似,包括:
添加元素:使用 add() 方法将元素添加到 Vector 的末尾。
插入元素:使用 add() 方法的重载版本,在指定位置插入元素。
删除元素:使用 remove() 方法删除指定位置的元素。
获取元素:使用 get() 方法获取指定位置的元素。
判断元素是否存在:使用 contains() 方法判断指定元素是否存在于 Vector 中。
获取元素数量:使用 size() 方法获取 Vector 中元素的数量。
在使用 Java 集合类时,我们需要根据具体的需求来选择合适的集合类。常用的集合类包括:
ArrayList:适用于需要快速随机访问元素的情况,但在插入、删除元素时效率较低。
LinkedList:适用于频繁插入、删除元素的情况,但在随机访问元素时效率较低。
HashSet:适用于存储无序、唯一元素的情况,对于重复元素会进行自动去重。
TreeSet:适用于需要对元素进行排序和去重的情况,内部使用红黑树实现。
HashMap:适用于需要根据键快速查找值的情况,内部使用哈希表实现,对于重复键会进行自动覆盖。
TreeMap:适用于需要按照键进行排序的情况,内部使用红黑树实现。
需要根据具体的需求来选择合适的集合类。例如,如果需要存储有序、唯一元素,可以使用 TreeSet;如果需要根据键快速查找值,可以使用 HashMap。此外,还需要考虑到线程安全、性能、内存占用等方面的因素。如果在多线程环境下使用集合类,可以考虑使用线程安全的集合类,例如 ConcurrentHashMap 和 CopyOnWriteArrayList 等。如果对性能和内存占用有严格要求,可以考虑使用基本类型的集合类,例如 IntArrayList 和 LongHashSet 等。