android的程序编写大部分时候都是用java,而android设备的性能多不是很高,所以对代码的优化是十分重要的,其中许多的优化技巧是可以从以往的PC平台JAVA优化技巧借鉴的。但是由于PC平台和嵌入式平台的硬件架构的巨大区别,导致盲目的采用以往的JAVA经验来优化android的代码可能会产生适得其反的后果。
本文将就HashMap的遍历对这个问题进行一个初步的讨论。47K是新手程序猿,因此写的东西难免有所错漏,请您不吝赐教
HashMap的遍历主要由两种方式:
Solution I
Java code ?
1 2 3 4 5 6 | Map map = new HashMap(); Iterator iter = map.keySet().iterator(); while (iter.hasNext()) { Object key = iter.next(); Object val = map.get(key); } |
Solution II
Java code ?
1 2 3 4 5 6 | Map map = new HashMap(); Iterator iter = map.keySet().iterator(); while (iter.hasNext()) { Object key = iter.next(); Object val = map.get(key); } |
在PC平台上,Solution I确实比II慢了不少
用时情况如下
KeySet 727
EntrySet 354
测试代码如下:
Java code ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | import java.io.ObjectInputStream.GetField; import java.util.HashMap; import java.util.Iterator; /** * @Title: test.java * @Package * @Description: TODO(用一句话描述该文件做什么) * @author no47wk lotp,Come back * @date 2012-7-14 上午11:02:23 * @version V1.0 */ /** * @ClassName: test * @Description: TODO(这里用一句话描述这个类的作用) * @author no47wk lotp,Come back * @date 2012-7-14 上午11:02:23 */ public class test { public static void main(String[] args) { test t= new test(); t.KeySet(); t.EntrySet(); } private void KeySet() { HashMap<String, String> map = getData(); Iterator<String> ite = map.keySet().iterator(); long start = System.currentTimeMillis(); while (ite.hasNext()) { map.get(ite.next()); } long end = System.currentTimeMillis(); long time = end - start; System.out.println( "KeySet " + time + "" ); } private void EntrySet() { HashMap<String, String> map = getData(); Iterator<java.util.Map.Entry<String, String>> ite = map.entrySet() .iterator(); java.util.Map.Entry<String, String> entry; long start = System.currentTimeMillis(); while (ite.hasNext()) { entry = ite.next(); entry.getKey(); entry.getValue(); } long end = System.currentTimeMillis(); long time = end - start; System.out.println( "EntrySet " + time + "" ); } private HashMap<String, String> getData() { HashMap<String, String> ret = new HashMap<String, String>(); int i = 0 ; while (i < 10000000 ) { ret.put(String.valueOf(i), "a" ); i++; } return ret; } } |
但是在android平台上,两种方法的测试结果就非常接近了,甚至大部分情况下Solution I还比II更快一点,
用时情况如下
KeySet 5585
EntrySet 6515
测试代码如下
Java code ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | /** * @Title: Test.java * @Package com.lotp.Test * @Description: TODO(用一句话描述该文件做什么) * @author no47wk lotp,Come back * @date 2012-7-14 上午10:43:22 * @version V1.0 */ package com.lotp.Test; import java.util.HashMap; import java.util.Iterator; import android.app.Activity; import android.os.Bundle; import android.os.DropBoxManager.Entry; import android.util.Log; /** * @ClassName: Test * @Description: TODO(这里用一句话描述这个类的作用) * @author no47wk lotp,Come back * @date 2012-7-14 上午10:43:22 */ public class Test extends Activity { private HashMap<String, String> map; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super .onCreate(savedInstanceState); long start = System.currentTimeMillis(); map = getData(); KeySet(); EntrySet(); } private void KeySet(){ Iterator<String> ite = map.keySet().iterator(); long start=System.currentTimeMillis(); while (ite.hasNext()) { map.get(ite.next()); } long end = System.currentTimeMillis(); Log.d( "KeySet" , end - start + " " ); } private void EntrySet(){ Iterator<java.util.Map.Entry<String, String>> ite=map.entrySet().iterator(); java.util.Map.Entry<String, String> entry; long start=System.currentTimeMillis(); while (ite.hasNext()){ entry=ite.next(); entry.getKey(); entry.getValue(); } long end=System.currentTimeMillis(); Log.d( "EntrySet" , end-start+ "" ); } private HashMap<String, String> getData() { HashMap<String, String> ret = new HashMap<String, String>(); int i = 0 ; while (i < 102400 ) { ret.put(String.valueOf(i), "a" ); i++; } return ret; } } |
可见,对不同平台的代码的优化应该是因地制宜,强调针对性的,而不能笼统的采用同样的思路