Java List、Set和Map的区别及详细分析

区别

List:元素有放入顺序,元素可重复,和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

Set:元素无放入顺序,元素不可重复,重复元素会覆盖掉,检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。(注意:元素虽然无放入顺序,但是元素在set中的位置是由该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)

Map:适合存储键-值对的数据

List,Set都是继承自Collection接口,Map则不是

详细分析

List

List是继承于Collection接口,List是一个有序的集合,List允许存储项的值为空,也允许存储相等值的存储项。

List主要分为三类:ArrayListLinkedListVector

  • ArrayList:ArrayList是一个数组实现的列表,由于数据是存入数组中的,所以它的特点也和数组一样,查询很快,但是中间部分的插入和删除很慢,适用于多查找的场景;
  • Vector:Vector就是ArrayList的线程安全版,它的方法前都加了synchronized锁,其他实现逻辑都相同;
  • LinkedList:故名思意就是链表,LinkedList还是一个双向链表。插入和删除方便,适用于多次数据替换的场景。

Set

Set和List一样,也继承于Collection,是集合的一种。和List不同的是,Set内部实现是基于Map的,所以Set取值时不保证数据和存入的时候顺序一致,并且不允许空值,不允许重复值。

Set主要分为两类:HashSetTreeSet

  • HashSet:HashSet主要由HashMap实现,HashSet中的数据是无序的,可以放入null,但只能放入一个null;
  • TreeSet:TreeSet内部的是二差树(红黑树),TreeSet中的数据是自动排好序的,不允许放入null值 。

Map

Map以按键-值对的形式存储数据,这里要特别说明( Map.Entry,是Map的内部类,它用来描述Map中的键-值对)。Map是一个接口,我们平时多用它的实现类HashMap。

Map主要分为四类:HashMapHashTableLinkedHashMapTreeMap

  • HashMap:HashMap是一个最常用的Map,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
  • HashTable:不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了在写入时会比较慢。
  • LinkedHashMap:保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
  • TreeMap:实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

参考

java 常用集合list与Set、Map区别及适用场景总结
Java集合详解–什么是List

猜你喜欢

转载自blog.csdn.net/zyw0101/article/details/80699635