`
epy
  • 浏览: 324881 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java中TreeMap VS HashMap

阅读更多

Key是长度为11String, ValueShort

HashMap使用default load factor (0.75).

 

Size100000

TreeMap 占用了8.91M内存;search 100000 times, usedTime: 268ms.

HashMap占用了9.65M内存;search 100000 times, usedTime: 54ms.

 

Size1000000

TreeMap 占用了91.5M内存;search 100000 times, usedTime: 636ms.

HashMap占用了95.88M内存;search 100000 times, usedTime: 83ms.

 

在数据量为十万到百万之间时,HashMap占用的内存比TreeMap多了5%-8%,查询时间只有TreeMap13%-20%,因此在这一应用场景下,HashMap是较好的选择。

 

测试代码如下:

 

import java.util.HashMap;
import java.util.Random;
import java.util.TreeMap;


public class TreeMapVSHashMap {
	private static Random random = new Random();
	private static Random random2 = new Random();
	
	private static final int SIZE = 100000;
	private static final int GETCNT = 100000;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		TreeMapTest();		
		
//		HashMapTest();
		

	}
	
	public static void TreeMapTest() {
		System.out.println("\nTreeMap Test");
		System.gc();
		printHeapMemoryInfo();
		TreeMap<String, Short> trMap = new TreeMap<String, Short>();
		int i = 0;
		Short val;
		while (i < SIZE) {
			val = trMap.put(getRandomPhone(), (short)(i%4));
			
			if (val == null) {
				i++;
			}
		}
		
		System.out.println("size : " + trMap.size());
			
		System.gc();
		printHeapMemoryInfo();
		
		long startTime = System.currentTimeMillis();
		for (i=0; i<GETCNT; i++) {
			trMap.get(getRandomPhone2());
		}
		System.out.println("search " + GETCNT + " times, usedTime: " + (System.currentTimeMillis() - startTime) + "ms.");
		
	}
	
	public static void HashMapTest() {
		System.out.println("\nHashMap Test");
		System.gc();
		printHeapMemoryInfo();
		HashMap<String, Short> hashMap = new HashMap<String, Short>();
		int i = 0;
		Short val;
		while (i < SIZE) {
			val = hashMap.put(getRandomPhone(), (short)(i%4));
			
			if (val == null) {
				i++;
			}
		}
		
		System.out.println("size : " + hashMap.size());
		
		System.gc();
		printHeapMemoryInfo();
		
		long startTime = System.currentTimeMillis();
		for (i=0; i<GETCNT; i++) {
			hashMap.get(getRandomPhone2());
		}
		System.out.println("search " + GETCNT + " times, usedTime: " + (System.currentTimeMillis() - startTime) + "ms.");

	}

	/**
	 * 返回一个手机号码,有十亿种可能性,(中国移动用户总数约十亿)
	 * @return
	 */
	public static String getRandomPhone() {
		return String.valueOf(13000000000L + random.nextInt(1000000000));
	}
	
	/**
	 * 返回一个测试手机号码,有十亿种可能性,(中国移动用户总数约十亿)
	 * @return
	 */
	public static String getRandomPhone2() {
		return String.valueOf(13000000000L + random2.nextInt(1000000000));
	}


	public static void printHeapMemoryInfo() {
		Runtime runtime = Runtime.getRuntime();
		System.out.printf("maxMemory : %.2fM\n", runtime.maxMemory()*1.0/1024/1024);
		System.out.printf("totalMemory : %.2fM\n", runtime.totalMemory()*1.0/1024/1024);
		System.out.printf("freeMemory : %.2fM\n", runtime.freeMemory()*1.0/1024/1024);
		System.out.printf("usedMemory : %.2fM\n", (runtime.totalMemory()-runtime.freeMemory())*1.0/1024/1024);
	}
}

 

分享到:
评论

相关推荐

    Java里多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)

    比较Java原生的 3种Map的效率。 1. TreeMap 2. HashMap 3. ConcurrentSkipListMap 本测试查找方法使用Map的get方法,循环、离散获取。对于ConcurrentSkipListMap,获得顺序片段,可用subMap()方法,提取50w的子序列...

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    Java中HashMap和TreeMap的区别深入理解

    首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value

    treemap treeset hashset hashmap 简要介绍

    treemap treeset hashset hashmap 简要介绍

    HashMap,HashTable,LinkedHashMap,TreeMap的区别

    HashMap 是 Java 中最常用的 Map 实现类,它根据键的 HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap 最多只允许一条记录的键为 Null;允许多条记录的值为 Null。HashMap 不支持线程...

    java HashMap,TreeMap与LinkedHashMap的详解

    主要介绍了 java HashMap,TreeMap与LinkedHashMap的详解的相关资料,这里提供实例代码,帮助大家学习理解 这部分的内容,需要的朋友可以参考下

    在Java中如何决定使用 HashMap 还是 TreeMap

    主要介绍了在Java中如何决定使用 HashMap 还是 TreeMap,很多朋友对这样的问题很迷茫,下面小编给大家带来一篇文章帮助大家了解,需要的朋友可以参考下

    Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结

    本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素是一个单链表的头节点,链表用来解决hash地址冲突问题。...

    java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    主要介绍了从源码的角度浅析HashMap、TreeMap元素的存储和获取元素的逻辑;从Map与Set之间的关系浅析常用的Set中元素的存储和判断是否重复的逻辑,需要的朋友可以参考下

    java-hashmap:Java HashMap的插图

    Java HashMap的插图 Java HashMap ...插图7:使用TreeMap对未排序的HashMap进行排序 关于项目 该项目包括样本NetBeans项目,该项目说明了Java HashMap类。 关于开发商 示例NetBeans项目作为一个示例,

    java中set、list和map的使用方法实例

    // java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器...另包含一篇网文:在java中使用TreeMap进行中文排序

    Java TreeMap 源码解析

    继上篇文章介绍完了HashMap,这篇文章开始介绍Map系列另一个比较重要的类TreeMap。 大家也许能感觉到,网络上介绍HashMap的文章比较多,但是介绍TreeMap反而不那么多,这里面是有原因:一方面HashMap的使用场景比较...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java集合详解4:HashMap和HashTable Java集合详解5:深入理解LinkedHashMap和LRU缓存 Java集合详解6:TreeMap和红黑树 Java集合详解7:HashSet,TreeSet与LinkedHashSet Java集合详解8:Java集合类细节精讲 JavaWeb

    移植Java代码到C++的技巧(整合)

    相比于Java,C++的STL也提供了map容器,其功能等同于Java中的TreeMap,至于HashMap,它并没有进入C++标准模板库。而幸运的是,现有的主流C++编译器供应商均提供了标准模板库的扩展包,并在该扩展包中实现了hash_map...

    HashMap源码实现红黑树添加元素和删除元素

    红黑树的应用非常广泛,例如 Epoll 实现、Java 集合中的 TreeSet 和 TreeMap、C++ STL 中的 set、map,以及 Linux 虚拟内存的管理,都是通过红黑树去实现的。 红黑树在 HashMap 中的应用可以提高查找、插入和删除...

    JAVA笔记(根据马士兵的java视频整理).pdf

    * JAVA中的集合框架,包括ArrayList、LinkedList、HashMap、TreeMap等 IO流 * JAVA中的IO流,包括文件输入/输出、网络输入/输出、BufferedReader、BufferedWriter等 多线程 * JAVA中的多线程编程,包括Thread、...

    java map实例,排序

    java map排序,hashmap,linkedmap,treemap,hashtable

    高级编程-java实验报告.docx

    2) 掌握Java集合框架的映射的概念以及映射的两种基本实现:HashMap,TreeMap; 3)掌握枚举类型以及枚举集、枚举映射的概念以及他们的实现; 实验内容 1)Java集合框架中几种具体实现的使用:ArrayList, LinkedList,...

    Java容器有两种基本类型Collection 和 Map

    Collection 和 Map 是 Java 中的两种基本容器类型,它们都可以用来存储和管理对象,但它们有着不同的特点和用途。 Collection 是一种聚集对象的容器,每个位置只能保存一个元素。Collection 的主要实现类有 List 和...

Global site tag (gtag.js) - Google Analytics