写在前面:
这里重点说一下,以前对于说List有序而Set无序挺矛盾的,为什么这么说呢?主要是对于说List有序,然而他的
子类并没有关于排序的内容;对于Set说无序吧,但是他的子类还是有排序的,主要是归因于Set内部有自己的排序
算法,如TreeSet。所以说,我们明面上说的List有序Set无序指的是,元素存入对应集合的时候是有序的,如List
中元素是怎么放进去的就怎么取出来,而Set却不是的,所以说Set是无序的。不知道这对你们有没有帮助?
Collection
List : 有序可重复的(因为有索引),这里有序指的是怎么进的怎么出,并没有对其排序
- ArrayList :底层是数组,线程不同步,查询快增删慢
- Vector :底层是数组,线程同步(方法被synchronized所修饰),查询快增删慢,效率低,现在基本不怎么用
- LinkedList :底层是链表,线程不同步,查询慢增删快
- Stack: Stack继承了Vector,实现了LIFO的数据结构,是后进先出的堆栈。
Set:无序的不可重复
- HashSet :是由HashMap支持的,在HashSet的构造器中,首先是new一个HashMap的对象,源码中可见。所以说,HashSet是建立在HashMap之上的,他存储唯一空值元素,不保持插入顺序,线程不安全的。 HashSet保持元素的唯一性:主要是因为,对象存入HashSet时,对象的hashcode值会判断一个元素是否在该集合中,但是具有相同hashcode值的对象可能不相等,我们需要使用equals()方法来比较对象
- Treeset :有序的集合,基于TreeMap实现的,支持两种排序方法:自然排序和根据实现Comparable接口,覆盖compareTo(Object obj)方法或者实现Comparator接口,覆盖compare(Object o1,Object o2)方法
- LinkedHashSet :继承了HashSet,输出LinkedHashSet集合中的元素时,元素的顺序总是和添加顺序一致。
Map:
- HashMap :是最常用的Map,根据键的HashCode值存储数据,根据键来获取数据,访问速度快允许最多一条记录的键为null,允许多条记录的值为null;不支持线程同步的,如果需要同步的,可以用Collections的synchronizedMap方法使用HashMap具有同步的功能。
- TreeMap :不仅可以保持顺序(默认升序),而且可以用于排序,实现Comparator接口
- HashTable :线程同步的,里边的方法都是有synchronize修饰的,不允许存NULL值null键
- LinkedHashMap :继承HashMap,内部维持一个双向链表,有序的怎么添加进去的怎么取出来
- ConcurrentHashMap :加入了lock机制,并发性能好,比较HashTable更好,键值对都不允许为null
- WeakHashMap:和HashMap一样,是一个散列表,存储内容也是键值对,键和值都可以为null,但他含有弱键,弱键就是在WeakHashMap不在正常使用时,会被移除。
我们可以通过Collections.newSetFromMap(Map<E,Boolean> map)方法可以将任何 Map包装成一个Set