1,Java集合介绍
1.1集合是可以用于动态存放多个对象的一种类,简单来说就是一个放数据的容器,主要包括Collection(List和Set)和Map集合
集合与数组的不同在于,集合是大小可变的序列,而且元素类型可以不受限定,只要是引用类型。(集合中不能放基本数据类型,但可以放基本数据类型的包装类)
集合类可以自动扩容。
集合类全部支持泛型,是一种数据安全的用法。
1.2集合框架结构图
由图可知:Java集合主要由2大体系构成,分别是Collection
体系和Map
体系,其中Collection
和Map
分别是2大体系中的顶层接口。
Collection主要有三个子接口,分为List(列表)
、Set(集)
、Queue(队列)
。其中,List、Queue
中的元素有序不唯一,而Set
中的元素无序唯一。
1、 Collection(接口)。该接口下的所有子孙均存储的是单一对象。
2、 Map(接口)。该接口下的所有子孙均存储的是key-value(键值对)形式的数据。
另外还有三个分支,均是为上述两大家族服务的。
1、 Iterator(迭代器)。主要用于遍历Colleciton接口的及其子类而设计。
2、 Compartor(比较器), 在集合中存储对象时候,用于对象之间的比较
3、 Collecitons是工具类。注意该类名带个s,一般就表示工具类。里面提供了N多静态方法,来对Colleciton集合进行操作。
1.3各个集合的特点
ArrayList:
- 元素有序可重复。
- .每个元素都有对应的顺序索引,可通过索引访问指定位置的集合元素,默认按元素添加顺序设置索引(底层原理是数组结构)
- 基于数组结构的集合,查询效率高,可以自动扩容。
LinkedList:
- LinkedList的大小可以根据需要进行动态调整,不需要预先分配固定大小的内存空间。
- 与数组不同,LinkedList的节点之间的连接并不能直接访问。要访问特定位置的元素,必须从头节点开始遍历整个链表,直到找到目标位置。
- 由于LinkedList的节点之间通过指针进行连接,因此在链表中插入和删除节点的操作非常高效。
- LinkedList可以在任意位置插入或删除节点,而不会影响其他节点的连接。
- 相对于数组,LinkedList需要更多的内存空间来存储额外的指针信息。每个节点都需要一个指向下一个节点的指针,因此在存储大量元素时,可能会占用更多的内存空间。
HashSet:
- HashSet是Set接口的典型代表,一般说的set集合就是指HashSet。
- HashSet不保持元素的插入顺序,因此不能通过索引来访问元素。元素在HashSet中的位置是由其哈希值和桶的分配情况决定的。
- HashSet中的元素是唯一的,不能包含重复的元素。当尝试将重复元素添加到HashSet中时,添加操作将被忽略。
- HashSet不是线程安全的,如果在多个线程中同时修改HashSet,可能会导致不一致的结果。HashSet允许存储空元素(null),并且只能存储一个空元素。这意味着在HashSet中只能有一个空槽,如果尝试添加多个空元素,只有第一个能够成功添加。
TreeSet:
- 有序性:TreeSet中的元素是有序的,默认情况下按照元素的自然排序进行排序。其次也可以通过提供自定义比较器(Comparator)来指定元素的排序规则。
- 自动排序:当向TreeSet中添加或删除元素时,集合会自动根据排序规则重新排序,以确保元素始终处于有序状态。这意味着在遍历TreeSet时,元素将按照排序规则的顺序进行访问。
- 唯一性:TreeSet中的元素是唯一的,不能包含重复的元素。与HashSet类似,如果尝试将重复元素添加到TreeSet中,添加操作将被忽略。高效的插入、删除和查找操作:由于TreeSet基于红黑树的数据结构实现,插入、删除和查找操作的时间复杂度通常为O(log n),其中n是TreeSet中元素的数量。这使得TreeSet在大多数情况下比线性结构(如ArrayList)具有更快的操作速度。
- 不支持null元素:TreeSet不支持存储null元素,如果尝试将null元素添加到TreeSet中,将抛出NullPointerException。
HashMap:
- 键值对存储:HashMap通过键值对的方式来存储数据,每个键值对包含一个唯一的键和对应的值。通过键可以快速获取对应的值。
- 高效的插入、删除和查找操作:由于HashMap基于哈希表的数据结构实现,插入、删除和查找操作的平均时间复杂度为O(1),即常数时间。只需要根据键的哈希值进行计算和索引操作即可。
- 无序性:HashMap中的键值对没有固定的顺序,并不保持插入的顺序。如果需要有序性,可以考虑使用LinkedHashMap。
- 键的唯一性:HashMap中的键是唯一的,不能包含重复的键。当尝试将重复键添加到HashMap中时,新值将会覆盖旧值。
- 允许null键和null值:HashMap允许存储null键和null值,可以将null作为键或值进行存储。
TreeMap:
- 有序性:TreeMap中的键值对是根据键的自然顺序或自定义比较器进行排序并保持有序状态。这使得在遍历TreeMap时,键值对按照排序规则进行访问。
- 自动排序:当向TreeMap中添加或删除键值对时,集合会根据排序规则自动重新排序,以确保键值对始终处于有序状态。
- 键的唯一性:TreeMap中的键是唯一的,不能包含重复的键。如果尝试将重复键添加到TreeMap中,新值将会覆盖旧值。
- 高效的插入、删除和查找操作:由于TreeMap基于红黑树的数据结构实现,插入、删除和查找操作的时间复杂度通常为O(log n),其中n是TreeMap中键值对的数量。这使得TreeMap在大多数情况下比线性结构(如ArrayList)具有更快的操作速度。
- 不支持null键:TreeMap不支持存储null键,如果尝试将null键添加到TreeMap中,将抛出NullPointerException异常。
- 允许null值:TreeMap允许存储null值,可以将null作为值进行存储。