简单谈hashmap hashtable linkedhashmap treemap的区别

原创 2016年08月30日 19:48:57

hashmap

继承dictionary;线程不同步。如果想使用同步可以使用collections.syschronizedMap或者concurrentHashMap进行同步,允许一个键为null,随机读取数据,读取速度快

 @Test
	public void testHashMap() {
		HashMap<Integer, String> map = new HashMap<Integer, String>();
		// 在map中存入10000个键值对
		long start = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			map.put(i, "hashvalue " + i);
		}
		long end = System.currentTimeMillis();
		long insertTime=end-start;
		start = System.currentTimeMillis();
		// 输出结果
		for (Integer key : map.keySet()) {
			System.out.println("key:" + key.valueOf(key) + "  value:"
					+ map.get(key));
		}
		end = System.currentTimeMillis();
		System.out.println("size:" + map.size());
		System.out.println("输入花费总时间:" + (insertTime));
		System.out.println("输出花费总时间:" + (end - start));
		
		map.clear();
		map.put(null, "测试键可以为null");
		System.out.println(map.get(null));
	}


结论:

从程序结果中可以看出,读取的数据是随机的。一个键可以为null

hashtable

继承dictionary;线程同步。不允许为null, 

@Test
	public void testHashtable() {
		Hashtable<Integer, String> map = new Hashtable<Integer, String>();
		// 在map中存入10000个键值对
		long start = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			map.put(i, "hashvalue " + i);
		}
		long end = System.currentTimeMillis();
		long insertTime=end-start;
		start = System.currentTimeMillis();
		// 输出结果
		for (Integer key : map.keySet()) {
			System.out.println("key:" + key.valueOf(key) + "  value:"
					+ map.get(key));
		}
		end = System.currentTimeMillis();
		System.out.println("size:" + map.size());
		System.out.println("输入花费总时间:" + (insertTime));
		System.out.println("输出花费总时间:" + (end - start));
		map.clear();
		map.put(null, "测试键可以为null");
		System.out.println(map.get(null));
	}

结论:

读取数据使用散列方式排列,键不能为空,编译可以通过。运行会包空指针异常

linkedhashmap

保存了记录的插入顺序,也是按顺序排列的,


@Test
	public void testLinkedHashMap() {
		LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();
		// 在map中存入10000个键值对
		long start = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			map.put(i, "hashvalue " + i);
		}
		long end = System.currentTimeMillis();
		long insertTime = end - start;
		start = System.currentTimeMillis();
		// 输出结果
		for (Integer key : map.keySet()) {
			System.out.println("key:" + key.valueOf(key) + "  value:"
					+ map.get(key));
		}
		end = System.currentTimeMillis();
		System.out.println("size:" + map.size());
		System.out.println("输入花费总时间:" + (insertTime));
		System.out.println("输出花费总时间:" + (end - start));
		map.clear();
		map.put(null, "测试键可以为null");
		System.out.println(map.get(null));
	}


结论:

Linkedhashmap输出的顺序和输入的相同按顺序排列,Linkedhashmap继承hashmap 所有他的键可以有一个值为null,

treemap

采用的是红黑树算法的实现。按自然排序的升序进行排序。

@Test
	public void testTreeMap() {
		TreeMap<Integer, String> map = new TreeMap<Integer, String>();
		// 在map中存入10000个键值对
		long start = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			map.put(i, "hashvalue " + i);
		}
		long end = System.currentTimeMillis();
		long insertTime = end - start;
		start = System.currentTimeMillis();
		// 输出结果
		for (Integer key : map.keySet()) {
			System.out.println("key:" + key.valueOf(key) + "  value:"
					+ map.get(key));
		}
		end = System.currentTimeMillis();
		System.out.println("size:" + map.size());
		System.out.println("输入花费总时间:" + (insertTime));
		System.out.println("输出花费总时间:" + (end - start));
		map.clear();
		map.put(null, "测试键可以为null");
		System.out.println(map.get(null));
	}



Treemap的键不能为null 查询出来的数据是按顺序排列输出


版权声明:本文为博主原创文章,未经博主允许不得转载。

HashMap TreeMap Hashtable LinkedHashMap 区别

map是java中最常用的数据结构之一,在这篇文中,我将说明如何使用不同类型的maps,比如:HashMap,TreeMap,HashTable和LinkedHashMap。 Map概览 在jav...
  • maoyeqiu
  • maoyeqiu
  • 2015年09月27日 14:18
  • 1274

【Java集合之Map】HashMap、HashTable、TreeMap、LinkedHashMap区别

前言ArrayList和LinkedList都实现了List接口,大致区别如下: ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 对于随机访问get和se...
  • cyh1111
  • cyh1111
  • 2016年12月20日 13:03
  • 1155

从源代码看TreeMap、HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap特性

TreeMap、HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 这几个都是Map的实现类,但是都有各自的特点: HashMap是基于Hash...
  • fzhsh
  • fzhsh
  • 2016年04月22日 23:50
  • 1073

java中HashMap,LinkedHashMap,TreeMap,HashTable,ConcurrentHashMap的区别和内部实现机制

首先简单介绍下,这几种map的应用场景: HashMap 存储键值对,没有什么特殊的功能; LinkedHashMap在存储的同时,能够保存用户插入数据的顺序,如果需要输出用户插入map的顺序可以...
  • liufangbaishi2014
  • liufangbaishi2014
  • 2016年09月26日 11:44
  • 1731

HashMap和LinkedHashMap,TreeMap的区别

HashMap和LinkedHashMap,TreeMap的区别 1.具体区别如下: 我们在开发的过程中使用HashMap比较多,在Map中在Map 中插入、删除和定位元素,HashMap 是最好...
  • Lucky_bo
  • Lucky_bo
  • 2015年07月14日 16:57
  • 3276

hashtable、hashmap、ConcurrentHashMap、treemap的区别

本人原创,转载请注明出处! 本人QQ:530422429,欢迎大家指正、讨论。 欢迎访问: 西北工业大学 - 大数据与知识管理研究室 (Northwestern Polytechnical Un...
  • xin_jmail
  • xin_jmail
  • 2014年04月24日 19:51
  • 8554

hashMap,treeMap,LinkedHashMap使用以及区别分析

hashMap,treeMap,LinkedHashMap应用
  • chenpengfei1990
  • chenpengfei1990
  • 2016年11月28日 18:01
  • 671

HashMap,HashTable,TreeMap,WeakHashMap有哪些区别?

Java 为数据结构中的映射文件定义了一个接口java.util.Map,它包含了三个实现类  HashMap,HashTable,TreeMap. Map是用来存放键值对的数据结构,在数组中通过数...
  • JohnLee_chun
  • JohnLee_chun
  • 2016年09月17日 15:34
  • 303

Java集合学习--HashMap、LinkedHashMap、TreeMap、HashTable

HashMap: 初始化: HashMap中有两个因子影响其性能:初始容量和加载因子。这两个参数都可以在创建时通过构造器传入,如果不指定,默认初始容量=16,加载因子=0.75,加载因子会影响reha...
  • yxinzju
  • yxinzju
  • 2015年08月19日 16:15
  • 827

HashMap和Hashtable以及TreeMap的区别

最近用到了这三种集合类,由于不是很熟练,所以想整理下。而且前段时间面试,一般情况下面试官喜欢问HashMap和Hashtable的主要区别,其用意是想问被面试者这俩那个是线程安全的。但是HashMap...
  • horero
  • horero
  • 2016年12月19日 11:47
  • 787
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单谈hashmap hashtable linkedhashmap treemap的区别
举报原因:
原因补充:

(最多只允许输入30个字)