list、set和map集合的区别

集合List Set以及Map的区别

要想了解三者的区别,我们想来看看java的集合框架图
在这里插入图片描述
接着就需要从它们各自的特点来说

一、List的主要特点及用法

  1. 可以允许存储重复的对象
  2. 可以插入多个null元素
  3. 是一个有序容器,保持了每一个元素的插入顺序,插入的顺序即输出的顺序
  4. 常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的 随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适
  5. 区别于Map集合,List集合是单列集合

二、Set集合的主要特点及用法

  1. 不允许重复对象
  2. 只允许一个 null 元素
  3. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序
  4. Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器

三、Map集合的主要特点及用法

  1. Map不是collection的子接口或者实现类。Map是一个接口。而List和Set是collection的子接口
  2. Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的,这是双列集合的特点
  3. TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序
  4. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键
  5. Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(其中HashMap、TreeMap最常用)

四、区别

  1. Collection 和 Map 的区别
    容器内每个为之所存储的元素个数不同。
    Collection类型者,每个位置只有一个元素。
    Map类型者,持有 key-value pair,像个小型数据库。

  2. 各自旗下的子类关系
    Collection
    –List:将以特定次序存储元素。所以取出来的顺序可能和放入顺序不同。
    –ArrayList / LinkedList / Vector
    –Set : 不能含有重复的元素
    –HashSet / TreeSet
    Map
    –HashMap
    –HashTable
    –TreeMap

  3. 其他特征
    List,Set,Map将持有对象一律视为Object型别。
    Collection、List、Set、Map都是接口,不能实例化。
    继承自它们的 ArrayList, Vector, HashTable, HashMap是具象class,这些才可被实例化。
    vector容器确切知道它所持有的对象隶属什么型别。vector不进行边界检查。

总结

  1. 如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
  2. 如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
  3. 在除需要排序时使用TreeSet,TreeMap外,都应使用HashSet,HashMap,因为他们 的效率更高。
  4. 要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
    容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置。一旦将对象置入容器内,便损失了该对象的型别信息。
    尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。

注意:

1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。
2、Set和Collection拥有一模一样的接口。
3、List,可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)…。(add/get)
4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。
5、Map用 put(k,v) / get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。
HashMap会利用对象的hashCode来快速找到key。
6、Map中元素,可以将key序列、value序列单独抽取出来。
使用keySet()抽取key序列,将map中的所有keys生成一个Set。
使用values()抽取value序列,将map中的所有values生成一个Collection。
为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复。

转载自:https://blog.csdn.net/qq_42894060/article/details/82251908

猜你喜欢

转载自blog.csdn.net/xiao_xiao_b/article/details/93733157