list、set

ArrayList底层采用的数组实现存储,查询效率高,增加效率底,线程不安全。

LinkdList底层采用双向链表实现的存储。查询效率低,增删效率高,线程不安全。
在这里插入图片描述
为什么说它增删效率高呢,它就像小朋友手拉手,删除数据就把中间打断,让另外两个小朋友手拉手,增加也一样,不像数组,删除一个结点,就要重新拷贝。

Aector向量底层用数组实现的List,相关的方法都加了同步检查,因此”线程安全,效率低",比如,indexOf方法就增加了synchronized同步标记。
在这里插入图片描述

建议
如何选用ArrayList、LinkedList、Vector?
1、需要线程安全时,用Vector。(线程安全就代表效率底)
2、不存在线程安全问题时,并且查找较多多用ArrayLst(一般使用它)。
3、不存在线程安全问题时,增加或删除元素较多用LinkedList。

Map就是用来在存储"键(key)值(value)对"的,Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。
map接口的实现类有HashMap、TreeMap、HashTable、Properties等

HashMap底层实现采用了哈希表,基本结构“数组+链表”
(1)数组:占用空间连续。寻址容易、查询速度快,但是,增加和删除效率非常低。
(2)链表:占用空间不连续。寻址困难,查询速度慢。但是,增加删除效率非常高。
哈希表的本质就是"数组+链表";

一个entry对象存储了
1、key:键对象 value:值对象
2、next:下一个节点
3、hash:键对象的hash值
显然每一个entry对象就是一个单向链表结构。

在这里插入图片描述
然后,画出entry【】数组的结构(hashmap的结构):
在这里插入图片描述
一个数组里面存储很多个链表(初始大小16),然后一个链表里可以存储多个数据,这个数据里面包含着hash值、键、值和下一个节点。

TreeMap是红黑二叉的典型实现。
TreeMap和HashMap实现了同样的接口Map,因此,用法对于调用者来说没有区别。hashMap效率高于TreeMap;在需要排序的Map时才选用TreeMap

set接口
set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。
set容器特点:无序、不可重复。无序指set中的元素没有索引,我们只能遍历查找;不可重复指不允许加入重复的元素。更确切的讲,新元素如果和set中某个元素通过equals()方法对比为true,则不能加入;甚至,set中也只能放入null元素,不能多个。
set常用的实现类有:Hashset TreeSet等,我们一般使用hashset。

hashset是采用哈希算法实现,底层实际是用Hashmap实现的(hashset本质就是一个简化版的hashmap)因此,查询效率和增删效率都比较高。

hashset底层也是hashmap,只是把值都存在key里面,因为hashmap里面的key不能重复,所以这就是hashset不能重复的原因

TreeSet的底层实际是TreeMap实现的,内部维持了一个简化版的treemap,通过key来存储
set元素。treeset内部需要对存储的元素进行排序,因此,我们对应的类需要实现comparable接口。这样才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值