前言
什么是集合
集合是用来存储数据的容器。
我们都知道数组也是用来存储数据的容器,但是数组初始化之后只能储存定长的数据,而我们在实际的开发中经常会遇到初始化时并不知道数据长度的情况(况且长度这个属性通常不是非常重要的属性,没有必要在创建它的时候就指定),于是出现了集合。集合长度可变,可储存不同类型的数据。
数组与集合区别:
数组 | 集合 | |
---|---|---|
长度 | 不可变 | 可变 |
内容 | 基本数据类型,引用数据类型 | 引用数据类型(装箱) |
元素 | 只能存放同一种数据类型 | 可以存放不同种数据类型 |
前置课程:数据结构
数组、链表、红黑树。
数组
在一块连续的物理内存上,所以查询快。但是增删慢,因为如果改变长度通常需要重新分配内存,或者将定点插入的后面的元素全部移动位置。
链表
不是在一块连续的内存上,通过本节点的下一个元素的地址(指针域)找到下一个元素。增删快,查询慢。
红黑树
红黑树是平衡二叉查找树,保证了查找速度。
红黑树是每个节点都带有颜色属性的平衡二叉查找树 ,颜色为红色或黑色。除了二叉查找树一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
(1) 节点是要么红色或要么是黑色。
(2) 根一定是黑色节点。
(3) 每个叶子结点都带有两个空的黑色结点(称之为NIL节点,它又被称为黑哨兵)。
(4) 每个红色节点的两个子节点都是黑色(或者说从每个叶子到根的所有路径上不能有两个连续的红色节点)。
(5) 从任一节点到它所能到达得叶子节点的所有简单路径都包含相同数目的黑色节点。
这些性质保证了根节点到任意叶子节点的路径长度,最多相差一半(因为路径上的黑色节点相等,差别只是不能相邻的红色节点个数),所以红黑树是一个基本平衡的二叉搜索树,它没有AVL树那么绝对平衡,但是同样的关键字组成的红黑树相比AVL旋转操作要少,而且删除操作也比 AVL 树效率更高,实际应用效果也比 AVL 树更出众。当然红黑树的具体实现也复杂的多。
————————————————
原文链接:https://blog.csdn.net/hc372893308/article/details/97394857
概述:集合体系结构![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ac032041ac378b52e027738deba24504.png#pic_center)
注:上图中粉红色的为接口,紫色的和蓝色框为实现类。
数据结构底层
ArrayList:数组
LinkedList:链表
Vector:数组
HashSet:哈希表(数组+单链表)(数组+单链表+红黑树)
LinkedHashSet:哈希表(数组+双链表)(数组+双链表+红黑树)
TreeSet:红黑树
HashMap:哈希表(数组+单链表)(数组+单链表+红黑树)
LinkedHashMap:哈希表(数组+双链表)(数组+双链表+红黑树)
Hashtable:哈希表
详解
Collection(单列集合)
Collection主要方法:
add、remove、clear、size、toArray、contains、isEmpty、iterator、addAll、removeAll
List
特点:可重,存取有序。
它利用索引(index),定义了一些特殊方法:
get(int index) 获取指定位置的元素;remove(int index)移除指定位置的元素;
add(int index,E e) 将元素添加到指定位置;set(int index,E e) 用元素替换指定位置的元素;
ArrayList
数据结构:数组。
特点:增删慢,查询快。
常用方法:
LinkedList
数据结构:双链表。
特点:增删快,查询慢。
Vector
数据结构:数组。
特点:增删慢,查询快。
线程安全,效率低
迭代器
为什么需要迭代器?
迭代:对过程的重复,称为迭代。迭代器是遍历Collection集合的常用方式
迭代器的常用方法
next():返回迭代的下一个元素
hasNext():如果仍有元素可以迭代,则返回true
注意:列表迭代器是List体系独有的遍历方式,可以在对集合遍历的同时进行添加、删除等操作
但是必须通过调用列表迭代器的方法来实现
区别:ArrayList和Vector
- 线程同步,Vector线程安全,ArrayList线程不安全,因为Vector的实现有synchronized锁
- 效率问题,Vector效率低,ArrayList效率高
- 增长数量,Vector以2倍增长,ArrayList以1.5倍增长
Set
特点:存取无序,不可重。查询快。
HashSet
数据结构:JDK1.8之前:哈希表(数组+单向链表);JDK1.8之后:哈希表(数组+单向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
LinkedHashSet
数据结构:JDK1.8之前:哈希表(数组+双向链表);JDK1.8之后:哈希表(数组+双向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
sortedSet
TreeSet
数据结构:红黑树
Map(双列集合)
特点:由键值对(key-value)构成,key不可重,value可重。查询快。
Map的主要方法有:
put、get、keySet、values、entrySet、clear、remove、isEmpty
ps:Map集合必须保证保证key唯一,作为key,必须重写hashCode方法和equals方法,以保证key唯一。
HashMap
数据结构:JDK1.8之前:哈希表(数组+单向链表);JDK1.8之后:哈希表(数组+单向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
LinkedHashMap
数据结构:JDK1.8之前:哈希表(数组+双向链表);JDK1.8之后:哈希表(数组+双向链表+红黑树),当链表长度超过阈值(8)时,链表将转换为红黑树。
HashTable(基本不用)
数据结构:哈希表
Properties
SortedMap
TreeMap
数据结构:红黑树
参考文章:https://blog.csdn.net/weixin_42559574/article/details/108203595?utm_source=app&app_version=4.5.5
https://blog.csdn.net/m0_46308149/article/details/110562979?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161689569216780262555574%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161689569216780262555574&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-3-110562979.pc_search_result_before_js&utm_term=%E9%9B%86%E5%90%88