集合专题·拔高·壹

1 Collection单列集合、Map双列集合

在这里插入图片描述

1.1 Collection单列集合

每个元素只包含一个值

1.1.1 Collection单列集合及其实现类

在这里插入图片描述

1.1.1.1 list集合与Array数组

list集合:添加的元素是有序的、可重复的、有索引

  • list转换为数组:调用List实现类(多态)的toArray方法

Array数组:数组只能存储一类元素、数组有索引、可以重复、数组初始化时需要指定大小list无需

  • 数组转换成list:调用Arrays(加s的大部分情况都是工具类)的asList方法。
1.1.1.1.1 ArrayList

ArrayList底层基于数组实现:查询较快、增删较慢

  • 查询较快:查询时候有索引
  • 增删较慢:每增加或者删除一个,后边的元素都需要移动

底层基于数组实现,特点:有序、可重复、有索引

1.1.1.1.2 LinekdList

LinekdList底层基于双向循环链表实现:查询较慢、增删较快

  • 查询慢:双向链表有头、尾节点查询一个一个查找需确认这两个节点所以慢
  • 增删快:根据头尾节点便可完成删除、增加操作

基于双向链表实现:有序、可重复、有索引

1.1.1.1.2 Vector

Vector:线程安全的,性能低,已逐渐被ArrayList取代。

1.1.1.1.2.1 ArrayList、Vector (线程安全)的区别是什么
VectorArrayList
线程安全的线程不安全(单线程使用)
扩容时,Vector扩容100%ArrayList 扩容50%(节省内存)
单线程环境,我们使用ArrayList
1.1.1.1.2.2 哪些集合类是线程安全的

① Vector:比ArrayList多了同步锁机制
② Stack :堆栈类,先进后出,不常用
③ Hashtable:比HashtMap就多了个线程安全(性能就低了),所以还是建议HashtMap

1.1.1.2 Set集合

无序(存取顺序不一致)、不重复、无索引

1.1.1.2.1 HashSet

HashSet:无序、不重复、无索引

1.1.1.2.1.1 HashSet底层原理(JDK8前后)

JDK8之前:哈希表=数组+链表

在这里插入图片描述
① 创建长度16的数组,默认加载因子0.75,数组名table。
② 使用元素的哈希表对数组长度求余,计算存入位置。
③ 判断当前位置是否为null,如果是null直接存入。
④ 如果不为null,表示有元素,则用equals(Object的方法底层还是“==”)进行比较。

  • JDK8之前,新元素存入数组,占老元素位置,老元素挂新的下边。
  • JDK8之后,新元素挂老元素下边。

JDK8以后:哈希表=数组+链表+红黑树

在这里插入图片描述
① 链表特点:增删快(有头尾节点),查询慢(需确认头尾节点)
② 当链表长度大于8且数组长度大于64时,将链表自定转为红黑树。
注意:红黑树数据小于6,自动切换为链表。
③ 新元素存储进数组时,直接挂在老元素下边(JDK8之前,将老元素挂新元素下边)

1.1.1.2.2 LinkedHashSet

LinkedHashSet(底层有链表):有序、不重复、无索引

1.1.1.2.3 TreeSet

TreeSet(底层有树,树可以排序):排序(默认升序,联想左小右大)、不重复、无索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值