一、ArrayList与LinkedList的区别
ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦,可以随机存取。
LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始,不支持随机存取。
二、HashTable与HashMap区别
1、Hashtable的方法是同步的,而HashMap的方法不是。可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个HashTable,但你必须同样地为一个HashMap提供外同步。
一个方便的方法就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。
2 、Null Key & Null Value
HashMap是支持null键和null值的,而HashTable在遇到null时,会抛出NullPointerException异常。HashMap在实现时对null做了特殊处理,将null的hashCode值定为了0,从而将其存放在哈希表的第0个bucket中。我们一put方法为例,看一看代码的细节:
java.util.HasMap public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } // 当key为null时,调用putForNullKey特殊处理 if (key == null) return putForNullKey(value); // ... } private V putForNullKey(V value) { // key为null时,放到table[0]也就是第0个bucket中 for (Entry<K,V> e = table[0]; e != null; e = e.next) { if (e.key == null) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(0, null, value, 0); return null; }
3、需要注意的是HashTable是开放的:在一个“哈希冲突”的情况下,单个桶会存储多个条目,必须按顺序搜索。加载因子是哈希表是如何充分允许获得前其容量自动增加的措施。初始容量和负载系数参数只是对该实现的提示。
4、HashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。