Moosphan/Android-Daily-Interview

2019-08-13:谈谈List,Set,Map的区别?

MoJieBlog opened this issue · 16 comments

2019-08-13:谈谈List,Set,Map的区别?

有序,唯一,键值对

它们分别代表列表,集,映射;区别有序,唯一,键值对

List:有序,可重复
set:无序,单一元素,集合
map:键值对

List是集合, 子类有 ArrayList LinkedList, . Set 有 HashSet TreeSet . Map: HashMap, tree
Map . 拷贝方式,数据机构。

List中存储的数据是有顺序的,并且值允许重复;Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)

版权声明:本文为CSDN博主「Java星」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangxingpa/article/details/81023138

List和Set都实现了Collection接口,Map是单独存在的, List存储有序可重复集合,Set是无序不可重复集合,Map是存储的是键值对数据集合。 List子类中有ArrayList和Vactor和LinedList,ArrayList和Vactor都是用单项数组实现,差别是vactor是线程安全的,arraylist不是,对应的HashMap和HashTable也是这种关系

List和Set都实现了Collection接口,Map是一个单独的接口
List 存放有序(怎么存入,怎么取出),允许存入重复元素,可以出现多个NULL值。
Set存放无序,不允许存入重复元素,只能存有一个NULL值,是基于Map实现的,底层存储使用hashcode(),我们不能操作他的位置,
Map是一个单独的接口,以键值对的形式存放数据,键值不允许重复,数值存放可以重复,一个键必须对应一个值,

List中的元素,有序、可重复、可为空;
Set中的元素,无序、不重复、只有一个空元素;
Map中的元素,无序、键不重,值可重、可一个空键、多可空值;

有趣一点学技术

一、一个萝卜一个坑 —— List

  1. List 底层就是个 Object[],所以逻辑上是挨在一起的(连续);
  2. 你们这几个萝卜都是有序号的,叫到号出列!

二、暗度陈仓 —— Set

你去看看 Set 的两个实现类(TreeSet、HashSet)源码,就会发现底层存储结构都是用的map,把 set 的值放在 map 的 key 里的,value 是一个共用的 object 对象。

所以 Set 的特点也就是 Map 的 Key 的特点:

  1. map 中 key 是不允许重复的,这样 Set 中的值也不能重复了
  2. map 的 key 是无序存放的,Set 也就无序

三、我不管数据存哪了,给你个通行证,你把它给我找出来! —— Map

  1. 数据和通行证有着映射关系;
  2. 既然是通行证,那就不可重复(键不重复),不然 A 取了 B 的数据多尴尬?

有趣一点学技术

一、一个萝卜一个坑 —— List

  1. List 底层就是个 Object[],所以逻辑上是挨在一起的(连续);
  2. 你们这几个萝卜都是有序号的,叫到号出列!

二、暗度陈仓 —— Set

你去看看 Set 的两个实现类(TreeSet、HashSet)源码,就会发现底层存储结构都是用的map,把 set 的值放在 map 的 key 里的,value 是一个共用的 object 对象。

所以 Set 的特点也就是 Map 的 Key 的特点:

  1. map 中 key 是不允许重复的,这样 Set 中的值也不能重复了
  2. map 的 key 是无序存放的,Set 也就无序

三、我不管数据存哪了,给你个通行证,你把它给我找出来! —— Map

  1. 数据和通行证有着映射关系;
  2. 既然是通行证,那就不可重复(键不重复),不然 A 取了 B 的数据多尴尬?

其实说「List」底层就是个Object[]是有歧义的 比如LinkedList的实现最终是一个链表,所有的增删查改都是基于链表来做的

那些说Set是无序的,知不知道有个实现类叫LinkedHashSet?Set只是不能有重复的元素,其他的说多了都是扯淡,建议读一下《Java编程**》——持有对象一章。

那些说Set是无序的,知不知道有个实现类叫LinkedHashSet?Set只是不能有重复的元素,其他的说多了都是扯淡,建议读一下《Java编程**》——持有对象一章。

大家说的都是广义上的set特性。
那要你这么说,你介绍set还得把每种set的特性都算在set上?
那要你这么说,map不也是有序的,map也有对应实现,map岂不是插入有序的,也有对应实现?
谈的是共同群体的普遍性,而不是单独特定个体的特性。

那些说Set是无序的,知不知道有个实现类叫LinkedHashSet?Set只是不能有重复的元素,其他的说多了都是扯淡,建议读一下《Java编程**》——持有对象一章。

大家说的都是广义上的set特性。
那要你这么说,你介绍set还得把每种set的特性都算在set上?
那要你这么说,map不也是有序的,map也有对应实现,map岂不是插入有序的,也有对应实现?
谈的是共同群体的普遍性,而不是单独特定个体的特性。

认同的人自然认同,不认同的我也不强求你认同。

List:An ordered collection (also known as a sequence).
Set:A collection that contains no duplicate elements.
Map:An object that maps keys to values.

List:
List 是一种有序的集合,可以包含重复的元素。List 中的每个元素都有一个索引,可以根据索引来访问 List 中的元素。常用的 List 实现类有 ArrayList、LinkedList 和 Vector。

Set:
Set 是一种不允许重复元素的集合,它不保证元素的顺序。Set 中的元素必须实现 hashCode() 和 equals() 方法,以便判断元素是否重复。常用的 Set 实现类有 HashSet、TreeSet 和 LinkedHashSet。

Map:
Map 是一种键值对的集合,每个元素包含一个键和一个值。Map 中的键必须是唯一的,而值可以重复。Map 中的元素是无序的。常用的 Map 实现类有 HashMap、TreeMap 和 LinkedHashMap。