List,Set,Map的区别
相同点
1.三者都属于集合类型
2.都可以存储和操作数目不固定的一组数据
3.实现类一般都支持自动扩容来保证数据的存储
4.都有自己的最大最小值设置
5.存储的内容都是对象的引用,而非对象本身.
不同点
1. List,Set的区别
1.1 继承方式以及遍历方式
List和Set都继承了Collection接口,Collection是最基本的集合接口,一个Collection代表一组Object,而Collection接口又是继承于Iterable接口,所以List和Set都支持迭代器.但是Map并没有继承与Iterable也可以使用过迭代器遍历,是因为Map及其子类虽然没有实现Interable、Iterator,但是,Map内部会生成Collection,从而间接实现Iterable接口和生成Iterator,所以,Map也可以使用迭代器。
1.2 Set和List的区别
Set接口实例存储的是无序的,不重复的数据,允许包含值为null的元素,但key最多只能有一个null元素。
List接口实例存储的是有序的,可以重复的元素。
Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。
List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> 。
1.3 Set是如何保证数据唯一性的
set保证里面元素的唯一性其实是靠两个方法,一是equals()和hashCode()方法,往set里面添加数据的时候一般会先是判断set集合中是否有与新添加数据的hashcode值一致的数据,如果有,那么将再进行第二步调用equals方法再进行一次判断,假如集合中没有与新添加数据hashcode值一致的数据,那么将不调用eqauls方法。
2. Set,List与Map的区别
下边有一个表格来表达一下:
根 | 接口 | 主要特点 | 实现方式 | 详细特点 |
---|---|---|---|---|
- | Collection | 单列集合,数组 | List,Set | |
Collection | List | 有序,可重复 | ArrayList | 底层数据结构是数组,查询快,增删慢,线程不安全,效率高 |
Collection | List | 有序,可重复 | Vector | 底层数据结构是数组,查询快,增删慢,线程安全,效率低 |
Collection | List | 有序,可重复 | LinkedList | 底层数据结构是链表,查询慢,增删快,线程不安全,效率高 |
Collection | Set | 无序,key唯一,值可重复 | HashSet | 底层数据结构是哈希表,哈希表依赖两个方法:hashCode()和equals(),执行顺序:首先判断hashCode()值是否相同 是:继续执行equals(),看其返回值 是true:说明元素重复,不添加 是false:就直接添加到集合 否:就直接添加到集合 最终:自动生成hashCode()和equals()即可 |
Collection | Set | 无序,key唯一,值可重复 | LinkedHashSet | 底层数据结构由链表和哈希表组成,由链表保证元素有序,由哈希表保证元素唯一 |
Collection | Set | 无序,key唯一,值可重复 | TreeSet | 底层数据结构是红黑树。(是一种自平衡的二叉树),根据比较的返回值是否是0来决定元素唯一性,排序方式有两种:1.自然排序(元素具备比较性),让元素所属的类实现Comparable接口;2.比较器排序(集合具备比较性),让集合接收一个Comparator的实现类对象 |
- | Map | 双列集合,key-value键值对 | - | Map集合的数据结构仅仅针对键有效,与值无关,存储的是键值对形式的元素,键唯一,值可重复. |
- | Map | 双列集合,key-value键值对 | HashMap | jdk1.7时底层数据结构是哈希表,jdk1.8优化以后加入了红黑树,线程不安全,效率高,哈希表依赖两个方法:hashCode()和equals(),执行顺序:首先判断hashCode()值是否相同 是:继续执行equals(),看其返回值 是true:说明元素重复,不添加 是false:就直接添加到集合 否:就直接添加到集合 最终:自动生成hashCode()和equals()即可 |
- | Map | 双列集合,key-value键值对 | LinkedHashMap | 底层数据结构由链表和哈希表组成,由链表保证元素有序,由哈希表保证元素唯一 |
- | Map | 双列集合,key-value键值对 | Hashtable | 底层数据结构是哈希表。线程安全,效率低,哈希表依赖两个方法:hashCode()和equals()执行顺序:首先判断hashCode()值是否相同 是:继续执行equals(),看其返回值 是true:说明元素重复,不添加 是false:就直接添加到集合 否:就直接添加到集合 最终:自动生成hashCode()和equals()即可 |
- | Map | 双列集合,key-value键值对 | TreeMap | 底层数据结构是红黑树。(是一种自平衡的二叉树),根据比较的返回值是否是0来决定元素唯一,有两种排序方式:1.自然排序(元素具备比较性),让元素所属的类实现Comparable接口;2.比较器排序(集合具备比较性),让集合接收一个Comparator的实现类对象 |
Set,List与Map的使用场景
如下图: