2021-04-19常见的集合(List、Set)

24 篇文章 1 订阅

集合Collection(List,Set)

集合的简略图

集合的框架

  • Collection接口存储一组不唯一,无序的对象
    -List接口存储一组 不唯一,无序的对象 #F44336
  • Set接口存储一组唯一,无序的对象 #F44336
  • Map接口存储一组键值对象 #F44336,提供key到value的映射
    • Key唯一 无序 #F44336
    • value 不唯一 无序 #F44336
List集合

List集合的主要实现类有ArrayList和LinkList,分别是数据结构中顺序表和链表的实现。另外还包括栈(Stack)和队列的实现类:双端队列Deque和单端队列Queue。 有序;不重复

ArrayList
底层是一个长度可以动态增长的Object数组,在内存中分配分配连续的空间,实现了长度可变的数组
优点:查询快
缺点:增加和删除慢
JDK1.7中 #F44336,使用无参构造方法创建对象时,默认底层数组长度是10 #F44336
JDK1.8中 #F44336,使用无参构造方法创建对象时,默认底层数组长度是0 #F44336第一次添加元素 #F44336,容量不足需要扩容,初始赋值10 #F44336
默认扩容1.5倍 #F44336,如果扩容1.5倍后,容量还不足容纳新元素,就扩容为能容纳新增元素的最小数量 #F44336

Vector
创建对象够立即初始化长度为10,扩容为2倍

LinkList
底层结构是一个双向链表
优点:增加和删除快
缺点:查询慢
有一个静态内部类Node,表示双向链表的节点。
LinkList实现了Deque接口,所以除了可以作为线性表来使用外,还可以当做队列和栈来使用

Set集合

Set
特点:无序 唯一(不重复) #F44336

HashSet
采用HashTable哈希表 #F44336存储结构
优点:增加删除速度快,查询速度快 #F44336
缺点:无序 #F44336

LinkHashSet
采用哈希表 #F44336存储结构,同时使用链表 #F44336维护次序
有序 #F44336(添加顺序)

TreeSet
采用二叉树(红黑树 #F44336)的存储结构
优点:有序 #F44336 查询速度比List快(按照内容查询)
缺点:查询速度没有HashSet快

总结

  • HashSet 哈希表 唯一 无序
  • LinkedHashSet 哈希表+链表 唯一 有序(添加顺序)
  • TreeSet 红黑树 一种二叉平衡树 唯一 有序(自然顺序)
  • List针对Collection增加了一些关于索引位置操作的方法 get(i),add(i,elem),remove(i),set(i,elem)
  • Set是无序的,不可能提供关于索引位置操作的方法,set针对Collection没有增加任何方法
  • List的遍历方式:for循环、for-each循环、Iterator迭代器、流式编程forEach
  • Set的遍历方式: for-each循环、Iterator迭代器、流式编程forEach
    内部比较器只能定义一个,一般将使用频率最高的比较规则定义为内部比较器的规则;外部比较器可以定义多个;

内部比较器(Comparable)与外部比较器(Comparator)
对于外部比较器,如果使用次数较少,可以通过匿名内部类来实现。
需要比较的场合才需要实现内部比较器或者外部比较器,比如排序、比如TreeSet中数据的存储和查询,在HashSet、LinkedHashSet、ArrayList中存储元素,不需要实现内部比较器或者外部比较器。

问题

问题1:将ArrayList替换成LinkedList之后,不变的是什么?
运算结果没有变
执行的功能代码没有变

问题2:将ArrayList替换成LinkedList之后,变化的是什么?
底层的结构变了
ArrayList:数组 LinkedList:双向链表
具体的执行过程变化了 list.add(2,99)
ArrayList:大量的后移元素
LinkedList:不需要大量的移动元素,修改节点的指向即可

问题3:到底是使用ArrayList还是LinkedList
根据使用场合而定
大量的根据索引查询的操作,大量的遍历操作(按照索引0–n-1逐个查询一般),建议使用ArrayList
如果存在较多的添加、删除操作,建议使用LinkedList

问题4:LinkedList增加了哪些方法
增加了对添加、删除、获取首尾元素的方法
addFirst()、addLast()、removeFirst()、removeLast()、getFirst()、getLast()、

问题5:HashSet、LinkedHashSet :为什么String有重复,会保持唯一;为什么Student有重复,不会保持唯一。

问题6:TreeSet 为什么String可以添加,而Student就不让添加到TreeSet中呢? 而是抛出异常:
java.lang.ClassCastException: com.bjsxt.entity.Student cannot be cast to java.lang.Comparable
思考:String是系统类,Student是自定义类,应该是String已经做了某些事情,但是Student没有做

解答5:HashSet、LinkedHashSet 需要Student实现hashCode()和equals()

解答6:TreeSet 需要Student实现Comparable接口并指定比较的规则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~Amory

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值