目录

  • 一、简介
  • 二、遍历方式
    • 1、ArrayList遍历方式
      • (1)for循环遍历
      • (2)foreach循环遍历
      • (3)Iterator迭代器遍历
    • 2、LinkedList遍历方式
      • (1)for循环遍历
      • (2)foreach循环遍历
      • (3)Iterator迭代器遍历
    • 3、HashSet遍历方式
      • (1)foreach循环遍历
      • (2)Iterator迭代器遍历
    • 4、HashMap遍历方式
      • (1)entrySet遍历
      • (2)Iterator迭代器遍历
    • 5、LinkedHashMap遍历方式
      • (1)entrySet遍历
      • (2)Iterator迭代器遍历
  • 三、性能比较

一、简介

ListSet 都继承 Collection 接口,Map 不是。

  • List:元素有序存储,元素可重复,取出来的顺序可能和放入的顺序不同,支持for循环和迭代器遍历;

  • Set:元素无序存储,且唯一,不能包含重复的元素,不支持for循环遍历,支持迭代器遍历;

  • Map:元素无序存储,key值唯一不能重复,value值可重复,支持迭代器遍历;

List、Set、Map实现类

  • ListArrayListLinkedListVector

  • SetHashSetTreeSetLinkedHashSet

  • MapHashMapTreeMapHashTableLinkedHashMap

线程安全 / 线程不安全

  • 线程安全:Vector、HashTable

  • 线程不安全:ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、TreeMap、LinkedHashMap

下面我们只拿出 ArrayListLinkedListHashSetHashMapLinkedHashMap 来讲解遍历方式以及遍历性能比较。

二、遍历方式

1、ArrayList遍历方式

ArrayList有三种遍历方式:for循环遍历foreach循环遍历Iterator迭代器遍历

(1)for循环遍历

ArrayList<String> lists = new ArrayList<String>();
for(int i=0;i<lists.size();i++){String line = lists.get(i);
}

(2)foreach循环遍历

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循环遍历foreach循环遍历Iterator迭代器遍历

(1)for循环遍历

LinkedList<String> lists = new LinkedList<String>();
for(int i=0;i<lists.size();i++){String line = lists.get(i);
}

(2)foreach循环遍历

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循环遍历Iterator迭代器遍历

(1)foreach循环遍历

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循环遍历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循环遍历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();
}

三、性能比较

不同数量级的性能差异是比较大的,下面我们分别在30、100、1000、10000、100000数量级进行性能比较。

完整代码如下:

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");}
}

我们经过多轮测试,取相对合理的结果进行展示,单位为:毫秒(ms)

type 30 100 1000 10000 100000
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:三种遍历方式性能差距不大,数量级较小时,for循环遍历更优,数量级较大时,Iterator迭代器遍历方式性能更优;

  • LinkedList:三种遍历方式中for循环遍历性能最差,其他两种方式性能差距比较小,但是Iterator迭代器遍历方式性能更优;

  • HashSet:两种遍历方式性能差距不大,但是Iterator迭代器遍历方式性能更优;

  • HashMap:两种遍历方式性能差距不大,但是Iterator迭代器遍历方式性能更优;

  • LinkedHashMap:两种遍历方式性能差距不大,但是Iterator迭代器遍历方式性能更优;

整体性能比较总结:

  • 同等数量级,ArrayList的遍历性能更优;

Java中 List、Set、Map遍历方式以及性能比较相关推荐

  1. java中的Map遍历方式总结

    java中的Map遍历方式总结 import java.util.HashMap; import java.util.Iterator; import java.util.Map;public cla ...

  2. java list for循环遍历_详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...

  3. java集合for循环_详解Java中list,set,map的遍历与增强for循环

    详解Java中list,set,map的遍历与增强for循环 Java集合类可分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 关于增强for ...

  4. java entryset循环_Java之Map遍历方式性能分析:ketSet 与 entrySet

    keySet():将Map中所有的键存入到Set集合中.因为set具备迭代器,所以可以以迭代方式取出所有的键,再根据get方法获取每一个键对应的值,其仅能通过get()取key. entrySet() ...

  5. Java中的映射Map - 入门篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的映射Map - 入门篇>,希望对大家有帮助,谢谢 简介 前面介绍了集合List,这里开始简单介绍下映射Map,相关类如下图所示 正 ...

  6. java 中的多种判空方式

    前言   如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^.   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!! java 中的多种判空方式 1 ...

  7. java中list和map详解

    java中list和map详解 一.概叙 List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口, List下有ArrayList,Vector,LinkedL ...

  8. 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

  9. Java中创建对象的几种方式

    Java中创建对象的几种方式 1.使用new创建对象,在堆上创建. 2.克隆 3.反序列化 4.反射创建对象 5.NIO中可以使用本地方法直接分配堆外内存. 转载于:https://www.cnblo ...

最新文章

  1. Target host is not specified错误
  2. 1016. 部分A+B (15)
  3. Linux卸载蓝牙模块,Linux 下调试低功耗蓝牙的笔记
  4. [BUUCTF-pwn]——picoctf_2018_shellcode
  5. cdt开发java_Eclipse:可以将CDT和Java IDE放在一起
  6. java第九章实验报告_2019JAVA第九次实验报告
  7. Python实现自动推本地github博客到远程仓库
  8. java 异步_聊聊java高并发系统之异步非阻塞
  9. java httpclient 重定向_如何在HttpClient中自动重定向(java,apache)
  10. 清空shell控制台内容_RISC-V单片机快速入门03-基于RT_Thread Nano添加控制台
  11. matlab画交通标志,基于MATLAB的交通标志设计方法研究
  12. 智能优化算法:人工电场优化算法-附代码
  13. C++test对多变参数的函数打桩处理技巧
  14. HSF (RPC远程调用框架)
  15. 【笔记总结】高中英语——其二:名词性从句
  16. “Defaulting to user installation because normal site-packages is not writeable“
  17. 利用迪纳波利 (DINAPOLI) 等级进行交易
  18. MaxScript入门指引系列(五)数组和Visual MaxScript editor
  19. docker中php环境慢,解决访问本地 docker 项目慢的问题
  20. windows命令大全_建议收藏!这是最全的Windows快捷键使用指南

热门文章

  1. shell 脚本比较字符串相等_比较带空格的字符串相等的Shell脚本 如何比较两个.....
  2. ajax中async_小猿圈web前端之ajax的同步和异步有怎样的区别?
  3. aop实现原理_SpringAOP原理分析
  4. CyclicBarrier-同步辅助类
  5. PWN-PRACTICE-BUUCTF-11
  6. Redis 支持的数据类型
  7. 【牛客 - 327牛客寒假算法基础集训营2 I】处女座的测验(二)(积性函数性质,数论,素数唯一性分解,STL)
  8. 【计蒜客 - 蓝桥训练】炮台实验(数学期望,期望dp)
  9. 【CodeForces - 798A】Mike and palindrome (回文串,水题,字符串问题)
  10. 【CodeForces - 245C 】Game with Coins (思维,贪心)