Set、List、Map是否能保存null

首先是List,可以看到ArrayList可以存储多个null,ArrayList底层是数组,添加null并未对他的数据结构造成影响。LinkedList底层为双向链表,node.value = null也没有影响。

    @Test
    public void testArrayList(){
        ArrayList<String> list = new ArrayList<>();
        list.add(null);
        list.add(null);
        Assert.assertEquals(2,list.size()); // success
    }

    @Test
    public void testLinkedList(){
        LinkedList<String> list = new LinkedList<>();
        list.add(null);
        list.add(null);
        Assert.assertEquals(2,list.size()); // success
    }

@Test
    public void testHashMap(){
        HashMap<String,String> map = new HashMap<>();
        map.put(null,null);
        Assert.assertEquals(1,map.size()); //OK size = 1

        map.put(null,null);
        Assert.assertEquals(2,map.size()); //Error size = 1
    }

 @Test
    public void testTreeMap(){
        TreeMap<String,String> map = new TreeMap<>();
        map.put(null,null);
        Assert.assertEquals(1,map.size()); //Error NullPointException
        
    }

关于Map,HashMap中最多只有一个key == null的节点,因为key相同时,后面的节点会替换之前相同key的节点,所以HashMap是可以添加key == null 的节点的,只不过只会存在一个,有兴趣的话可以去看源码(tips:源码真的眼花缭乱,可以尝试自己写上注释,更容易看懂,菜鸟的方法)put方法返回旧值。

TreeMap的put方法会调用compareTo方法,对象为null时,会报空指针错

    @Test
    public void testHashSet(){
        HashSet<String> set = new HashSet<>();
        set.add(null);
        Assert.assertEquals(1,set.size()); //OK size = 1
        set.add(null);
        Assert.assertEquals(2,set.size()); //Error size = 1

    }

    @Test
    public void testTreeSet(){
        TreeSet<String> set = new TreeSet<>();
        set.add(null); //Error NullPointException
    }

最后是Set,HashSet底层是HashMap,所以它的put()如下,也只能有一个null。

    private static final Object PRESENT = new Object();


    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

TreeSet的put()也是如此。

    public boolean add(E e) {
        return m.put(e, PRESENT)==null;
    }
  • 结果:
  • List都可以添加null元素。
  • HashMap可以有1个key为null的元素,TreeMap不能有key为null的元素
    Set底层是Map
  • 所以HashSet可以有1个null的元素,TreeSet不能有key为null的元素。

综上所述可以得出结论:

1、vector、arraylist、linkedlist可以存储多个null.

2、hashset、linkedset可以存储一个null. treeset不能存储null.

3、hashmap 、linkedhashmap的 key与value均可以为null.  treemap  key不可以为null,value可以为null. 

4、hashtable、concurrenthashmap,key与value均不能为null.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值