集合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接口并指定比较的规则