List、Set、Map集合存放null解析及HashMap、Hashtable异同点解析

1.List、Set、Map集合存放null解析:

@Test
	public void CollectionTest() {
		// 测试List
		List<Object> list = new ArrayList<Object>();
		list.add(null);
		list.add(null);
		System.out.println(list);

		// 测试Set
		Set<Object> set = new HashSet<Object>();
		set.add(null);
		set.add(null);
		System.out.println(set);

		// 测试HashMap与Hashtable
		Map<Object, Object> hashMap = new HashMap<Object, Object>();
		hashMap.put(null, null);
		hashMap.put(null, null);
		hashMap.put(1, null);
		hashMap.put(1, 12);
		System.out.println(hashMap);
		/// Maps the specified <code>key</code> to the specified
		// <code>value</code> in this hashtable. Neither the key nor the
		// value can be <code>null</code>. <p>
		Map<Object, Object> hashtable = new Hashtable<Object, Object>();
		hashtable.put(1, "string1");
		hashtable.put(2, "string2");
		System.out.println(hashtable);
	}
//打印结果:
//[null, null]
//[null]
//{null=null, 1=12}
//{2=string2, 1=string1}

由此可知:
List 集合可以存储null,添加几个,存储几个;

Set集合也可以存储null,但只能存储一个,即使添加多个也只能存储一个;

HashMap可以存储null键值对,键和值都可以是null,但如果添加的键值对的键相同,则后面添加的键值对会覆盖前面的键值对,即之后存储后添加的键值对;

Hashtable不能碰null,不管是值还是键,一见null就报空指针。

2.HashMap、Hashtable异同点

相同点:两者都实现了Map接口

不同点:① HashMap可以存储null键值对,Hashtable不能存储null键值对;

                ② HashMap是非synchronized,而Hashtable是synchronized。sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,其它线程要等到同步锁被放之后才能再次获得同步锁更新Hashtable。也就是说,Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果不需要同步只需要单一线程,那么使用HashMap性能要好过Hashtable。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。所以如果需要完全安全的线程,需要使用Hashtable或者ConcurrentHashMap。

你可能感兴趣的:(List、Set、Map集合存放null解析及HashMap、Hashtable异同点解析)