回炉重造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详解: 底层是红黑树,性能好

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

相关推荐
大鸡腿同学21 分钟前
后端
IT_陈寒32 分钟前
Vite 凭什么比 Webpack 快50%?揭秘闪电构建背后的黑科技
前端·人工智能·后端
颜酱33 分钟前
Dijkstra 算法:从 BFS 到带权最短路径
javascript·后端·算法
aircrushin2 小时前
OpenClaw“养龙虾”现象的社会技术学分析
前端·后端
37手游后端团队2 小时前
全网最简单!从零开始,轻松把 openclaw 小龙虾装回家
人工智能·后端·openai
用户8307196840822 小时前
Spring Boot WebClient性能比RestTemplate高?看完秒懂!
java·spring boot
Apifox2 小时前
测试数据终于不用到处复制了,Apifox 自动化测试新增「共用测试数据」
前端·后端·测试
Gardener1722 小时前
OpenStack Instance ID 映射机制详解
后端
无责任此方_修行中3 小时前
拒绝 AI 焦虑!一个普通程序员的真实 AI 工作流(附成本账单)
后端·程序员·ai编程