java集合主要由两个接口派生而出:Collection和Map,也就是说Collection和Map是所有集合类的根接口。Iterator也是集合框架的成员,用来遍历Collection集合
Collection接口
Set
无序集合,且元素不可重复,可以说Set就是Collection,只是行为略有不同,即元素不能重复
HashSet
特点
无序
多线程中,两个货以上线程操作一集合,需要程序员手工保证同步
值可为nullHashSet如何保证每次添加的元素不重复?
调用HashCode()方法获得该对象的hashcode,看集合中是否有相同的hashcode,如果有,则表示该对象在集合中已存在;如果没有,则可以插入。
LinkedHashSet
与HashSet相似,也是用hashcode来决定存放位置,不同之处在于LinkedHashSet使用链表来维护元素的次序,因此插入到LinkedHashSet中的元素是有序的,顺序在链表中维护。
TreeSet
是sortedSet的实现类,可以确保元素处于排序状态。因为它的这个特点,因此它相比hashSet增加如下方法:
1、Object first():获取第一个元素
2、Object last():获取最后一个元素
3、Object lower():获取指定元素之前的元素。
4、。。。。。请看源码~
排序方式
1、自然排序
用compareTo(来自comparable接口)方法比较元素大小按升序排序
2、定制排序
即自定义排序方式,可以用lamda表达式来代替Comparable接口
EnumSet
通过枚举值来决定Set顺序
Set性能
hashSet与treeSet谁的性能好?
hashset,因为treeset的顺序需要进行大小比较后才能确定,而hashset省去了这一步。
hashset与linkedhashset的性能呢?
当然是hashset,因为linkedHashSet还需要维护链表哦~
List
有序集合,元素可重复,根据索引来操作集合,所以可以达到有序的效果。
ArrayList和vector
arrayList和vector都是基于数组的,所以他们都分配了一个动态的、允许再分配的Object[]数组。
vector方法是jdk1.0的时候就有的古老的方法,当时没有考虑到系统的集合框架,所以它提供了很多方法名很长的方法,后来用List替代了,其实和现在用的List并没有区别。而且Vector是线程安全的,因此性能会低,因为它对当前线程加锁,其他只能等待。
ArrayList是线程不安全的,需要程序员手动保证集合同步
LinkedList
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
从上面的源码可以看出它实现了List还实现了Deque,因此它具有栈和队列的双重特点。
Queue
队列,“先进先出”,即队列的头部存放时间最长,尾部存放时间最短
Deque
Queue的实现类,是“双端队列“,即两头可以同时怎删数据。
Priority
Queue的实现类,按队列元素的大小进行排序
排序方式
自然排序
定制排序
Map接口
key-value,Map的key类似一个Set集合、value类似List集合可以重复。
HashTable与HashMap
HashTable从jdk1.0开始就有,是线程安全的,性能较低,而HashMap则与前者相反,所以需要程序员手动使集合同步。
LinkedHashMap
笔者感受
Map和Set非常相似,只不过Map是key-value形式的,所以Map处不再赘述。hashset用了map中的key来存放e,因为key可以保证不重复,这样去掉了原始set在存数据之前需要用hashcode进行去重比较的问题,提高了效率
学习之旅刚开始,再接再厉~~~