之前经常看到有人在网上问关于HashMap 和Hashtable 的区别,自己也在看,时间一长发现自己也忘了二者的区别,于是在实际应用中犯错了。
原因是使用了Properties 这个集合类时将null放到value上,于是抛出了NullPointerException ,于是想起了Hashtable ,这个集合的键值就是不允许为空的,经过测试果然如此,又看了下Properties 的源代码,原来它extends Hashtable ,这就难怪了。接着又看了put 方法如下:
1 public synchronized V put(K key, V value) { 2 // Make sure the value is not null 3 if (value == null) { 4 throw new NullPointerException(); 5 } 6 7 // Makes sure the key is not already in the hashtable. 8 Entry tab[] = table; 9 int hash = key.hashCode(); 10 int index = (hash & 0x7FFFFFFF) % tab.length; 11 for (Entry<K, V> e = tab[index]; e != null; e = e.next) { 12 if ((e.hash == hash) && e.key.equals(key)) { 13 V old = e.value; 14 e.value = value; 15 return old; 16 } 17 } 18 19 modCount++; 20 if (count >= threshold) { 21 // Rehash the table if the threshold is exceeded 22 rehash(); 23 24 tab = table; 25 index = (hash & 0x7FFFFFFF) % tab.length; 26 } 27 28 // Creates the new entry. 29 Entry<K, V> e = tab[index]; 30 tab[index] = new Entry<K, V>(hash, key, value, e); 31 count++; 32 return null; 33 }
这就不难看出,当value为null时直接就抛出NullPointerException ,若key为null时,null.hashCode()也会抛出NullPointerException 。所以决定了Properties 的键值不能为null 。同时注意这个类也是synchronized的,这样就可以保证在多线程共享时使用这个专用于存储属性文件的集合不会出现问题。
经过这次的错误想起来老师以前经常告诉我们要坚持看java的API ,哪怕你每天看一个类的,有时间多看,没时间少看。终于明白了老师的心思,当然常用的很有必要看,磨刀不误砍柴工吗。掌握了基本的方法,写代码快了,也不容易出错了,更不用因为没有现成的方法而去baidu、google了,何乐而不为呢