Java中 List、Set、Map遍历方式以及性能比较
目錄
- 一、簡介
- 二、遍歷方式
- 1、ArrayList遍歷方式
- (1)for循環(huán)遍歷
- (2)foreach循環(huán)遍歷
- (3)Iterator迭代器遍歷
- 2、LinkedList遍歷方式
- (1)for循環(huán)遍歷
- (2)foreach循環(huán)遍歷
- (3)Iterator迭代器遍歷
- 3、HashSet遍歷方式
- (1)foreach循環(huán)遍歷
- (2)Iterator迭代器遍歷
- 4、HashMap遍歷方式
- (1)entrySet遍歷
- (2)Iterator迭代器遍歷
- 5、LinkedHashMap遍歷方式
- (1)entrySet遍歷
- (2)Iterator迭代器遍歷
- 三、性能比較
一、簡介
List、Set 都繼承 Collection 接口,Map 不是。
-
List:元素有序存儲,元素可重復,取出來的順序可能和放入的順序不同,支持for循環(huán)和迭代器遍歷;
-
Set:元素無序存儲,且唯一,不能包含重復的元素,不支持for循環(huán)遍歷,支持迭代器遍歷;
-
Map:元素無序存儲,key值唯一不能重復,value值可重復,支持迭代器遍歷;
List、Set、Map實現(xiàn)類
-
List:ArrayList、LinkedList、Vector
-
Set:HashSet、TreeSet、LinkedHashSet
-
Map:HashMap、TreeMap、HashTable、LinkedHashMap
線程安全 / 線程不安全
-
線程安全:Vector、HashTable
-
線程不安全:ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、TreeMap、LinkedHashMap
下面我們只拿出 ArrayList、LinkedList、HashSet、HashMap、LinkedHashMap 來講解遍歷方式以及遍歷性能比較。
二、遍歷方式
1、ArrayList遍歷方式
ArrayList有三種遍歷方式:for循環(huán)遍歷、foreach循環(huán)遍歷、Iterator迭代器遍歷。
(1)for循環(huán)遍歷
ArrayList<String> lists = new ArrayList<String>(); for(int i=0;i<lists.size();i++){String line = lists.get(i); }(2)foreach循環(huán)遍歷
ArrayList<String> lists = new ArrayList<String>(); for(String str : lists){String line = str; }(3)Iterator迭代器遍歷
ArrayList<String> lists = new ArrayList<String>(); Iterator<String> iterator = lists.iterator(); while (iterator.hasNext()){String line = iterator.next(); }2、LinkedList遍歷方式
LinkedList有三種遍歷方式:for循環(huán)遍歷、foreach循環(huán)遍歷、Iterator迭代器遍歷。
(1)for循環(huán)遍歷
LinkedList<String> lists = new LinkedList<String>(); for(int i=0;i<lists.size();i++){String line = lists.get(i); }(2)foreach循環(huán)遍歷
LinkedList<String> lists = new LinkedList<String>(); for(String str : lists){String line = str; }(3)Iterator迭代器遍歷
LinkedList<String> lists = new LinkedList<String>(); Iterator<String> iterator = lists.iterator(); while (iterator.hasNext()){String line = iterator.next(); }3、HashSet遍歷方式
HashSet有兩種遍歷方式:foreach循環(huán)遍歷、Iterator迭代器遍歷。
(1)foreach循環(huán)遍歷
HashSet<String> hashSets = new HashSet<String>(); for(String str : hashSets){String line = str; }(2)Iterator迭代器遍歷
HashSet<String> hashSets = new HashSet<String>(); Iterator<String> iterator = hashSets.iterator(); while (iterator.hasNext()){String line = iterator.next(); }4、HashMap遍歷方式
HashMap有三種遍歷方式:keySet循環(huán)遍歷、entrySet遍歷、Iterator迭代器遍歷。
下面我們只講解 entrySet遍歷 和 Iterator迭代器遍歷。
(1)entrySet遍歷
HashMap<String, String> hashMaps = new HashMap<String, String>(); for(Map.Entry<String, String> entry : hashMaps.entrySet()){String line = entry.getKey(); }(2)Iterator迭代器遍歷
HashMap<String, String> hashMaps = new HashMap<String, String>(); Iterator iterator = hashMaps.entrySet().iterator(); while (iterator.hasNext()){Map.Entry<String, String> entry = (Map.Entry<String, String>)iterator.next();String line = entry.getKey(); }5、LinkedHashMap遍歷方式
LinkedHashMap有三種遍歷方式:keySet循環(huán)遍歷、entrySet遍歷、Iterator迭代器遍歷。
下面我們只講解 entrySet遍歷 和 Iterator迭代器遍歷 。
(1)entrySet遍歷
LinkedHashMap<String, String> linkedHashMaps = new LinkedHashMap<String, String>(); for(Map.Entry<String, String> entry : linkedHashMaps.entrySet()){String line = entry.getKey(); }(2)Iterator迭代器遍歷
LinkedHashMap<String, String> linkedHashMaps = new LinkedHashMap<String, String>(); Iterator iterator = linkedHashMaps.entrySet().iterator(); while (iterator.hasNext()){Map.Entry<String, String> entry = (Map.Entry<String, String>)iterator.next();String line = entry.getKey(); }三、性能比較
不同數(shù)量級的性能差異是比較大的,下面我們分別在30、100、1000、10000、100000數(shù)量級進行性能比較。
完整代碼如下:
package com.example.springbootdemo.util;import java.util.*;public class Test {public static void main(String[] args) {compare();}private static ArrayList<String> lists = new ArrayList<String>();private static LinkedList<String> linkedLists = new LinkedList<String>();private static HashSet<String> hashSets = new HashSet<String>();private static HashMap<String, String> hashMaps = new HashMap<String, String>();private static LinkedHashMap<String, String> linkedHashMaps = new LinkedHashMap<String, String>();private static void compare(){compareInit(100000);compare1();}private static void compareInit(int count){lists.clear();linkedLists.clear();hashMaps.clear();hashSets.clear();linkedHashMaps.clear();String str = "abcdefg_";String one = "";for(int i=0;i<count;i++){one = str + i;lists.add(one);linkedLists.add(one);hashSets.add(one);hashMaps.put(one, one);linkedHashMaps.put(one, one);}}private static final String listFor = "ArrayList for duration";private static final String listForeach = "ArrayList foreach duration";private static final String listIterator = "ArrayList Iterator duration";private static final String linkedListFor = "LinkedList for duration";private static final String linkedListForeach = "LinkedList foreach duration";private static final String linkedListIterator = "LinkedList Iterator duration";private static final String hashSetForeach = "HashSet foreach duration";private static final String hashSetIterator = "HashSet Iterator duration";private static final String hashMapEntry = "HashMap entry duration";private static final String hashMapIterator = "HashMap Iterator duration";private static final String linkedHashMapEntry = "LinkedHashMap entry duration";private static final String linkedHashMapIterator = "LinkedHashMap Iterator duration";private static void compare1(){for(int i=0;i<5;i++){System.out.println("------------------------------");listOne();listTwo();listThree();linkedListOne();linkedListTwo();linkedListThree();hashSetOne();hashSetTwo();hashMapOne();hashMapTwo();linkedHashMapOne();linkedHashMapTwo();System.out.println();}}private static void listOne(){String line = "";long start = System.nanoTime();for(int i=0;i<lists.size();i++){line = lists.get(i);}long end = System.nanoTime();print(start, end, listFor);}private static void listTwo(){String line = "";long start = System.nanoTime();for(String str : lists){line = str;}long end = System.nanoTime();print(start, end, listForeach);}private static void listThree(){String line = "";long start = System.nanoTime();Iterator<String> iterator = lists.iterator();while (iterator.hasNext()){line = iterator.next();}long end = System.nanoTime();print(start, end, listIterator);}private static void linkedListOne(){String line = "";long start = System.nanoTime();for(int i=0;i<linkedLists.size();i++){line = linkedLists.get(i);}long end = System.nanoTime();print(start, end, linkedListFor);}private static void linkedListTwo(){String line = "";long start = System.nanoTime();for(String str : linkedLists){line = str;}long end = System.nanoTime();print(start, end, linkedListForeach);}private static void linkedListThree(){String line = "";long start = System.nanoTime();Iterator<String> iterator = linkedLists.iterator();while (iterator.hasNext()){line = iterator.next();}long end = System.nanoTime();print(start, end, linkedListIterator);}private static void hashSetOne(){String line = "";long start = System.nanoTime();for(String str : hashSets){line = str;}long end = System.nanoTime();print(start, end, hashSetForeach);}private static void hashSetTwo(){String line = "";long start = System.nanoTime();Iterator<String> iterator = hashSets.iterator();while (iterator.hasNext()){line = iterator.next();}long end = System.nanoTime();print(start, end, hashSetIterator);}private static void hashMapOne(){String line = "";long start = System.nanoTime();for(Map.Entry<String, String> entry : hashMaps.entrySet()){line = entry.getKey();}long end = System.nanoTime();print(start, end, hashMapEntry);}private static void hashMapTwo(){String line = "";long start = System.nanoTime();Iterator iterator = hashMaps.entrySet().iterator();while (iterator.hasNext()){Map.Entry<String, String> entry = (Map.Entry<String, String>)iterator.next();line = entry.getKey();}long end = System.nanoTime();print(start, end, hashMapIterator);}private static void linkedHashMapOne(){String line = "";long start = System.nanoTime();for(Map.Entry<String, String> entry : linkedHashMaps.entrySet()){line = entry.getKey();}long end = System.nanoTime();print(start, end, linkedHashMapEntry);}private static void linkedHashMapTwo(){String line = "";long start = System.nanoTime();Iterator iterator = linkedHashMaps.entrySet().iterator();while (iterator.hasNext()){Map.Entry<String, String> entry = (Map.Entry<String, String>)iterator.next();line = entry.getKey();}long end = System.nanoTime();print(start, end, linkedHashMapIterator);}private static void print(long start, long end, String tip){System.out.println(tip + " = [" + ((double)((end - start)/1000))/1000 + "]ms");} }我們經(jīng)過多輪測試,取相對合理的結果進行展示,單位為:毫秒(ms)
| ArrayList for | 0.003 | 0.008 | 0.057 | 0.519 | 0.674 |
| ArrayList foreach | 0.012 | 0.009 | 0.065 | 0.495 | 0.632 |
| ArrayList Iterator | 0.010 | 0.007 | 0.074 | 0.499 | 0.62 |
| LinkedList for | 0.031 | 0.039 | 0.498 | 64.044 | 16374.155 |
| LinkedList foreach | 0.011 | 0.012 | 0.075 | 0.526 | 1.989 |
| LinkedList Iterator | 0.008 | 0.008 | 0.068 | 0.518 | 1.98 |
| HashSet foreach | 0.009 | 0.025 | 0.087 | 0.754 | 1.955 |
| HashSet Iterator | 0.005 | 0.011 | 0.093 | 0.73 | 1.931 |
| HashMap entrySet | 0.012 | 0.025 | 0.092 | 0.955 | 2.007 |
| HashMap Iterator | 0.009 | 0.015 | 0.082 | 0.905 | 2.0 |
| LinkedHashMap entrySet | 0.016 | 0.025 | 0.09 | 0.719 | 2.596 |
| LinkedHashMap Iterator | 0.012 | 0.013 | 0.078 | 0.704 | 2.46 |
單個類型不同遍歷方式性能比較總結:
-
ArrayList:三種遍歷方式性能差距不大,數(shù)量級較小時,for循環(huán)遍歷更優(yōu),數(shù)量級較大時,Iterator迭代器遍歷方式性能更優(yōu);
-
LinkedList:三種遍歷方式中for循環(huán)遍歷性能最差,其他兩種方式性能差距比較小,但是Iterator迭代器遍歷方式性能更優(yōu);
-
HashSet:兩種遍歷方式性能差距不大,但是Iterator迭代器遍歷方式性能更優(yōu);
-
HashMap:兩種遍歷方式性能差距不大,但是Iterator迭代器遍歷方式性能更優(yōu);
-
LinkedHashMap:兩種遍歷方式性能差距不大,但是Iterator迭代器遍歷方式性能更優(yōu);
整體性能比較總結:
- 同等數(shù)量級,ArrayList的遍歷性能更優(yōu);
總結
以上是生活随笔為你收集整理的Java中 List、Set、Map遍历方式以及性能比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小孩上学
- 下一篇: Java提高篇 —— Java内部类详解