List , Set继承至Collection接口,Map为独立接口

List下有ArrayList,LinkedList,Vector

Set下有HashSet,LinkedHashSet,TreeSet
Map下有HashMap,LinkedHashMap, TreeMap,Hashtable




1.汇合和数组的区别:

2.Collection汇合的办法:

3.罕用汇合的分类:

Collection 接口的接口 对象的汇合(单列汇合)
├——-List 接口:元素按进入先后有序保留,可反复
│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不平安
│—————-├ ArrayList 接口实现类, 数组, 随机拜访, 没有同步, 线程不平安
│—————-└ Vector 接口实现类 数组, 同步, 线程平安
│ ———————-└ Stack 是Vector类的实现类
└——-Set 接口: 仅接管一次,不可反复,并做外部排序
├—————-└HashSet 应用hash表(数组)存储元素
│————————└ LinkedHashSet 链表保护元素的插入秩序
└ —————-TreeSet 底层实现为二叉树,元素排好序

Map 接口 键值对的汇合 (双列汇合)
├———Hashtable 接口实现类, 同步, 线程平安
├———HashMap 接口实现类 ,没有同步, 线程不平安-
│—————–├ LinkedHashMap 双向链表和哈希表实现
│—————–└ WeakHashMap
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap

二、List和Set汇合详解:

1.list和set的区别:

2.List:

