(1)首先说明HashMap与HashTable: java
HashMap是线程不安全的,是对HashTable的轻量级实现,都是对双列数据的存储。HashMap是在jdk1.2引进的对Map的实现,HashTable出现较早。 程序员
HashMap容许null-key && null-value,可是HashTable不容许。 数组
HashMap把HashTable的contains方法去掉了,改成了containsKey,containsValue,避免误解。 安全
最大的不一样点: 数据结构
HashMap线程不安全,容许null-key,null-value;HashTable线程安全(方法加synchronized),且不容许null-key,null-value; 多线程
正由于HashMap不安全,因此在多线程使用时须要考虑同步的问题,而HashTable不须要。 oracle
(2)TreeMap 测试
HashMap和HashTable里存储的数据都是无序的,TreeMap里的数据是有序的,因此这个是他们之间的最大特色!TreeMap使用二叉树排序,HashMap使用哈希表,因此HashMap一般比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在须要排序的Map时候才用TreeMap。
spa
测试代码: .net
import java.util.Map; import java.util.HashMap; import java.util.Set; import java.util.HashSet; import java.util.Iterator; import java.util.Hashtable; import java.util.TreeMap; class HashMaps { public static void main(String[] args) { Map map=new HashMap(); map.put("a", "aaa"); map.put("b", "bbb"); map.put("c", "ccc"); map.put("d", "ddd"); Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { Object key = iterator.next(); System.out.println("map.get("+key+") is :"+map.get(key)); } /** * HashMap和TreeMap有什么区别。HashMap经过hashcode对其内容进行快速查找, * 而TreeMap中全部的元素都保持着某种固定的顺序,若是你须要获得一个 * 有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。 */ Hashtable tab=new Hashtable(); tab.put("a", "aaa"); tab.put("b", "bbb"); tab.put("c", "ccc"); tab.put("d", "ddd"); Iterator iterator_1 = tab.keySet().iterator(); while (iterator_1.hasNext()) { Object key = iterator_1.next(); System.out.println("tab.get("+key+") is :"+tab.get(key)); } TreeMap tmp=new TreeMap(); tmp.put("a", "aaa"); tmp.put("b", "bbb"); tmp.put("c", "ccc"); tmp.put("d", "ddd"); Iterator iterator_2 = tmp.keySet().iterator(); while (iterator_2.hasNext()) { Object key = iterator_2.next(); System.out.println("tmp.get("+key+") is :"+tmp.get(key)); } } }
详细出处参考:http://www.jb51.net/article/32652.htm
(3)HashMap经过HashCode对其内容进行快速查找,而TreeMap中全部的元素都保持着固定的顺序。若是要获得有序的结果就使用Treemap。HashMap的子类LinkedHashMap也能够实现有序排列。
Object中的hashCode返回值至关于当前的地址,也就是说对于不一样对象,即便他们的内容彻底相同,但HashCode却不相同。若是比较HashMap中存储的Value对象内容是否相等,则须要覆盖hashCode()和equals()方法。
八、 怎样使Hashmap同步?
HashMap能够经过Map m = Collections.synchronizedMap(hashMap)来达到同步的效果。
十、为何Vector类认为是废弃的或者是非官方地不推荐使用?或者说为何咱们应该一直使用ArrayList而不是Vector
你应该使用ArrayList而不是Vector是由于默认状况下你是非同步访问的,Vector同步了每一个方法,你几乎从不要那样作,一般有想要同步的是整个操做序列。同步单个的操做也不安全(若是你迭代一个Vector,你仍是要加锁,以免其它线程在同一时刻改变集合).并且效率更慢。固然一样有锁的开销即便你不须要,这是个很糟糕的方法在默认状况下同步访问。你能够一直使用Collections.sychronizedList来装饰一个集合。
事实上Vector结合了“可变数组”的集合和同步每一个操做的实现。这是另一个设计上的缺陷。Vector还有些遗留的方法在枚举和元素获取的方法,这些方法不一样于List接口,若是这些方法在代码中程序员更趋向于想用它。尽管枚举速度更快,可是他们不能检查若是集合在迭代的时候修改了,这样将致使问题。尽管以上诸多缘由,oracle也从没宣称过要废弃Vector.