- 難點
HashMap
的初始化比較難實現
- 初始化實現如下:
HashMap<String,List<Hero>> heroMap =new HashMap<String, List<Hero>>();
for (Hero h : hero) {
List<Hero> list= heroMap.get(h.name);
if(list==null){
list = new ArrayList<>();
heroMap.put(h.name, list);
}
list.add(h);
}
- 首先創建一個
HashMap
對象。key
爲名字(例如hero0000-hero9999
)。
- hero本身就是一個
ArrayList
對象,裏面存在着由隨機數生成的30w
個對象。重點是這30w
個對象裏面可能存在着對象不同但名字相同的情況。這時候HashMap
的作用就來了,相當於一個名字存在多個對象,把那些名字相同的對象放到一個List
裏面。(生成hero
的代碼見下文完整實現)
- 進入增強
for
循環進行迭代。首次進入for
循環,創建Hero
的List對象(例如創建了名字爲hero-1234
的對象),它的值由HashMap
的value
給出,但是這時候還沒有鍵值對的對應。也就是沒有value
,進一步說就是list
不存在(null)
。因此進入step4
。
if
判斷的目的是當迭代往後走的時候,如果h.name
的list
不存在,就需要 list = new ArrayList<>();
,然後將名字h.name
和對應list
裝進HashMap
對象。
- 如果當前
h.name
的list
已經存在,那就將當前的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) {
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循環初始化結束");
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)) {
count++;
}
}
long end1 = System.currentTimeMillis();
System.out.printf("使用for循環一共找到%d個hero-5555\n總花費時間是%d毫秒\n",count,end1-start1);
System.out.println("-------------------------");
System.out.println("HashMap初始化開始");
HashMap<String,List<Hero>> heroMap =new HashMap<String, List<Hero>>();
for (Hero h : hero) {
List<Hero> list= heroMap.get(h.name);
if(list==null){
list = new ArrayList<>();
heroMap.put(h.name, list);
}
list.add(h);
}
System.out.println("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);
}
}
- 結果截圖