(1)ArrayList:底层数据结构是数组,查问快,增删慢,线程不平安,效率高,能够存储反复元素
(2)LinkedList 底层数据结构是链表,查问慢,增删快,线程不平安,效率高,能够存储反复元素
(3)Vector:底层数据结构是数组,查问快,增删慢,线程平安,效率低,能够存储反复元素
(4小结:

3.Set:

(1)HashSet底层数据结构采纳哈希表实现,元素无序且惟一,线程不平安,效率高,能够存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()办法来保障的,如果没有重写这两个办法,则无奈保障元素的唯一性。
具体实现唯一性的比拟过程:存储元素首先会应用hash()算法函数生成一个int类型hashCode散列值,而后曾经的所存储的元素的hashCode值比拟,如果hashCode不相等,则所存储的两个对象肯定不相等,此时存储以后的新的hashCode值处的元素对象;如果hashCode相等,存储元素的对象还是不肯定相等,此时会调用equals()办法判断两个对象的内容是否相等,如果内容相等,那么就是同一个对象,无需存储;如果比拟的内容不相等,那么就是不同的对象,就该存储了,此时就要采纳哈希的解决地址抵触算法,在以后hashCode值处相似一个新的链表, 在同一个hashCode值的前面存储存储不同的对象,这样就保障了元素的唯一性。
Set的实现类的汇合对象中不可能有反复元素,HashSet也一样他是应用了一种标识来确定元素的不反复,HashSet用一种算法来保障HashSet中的元素是不反复的, HashSet采纳哈希算法,底层用数组存储数据。默认初始化容量16,加载因子0.75。
Object类中的hashCode()的办法是所有子类都会继承这个办法,这个办法会用Hash算法算出一个Hash(哈希)码值返回,HashSet会用Hash码值去和数组长度取模, 模(这个模就是对象要寄存在数组中的地位)雷同时才会判断数组中的元素和要退出的对象的内容是否雷同,如果不同才会增加进去。
Hash算法是一种散列算法。
Set hs=new HashSet();

hs.add(o);
|
o.hashCode();
|
o%以后总容量 (0–15)
|
| 不发生冲突
是否发生冲突—————–间接寄存
|
| 发生冲突
| 假(不相等)
o1.equals(o2)——————-找一个空位增加
|
| 是(相等)
不增加
笼罩hashCode()办法的准则:
1、肯定要让那些咱们认为雷同的对象返回雷同的hashCode值
2、尽量让那些咱们认为不同的对象返回不同的hashCode值,否则,就会减少抵触的概率。
3、尽量的让hashCode值散列开(两值用异或运算可使后果的范畴更广)
HashSet 的实现比较简单,相干HashSet的操作,基本上都是间接调用底层HashMap的相干办法来实现,咱们应该为保留到HashSet中的对象笼罩hashCode()和equals(),因为再将对象退出到HashSet中时,会首先调用hashCode办法计算出对象的hash值,接着依据此hash值调用HashMap中的hash办法,失去的值& (length-1)失去该对象在hashMap的transient Entry[] table中的保留地位的索引,接着找到数组中该索引地位保留的对象,并调用equals办法比拟这两个对象是否相等,如果相等则不增加,留神:所以要存入HashSet的汇合对象中的自定义类必须笼罩hashCode(),equals()两个办法,能力保障汇合中元素不反复。在笼罩equals()和hashCode()办法时, 要使雷同对象的hashCode()办法返回雷同值,笼罩equals()办法再判断其内容。为了保障效率,所以在笼罩hashCode()办法时, 也要尽量使不同对象尽量返回不同的Hash码值。

如果数组中的元素和要退出的对象的hashCode()返回了雷同的Hash值(雷同对象),才会用equals()办法来判断两个对象的内容是否雷同。

(2)LinkedHashSet底层数据结构采纳链表和哈希表独特实现,链表保障了元素的程序与存储程序统一,哈希表保障了元素的唯一性。线程不平安,效率高。
(3)TreeSet底层数据结构采纳二叉树来实现,元素惟一且曾经排好序;唯一性同样须要重写hashCode和equals()办法,二叉树构造保障了元素的有序性。依据构造方法不同,分为天然排序(无参结构)和比拟器排序(有参结构),天然排序要求元素必须实现Compareable接口,并重写外面的compareTo()办法,元素通过比拟返回的int值来判断排序序列,返回0阐明两个对象雷同,不须要存储;比拟器排须要在TreeSet初始化是时候传入一个实现Comparator接口的比拟器对象,或者采纳匿名外部类的形式new一个Comparator对象,重写外面的compare()办法;
(4)小结:Set具备与Collection齐全一样的接口,因而没有任何额定的性能,不像后面有两个不同的List。实际上Set就是Collection,只 是行为不同。(这是继承与多态思维的典型利用:体现不同的行为。)Set不保留反复的元素。
Set 存入Set的每个元素都必须是惟一的,因为Set不保留反复元素。退出Set的元素必须定义equals()办法以确保对象的唯一性。Set与Collection有齐全一样的接口。Set接口不保障保护元素的秩序。

4.List和Set总结:

(1)、List,Set都是继承自Collection接口,Map则不是
(2)、List特点:元素有放入程序,元素可反复 ,Set特点:元素无放入程序,元素不可反复,反复元素会笼罩掉,(留神:元素尽管无放入程序,然而元素在set中的地位是有该元素的HashCode决定的,其地位其实是固定的,退出Set 的Object必须定义equals()办法 ,另外list反对for循环,也就是通过下标来遍历,也能够用迭代器,然而set只能用迭代,因为他无序,无奈用下标来获得想要的值。)
(3).Set和List比照:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素地位扭转。
List:和数组相似,List能够动静增长,查找元素效率高,插入删除元素效率低,因为会引起其余元素地位扭转。
(4)、ArrayList与LinkedList的区别和实用场景
Arraylist:
长处:ArrayList是实现了基于动静数组的数据结构,因为地址间断,一旦数据存储好了,查问操作效率会比拟高(在内存里是连着放的)。
毛病:因为地址间断, ArrayList要挪动数据,所以插入和删除操作效率比拟低。

LinkedList:
长处:LinkedList基于链表的数据结构,地址是任意的,所以在开拓内存空间的时候不须要等一个间断的地址,对于新增和删除操作add和remove,LinedList比拟占优势。LinkedList 实用于要头尾操作或插入指定地位的场景
毛病:因为LinkedList要挪动指针,所以查问操作性能比拟低。
实用场景剖析
当须要对数据进行对此拜访的状况下选用ArrayList,当须要对数据进行屡次减少删除批改时采纳LinkedList。

ArrayList与Vector的区别和实用场景
ArrayList有三个构造方法
public ArrayList(int initialCapacity)//结构一个具备指定初始容量的空列表。
public ArrayList() //默认结构一个初始容量为10的空列表。
public ArrayList(Collection<? extends E> c)//结构一个蕴含指定 collection 的元素的列表
Vector有四个构造方法:
public Vector()//应用指定的初始容量和等于0的容量增量结构一个空向量。
public Vector(int initialCapacity)//结构一个空向量,使其外部数据数组的大小,其规范容量增量为零。
public Vector(Collection<? extends E> c)//结构一个蕴含指定 collection 中的元素的向量
public Vector(int initialCapacity,int capacityIncrement)//应用指定的初始容量和容量增量结构一个空的向量
ArrayList和Vector都是用数组实现的,次要有这么三个区别:
_(1)_.Vector是多线程平安的,线程平安就是说多线程拜访同一代码,不会产生不确定的后果。而ArrayList不是,这个能够从源码中看出,Vector类中的办法很多有synchronized进行润饰,这样就导致了Vector在效率上无奈与ArrayList相比;
_(2)_两个都是采纳的线性间断空间存储元素,然而当空间有余的时候,两个类的减少形式是不同。
(3)Vector能够设置增长因子,而ArrayList不能够。
(4)Vector是一种老的动静数组,是线程同步的,效率很低,个别不赞成应用。
实用场景剖析
1.Vector是线程同步的,所以它也是线程平安的,而ArrayList是线程异步的,是不平安的。如果不思考到线程的平安因素,个别用ArrayList效率比拟高。
2.如果汇合中的元素的数目大于目前汇合数组的长度时,在汇合中应用数据量比拟大的数据,用Vector有肯定的劣势。

.TreeSet 是二差树(红黑树的树据构造)实现的,Treeset中的数据是主动排好序的,不容许放入null值
2.HashSet 是哈希表实现的,HashSet中的数据是无序的,能够放入null,但只能放入一个null,两者中的值都不能反复,就如数据库中惟一束缚
3.HashSet要求放入的对象必须实现HashCode()办法,放入的对象,是以hashcode码作为标识的,而具备雷同内容的String对象,hashcode是一样,所以放入的内容不能反复。然而同一个类的对象能够放入不同的实例

实用场景剖析:HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。为疾速查找而设计的Set,咱们通常都应该应用HashSet,在咱们须要排序的性能时,咱们才应用TreeSet。
(5)何时应用:

三、Map详解:

Map用于保留具备映射关系的数据,Map里保留着两组数据:key和value,它们都能够使任何援用类型的数据,但key不能反复。所以通过指定的key就能够取出对应的value。

(1)、请留神!!!, Map 没有继承 Collection 接口, Map 提供 key 到 value 的映射,你能够通过“键”查找“值”。一个 Map 中不能蕴含雷同的 key ,每个 key 只能映射一个 value 。 Map 接口提供 3 种汇合的视图, Map 的内容能够被当作一组 key 汇合,一组 value 汇合,或者一组 key-value 映射。
(2)Map:

(3)HashMap和HashTable的比拟:

(4)TreeMap:

(5)Map的其它类:
IdentityHashMapHashMap的具体区别,IdentityHashMap应用 == 判断两个key是否相等,而HashMap应用的是equals办法比拟key值。有什么区别呢?
对于==,如果作用于根本数据类型的变量,则间接比拟其存储的 “值”是否相等; 如果作用于援用类型的变量,则比拟的是所指向的对象的地址。
对于equals办法,留神:equals办法不能作用于根本数据类型的变量
如果没有对equals办法进行重写,则比拟的是援用类型的变量所指向的对象的地址;
诸如String、Date等类对equals办法进行了重写的话,比拟的是所指向的对象的内容。
(6)小结:

HashMap 非线程平安
HashMap:基于哈希表实现。应用HashMap要求增加的键类明确定义了hashCode()和equals()[能够重写hashCode()和equals()],为了优化HashMap空间的应用,您能够调优初始容量和负载因子。

TreeMap:非线程平安基于红黑树实现。TreeMap没有调优选项,因为该树总处于均衡状态。

实用场景剖析:
HashMap和HashTable:HashMap去掉了HashTable的contains办法,然而加上了containsValue()和containsKey()办法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap容许空键值,而HashTable不容许。

HashMap:实用于Map中插入、删除和定位元素。
Treemap:实用于按天然程序或自定义程序遍历键(key)。

5.线程平安汇合类与非线程平安汇合类
LinkedList、ArrayList、HashSet是非线程平安的,Vector是线程平安的;
HashMap是非线程平安的,HashTable是线程平安的;
StringBuilder是非线程平安的,StringBuffer是线程平安的。

数据结构
ArrayXxx:底层数据结构是数组,查问快,增删慢
LinkedXxx:底层数据结构是链表,查问慢,增删快
HashXxx:底层数据结构是哈希表。依赖两个办法:hashCode()和equals()
TreeXxx:底层数据结构是二叉树。两种形式排序:天然排序和比拟器排序