开始学HashTable,HashMap和TreeMap的时候比较晕,觉得作用差不多,但是到实际运用的时候又发现有许多差别的。需要大家注意,在实际开发中以需求而定。

java为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类。Map是将键映射到值的对象,一个映射不能包含重复的键;每个键最多只能映射一个一个值。

Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力.

Hashtable 与 HashMap类似,但是主要有6点不同。

1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

2.HashTable不允许null值,key和value都不可以,HashMap允许null值,key和value都可以。HashMap允许key值只能由一个null值,因为hashmap如果key值相同,新的key, value将替代旧的。

3.HashTable有一个contains(Object value)功能和containsValue(Object value)功能一样。

4.HashTable使用Enumeration,HashMap使用Iterator。

5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

6.哈希值的使用不同,HashTable直接使用对象的hashCode。

TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

下面是HashTable,HashMap和TreeMap总结的一个经典例子。

package com.taobao.luxiaoting;

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));

}

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));

}

}

}

结果:

=========map=========
map.get(key) is :ddd
map.get(key) is :bbb
map.get(key) is :ccc
map.get(key) is :aaa
=========Hashtable=========
tab.get(key) is :bbb
tab.get(key) is :aaa
tab.get(key) is :ddd
tab.get(key) is :ccc
=========TreeMap=========
tmp.get(key) is :aaa
tmp.get(key) is :bbb
tmp.get(key) is :ccc
tmp.get(key) is :ddd

最新文章

  1. java基础知识(十一)java反射机制(上)
  2. 架构和模式的区别:三层架构和MVC在应用开发中的位置
  3. Tomcat搭建
  4. OpenCASCADE View Manipulator
  5. TC250专场
  6. css中font-size的单位总结:px、em、pt
  7. flask_分页
  8. kafka集群zookeeper集群详细配置
  9. PHP 判断是否为Get/Post/Ajax提交
  10. merge into Oracle里的 saveOrUapdate
  11. jdbcType与javaType的对应关系
  12. 如何解决两个li之间的缝隙
  13. 关于MATLAB处理大数据坐标文件201761
  14. 201521123032 《Java程序设计》第3周学习总结(编辑器修改后)
  15. springboot(十七):使用Spring Boot上传文件
  16. Windows Developer Day - Adaptive Cards
  17. c#实战开发:以太坊Geth 命令发布智能合约 (五)
  18. 南邮攻防训练平台逆向maze
  19. [模板] K-D Tree
  20. Spring04-SpringEL&Spring JDBC数据访问

热门文章

  1. scanf中的[]
  2. 【Android菜鸟学习之路】环境搭建问题-修改AVD Path
  3. [C#高级编程].NET体系结构
  4. 【C#】OOP之多态那点事
  5. 【循序渐进学Python】7.面向对象的核心——类型(上)
  6. BI之SSAS完整实战教程3 -- 创建第一个多维数据集
  7. 合并多个dll为一个dll
  8. VS 自定义新建文件模板方法
  9. 使用EasyUI的插件前需要引入的文件
  10. 后缀数组---Milk Patterns