首先是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.
本文探讨了Java集合框架中ArrayList、LinkedList、HashMap、TreeMap、HashSet和TreeSet对null元素的支持情况。ArrayList和LinkedList允许存储多个null,HashMap可以有一个key为null的条目,而TreeMap不允许key为null。对于Set,HashSet可以存储一个null,而TreeSet不接受null。了解这些行为对于优化Java代码和避免潜在问题至关重要。
1734

被折叠的 条评论
为什么被折叠?



