| |
说明:我所涉及到的试验代码,均是针对于1百万条记录,我的硬件配置如下:cpup4 1.5g,256m ddr的内存。 如果要试验其代码,要采用这种方式运行:java -xms128m -xmx250m testmap 1,对内存容量的要求 map对象高于list。因为map除了value外还需要一个object的key,从而增大了map的容量。试验代码如下:
import java.util.*; public class testmap { public static void main(string[] args) { system.out.println("begin>>>>>>>>>>>>>>"); long sm = runtime.getruntime().totalmemory(); system.out.println("begin memory :" + sm); map m = new hashtable(); //linkedlist tmplist = new linkedlist(); for (int i=0;i<1000000;i++) { m.put(""+i,"i=" + i); //integer integer = new integer(i); //tmplist.add(integer); } long em = runtime.getruntime().totalmemory(); system.out.println("end memory :" + em); system.out.println("end-start memory :" + (em - sm)); //walklist(tmplist); system.out.println("<<<<<<<<<<<<<<<<end"); //find(m,"985757"); walkmap(m); //list tmplist = new linkedlist(); //tmplist.addall(m.values()); } }
其对比结果如下:1百万条记录map大概需要70m额外空间,而list不需要,其额外空间为0 2.遍历比较 我在试验中,发现我们经常采用遍历list的方式是一个错误的遍历方式,其性能其差无比。我们经常遍历list代码实例如下: for(int i = 0;i<list.size();i++) { object obj = list.get(i); } 如果list的遍历方式换一种方式,其性能和map差不多,我们将上面的代码进行扩充,从而来比较map和list的遍历速度: import java.util.*; /** * @author whxu * @version 1.0.0 2003-4-22 am */ public class testmap { public static void main(string[] args) { system.out.println("begin>>>>>>>>>>>>>>"); long sm = runtime.getruntime().totalmemory(); system.out.println("begin memory :" + sm); map m = new hashtable(); //linkedlist tmplist = new linkedlist(); for (int i=0;i<1000000;i++) { m.put(""+i,"i=" + i); //integer integer = new integer(i); //tmplist.add(integer); } long em = runtime.getruntime().totalmemory(); system.out.println("end memory :" + em); system.out.println("end-start memory :" + (em - sm)); //walklist(tmplist); system.out.println("<<<<<<<<<<<<<<<<end"); //find(m,"985757"); walkmap(m); //list tmplist = new linkedlist(); //tmplist.addall(m.values()); } public static void find(map m,string key) { long st = system.currenttimemillis(); object obj = m.get(key); system.out.println("object:" + obj); long et = system.currenttimemillis(); system.out.println("start time:" + st); system.out.println("end time:" + et); system.out.println("use time:" + (et - st)); } public static void walkmap(map m) { long st = system.currenttimemillis(); for(iterator it = m.values().iterator();it.hasnext();) { object obj = it.next(); } long et = system.currenttimemillis(); system.out.println("walkmap start time:" + st); system.out.println("walkmap end time:" + et); system.out.println("walkmap use time:" + (et - st)); } public static void walklist(linkedlist l) { long st = system.currenttimemillis(); object obj = null; //system.out.println(l.get(3434)); /*这种遍历方式的性能其差无比,建议不要使用 for(int i=0;i<l.size();i++) { obj = l.get(i); } */ for(iterator it = l.iterator();it.hasnext();) { obj = it.next(); } long et = system.currenttimemillis(); system.out.println("walklist start time:" + st); system.out.println("walklist end time:" + et); system.out.println("walklist use time:" + (et - st)); } }
3.随机查找。如果map知道了key,list知道了index,其性能在一百万条数据中无多大差别。其实例代码如下:
import java.util.*; /** * @author whxu * @version 1.0.0 2003-4-22 am */ public class testmap { public static void main(string[] args) { system.out.println("begin>>>>>>>>>>>>>>"); long sm = runtime.getruntime().totalmemory(); system.out.println("begin memory :" + sm); map m = new hashtable(); linkedlist tmplist = new linkedlist(); for (int i=0;i<1000000;i++) { //m.put(""+i,"i=" + i); tmplist.add("i=" + i); } long em = runtime.getruntime().totalmemory(); system.out.println("end memory :" + em); system.out.println("end-start memory :" + (em - sm)); //walklist(tmplist); system.out.println("<<<<<<<<<<<<<<<<end"); //find(m,"985757"); find(tmplist,1000000-1); //walkmap(m); //list tmplist = new linkedlist(); //tmplist.addall(m.values()); } public static void find(map m,string key) { long st = system.currenttimemillis(); object obj = m.get(key); system.out.println("find map object:" + obj); long et = system.currenttimemillis(); system.out.println("find map start time:" + st); system.out.println("find map end time:" + et); system.out.println("find map use time:" + (et - st)); } public static void find(list l,int index) { long st = system.currenttimemillis(); object obj = l.get(index); system.out.println("find list object:" + obj); long et = system.currenttimemillis(); system.out.println("find list start time:" + st); system.out.println("find list end time:" + et); system.out.println("find list use time:" + (et - st)); } public static void walkmap(map m) { long st = system.currenttimemillis(); for(iterator it = m.values().iterator();it.hasnext();) { object obj = it.next(); } long et = system.currenttimemillis(); system.out.println("walkmap start time:" + st); system.out.println("walkmap end time:" + et); system.out.println("walkmap use time:" + (et - st)); } public static void walklist(linkedlist l) { long st = system.currenttimemillis(); object obj = null; //system.out.println(l.get(3434)); /*for(int i=0;i<l.size();i++) { obj = l.get(i); } */ for(iterator it = l.iterator();it.hasnext();) { obj = it.next(); } long et = system.currenttimemillis(); system.out.println("walklist start time:" + st); system.out.println("walklist end time:" + et); system.out.println("walklist use time:" + (et - st)); } }
|
|