JAVA集合之Set、List、Map

目录

三种集合类型

集合与数组的区别

长度区别

内容区别

List

ArrayList

特点:

实现原理:

LinkedList 

特点:

实现原理:

Vector 

特点:

Map

Hashmap

特点:

实现原理:

TreeMap

特点:

Set

HashSet

特点:

实现原理:

TreeSet

特点:

LinkedHashSet 

特点:


三种集合类型

List:有序且可重复的集合

Set:无序且不重复的集合

Map:key-value形式有映射关系的集合

集合与数组的区别

长度区别

  • 数组定长
  • 集合可变长度

内容区别

  • 数组的内容既可以是基本数据类型也可以是引用数据类型,但是只能同时存放一种数据类型
  • 集合只能存放引用数据类型,但是可以同时存储不同引用类型的数据

List

对于List集合,数据按顺序插入,数据可重复,可以直接通过索引来操作数据

下面是三个实现类:

ArrayList

特点:

  • ArrayList是集合的一个实现类
  • ArrayList内部封装了一个Object类型的对象,默认长度为0,长度可变,每次变为当前长度的1.5倍
  • ArrayList查询快,增删改慢
  • ArrayList线程不安全

实现原理:

  1. ArrayList 是 List 接口的可变数组非同步实现,并允许包括 null 在内的所有元素
  2. 底层使用数组实现
  3. 该集合是可变长度数组,数组扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量增长大约是其容量的 1.5 倍,这种操作的代价很高
  4. 采用了 Fail-Fast 机制,面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险
  5. remove 方法会让下标到数组末尾的元素向前移动一个单位,并把最后一位的值置空

LinkedList 

特点:

  • LinkedList 是集合的一个实现类
  • LinkedList 内部封装了一个双线链表
  • LinkedList 查询慢,增删改快
  • LinkedList 线程不安全

实现原理:

  • LinkedList 是 List 接口的双向链表非同步实现,并允许包括 null 在内的所有元素
  • 底层的数据结构是基于双向链表的,该数据结构我们称为节点
  • 双向链表节点对应的类 Node 的实例,Node 中包含成员变量:prev,next,item。其中,prev 是该节点的上一个节点,next 是该节点的下一个节点,item 是该节点所包含的值
  • 它的查找是分两半查找,先判断 index 是在链表的哪一半,然后再去对应区域查找,这样最多只要遍历链表的一半节点即可找到

Vector 

特点:

  • Vector 数据结构为数组
  • Vector 查询慢,增删改快,且有索引
  • Vector 单线程且线程安全

Map

Hashmap

特点:

  • 底层结构为链表+数组,在JDK8中存储结构变为来了红黑树
  • 以Key-Value形式存储数据
  • Key具有唯一性,当有重复Key时会覆盖旧数据
  • 数据存储无序性
  • Key与Value都可以为空,空Key视为一个有效key,只允许有一个空Key

实现原理:

  1. HashMap 是基于哈希表的 Map 接口的非同步实现,允许使用 null 值和 null 键,但不保证映射的顺序
  2. 底层使用数组实现,数组中每一项是个单向链表,即数组和链表的结合体;当链表长度大于一定阈值时,链表转换为红黑树,这样减少链表查询时间
  3. HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Node 对象。HashMap 底层采用一个 Node [] 数组来保存所有的 key-value 对,当需要存储一个 Node 对象时,会根据 key 的 hash 算法来决定其在数组中的存储位置,在根据 equals 方法决定其在该数组位置上的链表中的存储位置;当需要取出一个 Node 时,也会根据 key 的 hash 算法找到其在数组中的存储位置,再根据 equals 方法从该位置上的链表中取出该 Node
  4. HashMap 进行数组扩容需要重新计算扩容后每个元素在数组中的位置,很耗性能
  5. 采用了 Fail-Fast 机制,通过一个 modCount 值记录修改次数,对 HashMap 内容的修改都将增加这个值。迭代器初始化过程中会将这个值赋给迭代器的 expectedModCount,在迭代过程中,判断 modCount 跟 expectedModCount 是否相等,如果不相等就表示已经有其他线程修改了 Map,马上抛出异常

TreeMap

特点:

  • TreeMap是Key-Value集合
  • 数据结构为红黑树
  • 不允许数据重复
  • 插入无序
  • Key有序,内部会对key进行排序,Key必须能实现自然排序或定制排序

Set

HashSet

特点:

  • HashSet底层使用HashMap
  • 元素不能重复
  • 元素无序
  • 线程不安全

实现原理:

  1. HashSet 由哈希表 (实际上是一个 HashMap 实例) 支持,不保证 set 的迭代顺序,并允许使用 null 元素
  2. 基于 HashMap 实现,API 也是对 HashMap 的行为进行了封装,可参考 HashMap

TreeSet

特点:

  • TreeSet内部急用TreeMap实现
  • TreeSet的插入是无序的
  • TreeSet输出是有序的,在内部会自己排序
  • 数据同样需要自然排序或定制排序
  • 值不能为null
  • 数据不能重复
  • 线程不安全

LinkedHashSet 

特点:

  • LinkedHashSet 底层使用HashSet
  • 插入有序且用链表维护
  • 元素唯一
  • 线程不安全

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值