Java集合类知识整理

来源:互联网 发布:学霸 知乎 编辑:程序博客网 时间:2024/05/01 01:18

一、元素是否有序?

  • 有序:List、TreeSet、TreeMap
  • 无序:Set(AbstractSet、HashSet)、Map(AbstractMap、HashMap)
  • 原因:List最常用的实现类是ArrayList和LinkedList,前者以一种类似数组的形式进行存储,后者是以链表的形式进行存储,都是有序的。对于TreeSet和TreeMap,顾名思义是采用树的形式进行存储的,所以也是有序的。而Set的其它实现类则是无序的,就像一个口袋一样,它无法记住我们放入元素的顺序,所以是无序的。Map也是一样,除了使用树形存储的实现类外,其它实现类中放入的数据也是无序。

二、是否可以重复?

  • 能:List、Map(这里的重复指的是value而不是key,key必须唯一)
  • 否:Set
  • 原因:前面提到因为List常用的两个类是采用链表或者数组的形式进行存储的,是有序的,可以区分相同元素,所以能加入相同的元素。而Map可重复指的是value可重复,但是必须保证key是唯一的,才能保证正确的取出数据。对于Set,如果放入重复元素,怎么知道取出的是哪一个?所以不运行放入重复的元素。

二、是否可以加入null?

对各个集合能否放入null,并不能统一的用能和否进行解释。
对于Map集合而言:
(1)TreeMap:允许加入的value为null但是key一定不可以是null,否则会引发NullPointerException

Map set = new TreeMap() ;set.put(null, "a") ;

结果:

Exception in thread "main" java.lang.NullPointerException        at java.util.TreeMap.compare(Unknown Source)        at java.util.TreeMap.put(Unknown Source)        at review.test.collection.TestNull.main(TestNull.java:11)

有的地方说TreeMap只有在元素数量大于1的时候才会调用Comparator比较器,所以TreeMap在添加的第一个元素key为null的时候不会引发NullPointerException,但是通过实验证明,即使将null作为第一个加入元素的key值,亦或者只加入一个null-value键值对,结果都是会引发NullPointerException的,所以得出的结果是TreeMap所有键值对的key都不可以为null。
(2)HashMap:允许添加null-null键值对,但是要求只能加入一个key为null的键值对,如果加入多个key为null的键值对,则后加入的键值对会覆盖先加入的键值对,保持集合中最终只有一个key为null的键值对。但是可以多个键值对的value都为null。

Map set = new HashMap() ;set.put(null, null) ;set.put(null, 1) ;set.put(2 , null) ;set.put(3, null) ;

调试结果:
这里写图片描述

并且在对存在key为null的HashMap进行value的取出操作时,不能使用get方式,否则一样会引发NullPointerException。只能通过遍历去获取

Set<Map.Entry<Integer,Integer>> s = set.entrySet();for(Map<Integer,Integer> entry : s){    System.out.println(entry);} 

对于List而言:
ArrayList和LinkedList都是有序的,可以加入多个null值,并且可以正确输出。

List list = new ArrayList() ;list.add(null) ;list.add(null) ;list.add(1) ;for(Object obj:list) {    System.out.println(obj+" ");}

调试及输出结果:
这里写图片描述

对于Set而言:
(1)HashSet:允许添加null值,但因为是无序的,所以集合中实际最终只有一个null值,并且添加的null值将会第一个被输出。这里涉及到hash对null的处理实现,可参考: HashMap中插入null key的过程分析

Set set = new HashSet() ;set.add(2) ;set.add(null) ;set.add(null) ;set.add(1) ;for(Object obj:set) {    System.out.println(obj+" ");}

调试结果:
这里写图片描述

(2)TreeSet:和TreeMap一样,TreeSet对添加null值非常敏感,TreeSet完全不允许添加null,只要添加null值就会引发NullPointerException。

原创粉丝点击