进入正题,HashSet、HashMap、ArrayList、LinkedList、Vector这几个在Java编程中经常用到,他们之间有很多联系,有很多相通的地方、但也有很多不同。首先java集合类主要由两个接口:Collection和Map.Collection又有子接口:Set、Queue、List.(这些基础的接口关系这里不多说了)
HashSet与HashMap,名字很接近,都带有Hash,也就是说他们都依赖Hash算法来存储。我们知道每个对象都有自己的Hash值,这个hash值可以由编程员来编写函数来计算得出,但是要与equal函数相协调(这里涉及到设计类时遵循的原则问题,有兴趣的可以查阅相关资料,hash函数的编写规则)。
那么HashSet与HashMap之间有什么联系呢?HashSet底层使用HashMap来存储的!大家可以看一下jdk的源码,会发现HashSet类源码中有一个HashMap类型的成员变量,其中的成员方法也是调用hashMap的成员方法,只不过存储时,按照key-value对存入HashMap对象中,把值存在key中,Value统一为null。
那么ArrayList与LinkedList有什么联系和区别呢?联系就是他们都实现List接口,因此有许多用法是一样的;区别就要从底层分析了,ArrayList底层使用数组存储,LinkedList底层使用双向链表存储。学过数据结构的都知道,数组与链表作为线性表各有优劣,所以ArrayList和LinkedList在效率和使用场景上也有区别。ArrayList在访问数据时效率较高,在插入和删除数据时效率较低。总体上来看ArrayList的效率要略高于LinkedList,因此大多数场景选择Arraylist,除非很多时候要进行插入和删除数据,这时再选择LinkedList。
ArrayList与vector呢?可以说这两个相似度90%,只有一点区别,就是vector是一种线程安全类,它的方法都带有Synchronized关键字。但是vector类很古老,很多方法名都比较长且比较难懂,因此基本不用vector类,但是当遇到多线程情况怎么办呢?不用怕,java提供了Collections工具类,能够将ArrayList转换成线程安全的类!