for循環和HashMap查找性能比較

  • 難點
    HashMap的初始化比較難實現
  • 初始化實現如下:
	HashMap<String,List<Hero>> heroMap =new HashMap<String, List<Hero>>();
	        //h裏面就是一系列Hero對象,對象不同,但h.name可能會相等
			for (Hero h : hero) {
			//
				List<Hero> list= heroMap.get(h.name);
	            if(list==null){
	                list = new ArrayList<>();
	                heroMap.put(h.name, list);
	            }
	          //list不爲空的話等價於已經建立了key-value的唯一對應
	          //如果是出現過的name,就不需要新建ArrayList了,直接加到已有的list中
	            list.add(h);
	        }
  • 分析如下(逐行進行分析)
  1. 首先創建一個HashMap對象。key爲名字(例如hero0000-hero9999)。
  2. hero本身就是一個ArrayList對象,裏面存在着由隨機數生成的30w個對象。重點是這30w個對象裏面可能存在着對象不同但名字相同的情況。這時候HashMap的作用就來了,相當於一個名字存在多個對象,把那些名字相同的對象放到一個List裏面。(生成hero的代碼見下文完整實現)
  3. 進入增強for循環進行迭代。首次進入for循環,創建Hero的List對象(例如創建了名字爲hero-1234的對象),它的值由HashMapvalue給出,但是這時候還沒有鍵值對的對應。也就是沒有value,進一步說就是list不存在(null)。因此進入step4
  4. if判斷的目的是當迭代往後走的時候,如果h.namelist不存在,就需要 list = new ArrayList<>();,然後將名字h.name和對應list裝進HashMap對象。
  5. 如果當前h.namelist已經存在,那就將當前的h添加到已有的list中去。
  • 完整實現如下
package collection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class HashMapTest {
	public static void main(String[] args) {
		//for循環初始化
		System.out.println("for循環初始化開始");
		List<Hero> hero = new ArrayList<Hero> ();
		for(int i = 0; i<300*10000; i++) {
			hero.add(new Hero("hero-"+(int)(Math.random()*9999)));
		}
		System.out.println("for循環初始化結束");
		//for循環查找
		String name = "hero-5555";
		int count = 0;
		long start1 = System.currentTimeMillis();
		for(int i = 0; i<hero.size(); i++) {
			 Hero h = (Hero)hero.get(i);
			 if(name.equals(h.name)) {
				  //System.out.println(h.name);
				 count++;
			 }
		}
		long end1 = System.currentTimeMillis();
		System.out.printf("使用for循環一共找到%d個hero-5555\n總花費時間是%d毫秒\n",count,end1-start1);
		System.out.println("-------------------------");
			//HashMap初始化
			System.out.println("HashMap初始化開始");
			HashMap<String,List<Hero>> heroMap =new HashMap<String, List<Hero>>();
	        //h裏面就是一系列Hero對象,對象不同,但h.name可能會相等
			for (Hero h : hero) {
	          
				List<Hero> list= heroMap.get(h.name);
	            if(list==null){
	                list = new ArrayList<>();
	                heroMap.put(h.name, list);
	            }
	          //如果是出現過的name,就不需要新建ArrayList了,直接加到已有的list中
	            list.add(h);
	        }	
	        System.out.println("HashMap初始化結束");
		 //用HashMap查找
		long start2 = System.currentTimeMillis();
		List <Hero> result= heroMap.get("hero-5555");
		long end2 = System.currentTimeMillis();
		System.out.printf("使用HashMap一共找到%d個hero-5555\n總花費時間是%d毫秒",result.size(),end2-start2);
	}
}
  • 結果截圖
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章