回炉重造java----单列集合(List,Set)

体系结构 : 集合主要分为两种,单列集合collection 和双列集合**Map,**区别在于单列集合一次插入一条数据,而双列的一次插入类似于key-value的形式

单列集合collection

注:红色的表示是接口,蓝色的是实现类

①操作功能:

增加: add(),List的新增一定是成功的,而Set不一定因为其有不能重复的限制条件

清空:clear()

删除:remove(),因为collection中定义的是共性的方法,所以删除不能通过索引去删除

判断是否存在:contains(),其底层是通过equals()方法实现的,因为equals()方法是基于比较地址值,所以如果集合中存的是对象的话,要重写equals()方法才能进行contains的比较

判断是否为空:isEmpty()

返回集合大小:size()

②遍历方式:

集合的遍历方式有三种,分别是迭代器遍历,增强for遍历和lambda表达式遍历

**迭代器(Iterator)遍历:**创建Iterator对象进行遍历

注: 迭代完毕指针不会复位;循环中next()只能用一次;迭代过程中不允许使用集合的方法增加删除

**增强for遍历:**底层其实就是迭代器

注: 集合名.for快速生成;对s中的修改不对集合的原数据有影响

**Lambda表达式(foreach)遍历:**底层就是遍历集合通过accept方法依次过的元素

③List

注: remove的时候如果有方法重载了,优先调用形参和实参类型一样的方法。remove(1)是索引

**遍历方式:**相比于collection的3种遍历方式,List当然全部继承了,但是因为List有了索引的机制,所以List还增加了两种,普通的for循环和列表迭代器(listIterator)

数据结构:

ArrayList详解:底层是数组

源码:

①创建ArrayList时是一个长度为0的elementData

②在插入第一个元素时,将扩容为长度为10的数组,然后把数据放进去

①当原数组的长度已经用完了,底层就要去扩容,默认是扩容原数组长度的一半,即1.5倍

②如果插入的数据长度很大,就会扩容到大长度的地方

LinkedList详解:底层是双向链表

注: 这里的方法基本不用,而是基本使用List的方法

源码:学了数据结构中的双向链表就可以清楚的知道其操作流程

④Set

泛型:

泛型的作用:

java中的泛型其实是伪泛型:即其实底层存的时候依然是object对象,泛型会擦除

泛型可以定义在类上,也可以定义在方法上,还可以定义在接口上

HashSet详解: 底层是哈希表,jdk8之前是数组+链表,jdk8之后是数组+链表+红黑树

**存数据的过程:**①由hashcode计算出应存入的位置②如果位置是空就放进去③如果不为空,则调用equals方法去判断是否一样的,如果一样的就不存④如果不一样的话,jdk8之前是把新元素放进去,老元素取出来挂在新元素后面,而jdk8之后就是直接把新元素挂在老元素的后面

注意点:

LinkedHashSet详解: 底层跟HashSet一样,不过在其基础上加上了数据之间的双向链表结构,使得其变成有序的

TreeSet详解: 底层是红黑树,性能好

总结:各种单列集合的应用场景:

相关推荐
诗书画唱1 分钟前
【前端教程】JavaScript 实现图片鼠标悬停切换效果与==和=的区别
开发语言·前端·javascript
岁忧3 分钟前
(LeetCode 面试经典 150 题) 200. 岛屿数量(深度优先搜索dfs || 广度优先搜索bfs)
java·c++·leetcode·面试·go·深度优先
phiilo8 分钟前
golang 设置进程退出时kill所有子进程
后端
花花无缺8 分钟前
python自动化-pytest-用例发现规则和要求
后端·python
程序员小假11 分钟前
我们来说一说 Cglib 与 JDK 动态代理
后端
一枝小雨11 分钟前
【C++】Vector完全指南:动态数组高效使用
开发语言·c++·笔记·vector·学习笔记·std库
诗书画唱20 分钟前
【前端教程】JavaScript DOM 操作实战案例详解
开发语言·前端·javascript
jiaway41 分钟前
【C语言】第一课 环境配置
c语言·开发语言
liliangcsdn42 分钟前
结合prompt分析NodeRAG的build过程
java·服务器·人工智能·数据分析·知识图谱
黑色的山岗在沉睡1 小时前
LeetCode 189. 轮转数组
java·算法·leetcode