• 由HashMap的遍历看android的优化


      android的程序编写大部分时候都是用java,而android设备的性能多不是很高,所以对代码的优化是十分重要的,其中许多的优化技巧是可以从以往的PC平台JAVA优化技巧借鉴的。但是由于PC平台和嵌入式平台的硬件架构的巨大区别,导致盲目的采用以往的JAVA经验来优化android的代码可能会产生适得其反的后果。

      本文将就HashMap的遍历对这个问题进行一个初步的讨论。47K是新手程序猿,因此写的东西难免有所错漏,请您不吝赐教

      HashMap的遍历主要由两种方式:

      Solution I

    Map map = new HashMap(); 
    Iterator iter = map.keySet().iterator(); 
    while (iter.hasNext()) { 
        Object key = iter.next(); 
        Object val = map.get(key); 
    } 

      Solution II

    Map map = new HashMap(); 
    Iterator iter = map.entrySet().iterator(); 
    while (iter.hasNext()) { 
        Map.Entry entry = (Map.Entry) iter.next(); 
        Object key = entry.getKey(); 
        Object val = entry.getValue(); 
    } 

     

    在PC平台上,Solution I确实比II慢了不少

    用时情况如下

    KeySet 727
    EntrySet 354

    测试代码如下:

    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

    测试代码如下

    /**   
     * @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;
        }
    }

    可见,对不同平台的代码的优化应该是因地制宜,强调针对性的,而不能笼统的采用同样的思路

  • 相关阅读:
    IDEA连接 Oracle数据库
    什么是混合云备份
    什么是阿里云ACA认证
    什么是阿里云ACE认证
    什么是轻量应用服务器
    什么是时序时空数据库TSDB
    什么是数据管理DMS
    什么是分析型数据库PostgreSQL版
    阿里云多端小程序
    阿里云云计算ACP专业认证考试
  • 原文地址:https://www.cnblogs.com/Kiro/p/2591359.html
Copyright © 2020-2023  润新知