※Java中的集合(数据结构)
--线性表
--链表
--栈
--队列
--散列表
--二叉树
--映射关系(key-value)
List集合:
ArrayList:ArrayList是线程不安全的、物理地址上是连续的
--有序的、可重复的、线性结构的(线性表)
List的工作原理:底层是通过数组来实现的,当存储的数据到达一定的个数的时候,会扩充集合的容量
//注意:所有的集合中存放的数据都是引用类型
练习:自己来实现一个ArraysList【根据工作原理来实现】
--添加
--删除
--替换
--遍历
Vector:Vector是线程安全的、有序的、可重复的
Vector中有一个子类Stack,是一个栈结构的集合,工作原理是先进后出 后进先出
LinkedList:是链表结构的集合、物理地址上不是连续的,通过引用指针的形式进行关联
--有序的、可重复的
LinkedList:即实现了Dueue列的接口,也实现了List的接口,拥有了队列和List的功能
思考:LinkedList和ArrayList的区别
LinkedList有对列的功能,ArrayList只有List的功能
练习:自己来实现一个LinkedList
练习:
Set集合:HashSet、LinkedHashSet、TreeSet
(无序的、不可重复的)
※HashSet:散列表结构
※LinkedHashSet:
它的特点:
利用了一个链表来维护迭代时的顺序, 所以输出元素时的顺序与插入时的顺序一致。但是存储位置依然是无序的 (不能通过下标访问)。
※TreeSet:
TreeSet 是利用红黑树的数据结构来存储元素的。
红黑树是一种平衡二叉树, 在添加和删除元素时, 会根据自身的情况调整树的结构, 而保持树的平衡性。
TreeSet 的使用有以下问题, 需要注意 :
add() 的进去的数据:
01 - 必须保证是同一种类型。
02 - 该类型必须是可排序的(元素必须实现某种协议) 。
即: 实现了 Comparable 接口。
自然排序的实现方法 : 存储的数据类型要实现 Comparable 接口, 重写 compareTo 方法
定制排序的实现方法 : 定义一个类实现 Comparator 接口, 重写 compare方法
练习:
使用二叉树存储学生
--name\sex\age\学科对象
--学科类
--subname
--scores
要求:根据学生的学科成绩进行排序
思考:Set集合和List哪一个可以根据索引获取元素
Set是无序的使用散列表结构存储数据,所以是不能通过索引来获取数据,而List是线性结构的,在存储上是连续的内存空间,所以List可以使用索引来获取数据
Queue集合:
PriorityQueue(队列):先进先出
--add添加数据
--poll获取并移除头部元素
Deque:双向队列(LinkedList、ArrayDeque)
(1) Deque 是 Queue 子接口。
(2) 在单向队列的基础上扩展, 双头出入队的功能。
入队:
addFirst(), offerFirst()
addLast(), offerLast()
出队:
pollFirst(), pollLast()
removeFirst(), removeLast()
获取元素
getFirst(), getLast()
peekFirst(), peekLast()
(3) 当栈来使用。
push(), pop()
Map集合:
什么是 Map ?
--map 是指一种用来存放映射关系数据的容器。
什么是映射关系 ?
--映射关系是指用一个键, 与一个值所组成的关系对一个键对应到一个值, 这个键是不能重复的, 所以, 通过键就能找到对应的值。
HashMap:无序 不能重复(key不能重复,如果有出现重复的则后面的覆盖前面的数据)
--使用put方法添加键值对数据,其中key可以为null
Hashtable 特性
[1] 是一个线程不安全的 Map 实现类
[2] 允许插入值为 null 的 key
遍历操作:
HashTable:无序 不能重复(key不能重复,如果有出现重复的则后面的覆盖前面的数据)
--使用put方法添加键值对数据,其中key不可以为null
Hashtable 特性
[1] 是一个线程安全的 Map 实现类
[2] 为了保证同步性, 性能比 HashMap 要差
[3] 不允许插入值为 null 的 key
[4] 底层使用散列表的存储方式(与 HashMap一致)
HashTable遍历操作:
LinkedHashMap通过链表来维护了数据插入的顺序 (和LinkedHashSet类似)
TreeMap通过二叉树结构进行存储(和TreeSet类似),是根据key来进行排序的,注意TreeMap中key需要实现可比较接口,value不需要
集合工具类
--排序Collections.sort(list);
--反转Collections.reverse(list);
--洗牌Collections.shuffle(list);
--交换Collections.swap(list, 1, 3);
--交换所有i处和j处的元素
--替换Collections.replaceAll(list, "123", "789");
--替换所有old的元素
--二分查找Collections.binarySearch(list, "12.33");
--集合需要正序排序
--复制操作Collections.copy(dest, src);
--来源集合src的长度要小于dest复制的目标集合的长度 copy(dest, src);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结