在 Java 中遍历 HashMap 的5种最佳方式

原文:在 Java 中遍历 HashMap 的5种最佳方式_罗汉翔的博客-CSDN博客_java 遍历hashmap

将通过示例讨论在 Java 上遍历 HashMap[3] 的五种最佳方法。

  1. 使用 Iterator 遍历 HashMap EntrySet
  2. 使用 Iterator 遍历 HashMap KeySet
  3. 使用 For-each 循环迭代 HashMap
  4. 使用 Lambda 表达式[4]遍历 HashMap
  5. 使用 Stream API[5] 遍历 HashMap

通过
https://www.javaguides.net/2018/07/java-8-lambda-expressions.html [6]了解有关 lambda 表达式的信息

1. 使用 Iterator 遍历 HashMap EntrySet

 
  1. package com.java.tutorials.iterations;

  2. import java.util.HashMap;

  3. import java.util.Iterator;

  4. import java.util.Map;

  5. import java.util.Map.Entry;

  6. /**

  7. * 在 Java 中遍历 HashMap 的5种最佳方法

  8. * @author Ramesh Fadatare

  9. *

  10. */

  11. public class IterateHashMapExample {

  12. public static void main(String[] args) {

  13. // 1. 使用 Iterator 遍历 HashMap EntrySet

  14. Map < Integer, String > coursesMap = new HashMap < Integer, String > ();

  15. coursesMap.put(1, "C");

  16. coursesMap.put(2, "C++");

  17. coursesMap.put(3, "Java");

  18. coursesMap.put(4, "Spring Framework");

  19. coursesMap.put(5, "Hibernate ORM framework");

  20. Iterator < Entry < Integer, String >> iterator = coursesMap.entrySet().iterator();

  21. while (iterator.hasNext()) {

  22. Entry < Integer, String > entry = iterator.next();

  23. System.out.println(entry.getKey());

  24. System.out.println(entry.getValue());

  25. }

  26. }

  27. }

Output:

 
  1. 1

  2. C

  3. 2

  4. C++

  5. 3

  6. Java

  7. 4

  8. Spring Framework

  9. 5

  10. Hibernate ORM framework

2. 使用 Iterator 遍历 HashMap KeySet

 
  1. package com.java.tutorials.iterations;

  2. import java.util.HashMap;

  3. import java.util.Iterator;

  4. import java.util.Map;

  5. /**

  6. * 在 Java 中遍历 HashMap 的5种最佳方法

  7. * @author Ramesh Fadatare

  8. *

  9. */

  10. public class IterateHashMapExample {

  11. public static void main(String[] args) {

  12. Map < Integer, String > coursesMap = new HashMap < Integer, String > ();

  13. coursesMap.put(1, "C");

  14. coursesMap.put(2, "C++");

  15. coursesMap.put(3, "Java");

  16. coursesMap.put(4, "Spring Framework");

  17. coursesMap.put(5, "Hibernate ORM framework");

  18. // 2. 使用 Iterator 遍历 HashMap KeySet

  19. Iterator < Integer > iterator = coursesMap.keySet().iterator();

  20. while (iterator.hasNext()) {

  21. Integer key = iterator.next();

  22. System.out.println(key);

  23. System.out.println(coursesMap.get(key));

  24. }

  25. }

  26. }

Output:

 
  1. 1

  2. C

  3. 2

  4. C++

  5. 3

  6. Java

  7. 4

  8. Spring Framework

  9. 5

  10. Hibernate ORM framework

3. 使用 For-each 循环遍历 HashMap

 
  1. package com.java.tutorials.iterations;

  2. import java.util.HashMap;

  3. import java.util.Map;

  4. /**

  5. * 在 Java 中遍历 HashMap 的5种最佳方法

  6. * @author Ramesh Fadatare

  7. *

  8. */

  9. public class IterateHashMapExample {

  10. public static void main(String[] args) {

  11. Map < Integer, String > coursesMap = new HashMap < Integer, String > ();

  12. coursesMap.put(1, "C");

  13. coursesMap.put(2, "C++");

  14. coursesMap.put(3, "Java");

  15. coursesMap.put(4, "Spring Framework");

  16. coursesMap.put(5, "Hibernate ORM framework");

  17. // 3. 使用 For-each 循环遍历 HashMap

  18. for (Map.Entry < Integer, String > entry: coursesMap.entrySet()) {

  19. System.out.println(entry.getKey());

  20. System.out.println(entry.getValue());

  21. }

  22. }

  23. }

Output:

 
  1. 1

  2. C

  3. 2

  4. C++

  5. 3

  6. Java

  7. 4

  8. Spring Framework

  9. 5

  10. Hibernate ORM framework

4. 使用 Lambda 表达式遍历 HashMap

 
  1. package com.java.tutorials.iterations;

  2. import java.util.HashMap;

  3. import java.util.Map;

  4. /**

  5. * 在 Java 中遍历 HashMap 的5种最佳方法

  6. * @author Ramesh Fadatare

  7. *

  8. */

  9. public class IterateHashMapExample {

  10. public static void main(String[] args) {

  11. Map < Integer, String > coursesMap = new HashMap < Integer, String > ();

  12. coursesMap.put(1, "C");

  13. coursesMap.put(2, "C++");

  14. coursesMap.put(3, "Java");

  15. coursesMap.put(4, "Spring Framework");

  16. coursesMap.put(5, "Hibernate ORM framework");

  17. // 4. 使用 Lambda 表达式遍历 HashMap

  18. coursesMap.forEach((key, value) -> {

  19. System.out.println(key);

  20. System.out.println(value);

  21. });

  22. }

  23. }

Output:

 
  1. 1

  2. C

  3. 2

  4. C++

  5. 3

  6. Java

  7. 4

  8. Spring Framework

  9. 5

  10. Hibernate ORM framework

5. 使用 Stream API 遍历 HashMap

 
  1. package com.java.tutorials.iterations;

  2. import java.util.HashMap;

  3. import java.util.Map;

  4. /**

  5. * 在 Java 中遍历 HashMap 的5种最佳方法

  6. * @author Ramesh Fadatare

  7. *

  8. */

  9. public class IterateHashMapExample {

  10. public static void main(String[] args) {

  11. Map < Integer, String > coursesMap = new HashMap < Integer, String > ();

  12. coursesMap.put(1, "C");

  13. coursesMap.put(2, "C++");

  14. coursesMap.put(3, "Java");

  15. coursesMap.put(4, "Spring Framework");

  16. coursesMap.put(5, "Hibernate ORM framework");

  17. // 5. 使用 Stream API 遍历 HashMap

  18. coursesMap.entrySet().stream().forEach((entry) - > {

  19. System.out.println(entry.getKey());

  20. System.out.println(entry.getValue());

  21. });

  22. }

  23. }

Output:

 
  1. 1

  2. C

  3. 2

  4. C++

  5. 3

  6. Java

  7. 4

  8. Spring Framework

  9. 5

  10. Hibernate ORM framework

HashMap 的相关教程

  • 集合框架-HashMap 类[7]
  • 集合框架-LinkedHashMap 类[8]
  • 集合框架-TreeMap 类[9]
  • 集合框架-EnumMap[10]
  • 集合框架-WeakHashMap[11]
  • 集合框架-IdentityHashMap[12]

Java中List集合的遍历

1 Iterator迭代器

使用迭代器Iterator进行遍历,这是直接根据List集合的一种自动遍历方式;

 
  1. import java.util.ArrayList;

  2.  

  3. public class Demo03 {

  4.     public static void main(String[] args) {

  5.         ArrayList<News> list = new ArrayList<News>();

  6.     

  7.         list.add(new News(1,"list1","a"));

  8.         list.add(new News(2,"list2","b"));

  9.         list.add(new News(3,"list3","c"));

  10.         list.add(new News(4,"list4","d"));

  11.    

  12.         Iterator<News> iter = list.iterator();

  13.         while (iter.hasNext()) {

  14.             News s = (News) iter.next();

  15.             System.out.println(s.getId()+"  "+s.getTitle()+"  "+s.getAuthor());

  16.         }

  17.     }

  18. }

  19. -------------------------------------------

  20. /**

  21. * iterator

  22. * 迭代器

  23. * @param list

  24. */

  25. public static void iteratorTest(List<Integer> list) {

  26. long before = System.currentTimeMillis();

  27. for (Iterator<Integer> iterator = list.iterator(); iterator.hasNext(); ) {

  28. iterator.next();

  29. }

  30. long after = System.currentTimeMillis();

  31. System.out.println("iterator for time=\t" + (after - before));

  32. before = System.currentTimeMillis();

  33. /**

  34. * while 循环写法

  35. */

  36. Iterator<Integer> iterator = list.iterator();

  37. while (iterator.hasNext()) {

  38. iterator.next();

  39. }

  40. after = System.currentTimeMillis();

  41. System.out.println("iterator while time=\t" + (after - before));

  42. }

2 for循环

指定下标长度,使用List集合的size()方法,进行for循环遍历,这种遍历方式最基础;

 
  1. import java.util.ArrayList;

  2.  

  3. public class Demo01 {

  4.    /* for循环遍历List集合 */

  5.   public static void main(String[] args) {

  6.    ArrayList<News> list = new ArrayList<News>();

  7.    list.add(new News(1,"list1","a"));

  8.    list.add(new News(2,"list2","b"));

  9.    list.add(new News(3,"list3","c"));

  10.    list.add(new News(4,"list4","d"));

  11.    for (int i = 0; i < list.size(); i++) {

  12.             News s = (News)list.get(i);

  13.             System.out.println(s.getId()+"  "+s.getTitle()+"  "+s.getAuthor());

  14.    }  

  15.    }

  16. }

3 增强for

使用foreach遍历List,但不能对某一个元素进行操作(这种方法在遍历数组和Map集合的时候同样适用),这种遍历方式较为简洁;

 
  1. import java.util.ArrayList;

  2.  

  3. public class Demo02 {

  4.     /* foreach循环遍历List集合 */

  5.     public static void main(String[] args) {

  6.         ArrayList<News> list = new ArrayList<News>();

  7.         list.add(new News(1,"list1","a"));

  8.         list.add(new News(2,"list2","b"));

  9.         list.add(new News(3,"list3","c"));

  10.         list.add(new News(4,"list4","d"));

  11.         for (News s : list) {

  12.             System.out.println(s.getId()+"  "+s.getTitle()+"  "+s.getAuthor());

  13.         }

  14.     }

  15. }

4 for-each(java8才支持)

 
  1. /**

  2. * foreach

  3. * foreach 最慢不推荐 java8 lambda

  4. * @param list

  5. */

  6. public static void forEachTest(List<Integer> list) {

  7. long before = System.currentTimeMillis();

  8. list.forEach(item -> {

  9. System.out.println(item);

  10. });

  11. long after = System.currentTimeMillis();

  12. System.out.println("list.forEach time=\t" + (after - before));

  13. }

5 stream().forEach() 注意java8 才支持

 
  1. /**

  2. * stream foreach

  3. * stream foreach java8 特有

  4. * @param list

  5. */

  6. public static void streamForEachTest(List<Integer> list) {

  7. long before = System.currentTimeMillis();

  8. list.stream().forEach(item -> {

  9. System.out.println(item);

  10. });

  11. long after = System.currentTimeMillis();

  12. System.out.println("list.stream().forEach time=\t" + (after - before));

  13. }

6 parallelStream().forEach() 注意java8 才支持

 
  1. /**

  2. * stream foreach

  3. * stream foreach java8 特有

  4. * @param list

  5. */

  6. public static void parallelStreamForEachTest(List<Integer> list) {

  7. long before = System.currentTimeMillis();

  8. list.parallelStream().forEach(item -> {

  9. System.out.println(item);

  10. });

  11. long after = System.currentTimeMillis();

  12. System.out.println("list.parallelStream().forEach time=\t" + (after - before));

  13. }

Java 中 Set 的4中遍历方式

Set 和 List 遍历方式基本一致,Set 没有fori 的遍历方式

主测试方法

 
  1.     @Test

  2.     public void test(){

  3.         Set<Integer> set = new HashSet<>();

  4.         int n = 1000_0000;

  5.         for (int i = 0; i < n; i++) {

  6.             set.add(i);

  7.         }

  8.         System.out.println("======== 1 iterator ==========");

  9.         iteratorTest(set);

  10.         System.out.println("======== 2 增强for ==========");

  11.         forBoostTest(set);

  12.         System.out.println("======== 3 forEach 最耗时 java8 ==========");

  13.         forEachTest(set);

  14.         System.out.println("======== 4 stream forEach 比较耗时和增强for差不多 java8 ==========");

  15.         streamForEachTest(set);

  16.     }

  17. 测试结果

  18. ======== 1 iterator ==========

  19. set.iterator() for time=    68

  20. set.iterator() while time=    66

  21. ======== 2 增强for ==========

  22. set.for Boost time=    75

  23. ======== 3 forEach 最耗时 java8 ==========

  24. set.forEach time=    118

  25. ======== 4 stream forEach 比较耗时和增强for差不多 java8 ==========

  26. set.stream().forEach() time=    71



1 迭代器方法   

 
  1. /**

  2.      * 1 iterator

  3.      * 迭代器

  4.      * @param set

  5.      */

  6.     public static void iteratorTest(Set<Integer> set) {

  7.         long before = System.currentTimeMillis();

  8.         /**

  9.          * for 循环写法

  10.          */

  11.         for (Iterator<Integer> iterator = set.iterator(); iterator.hasNext(); ) {

  12.             iterator.next();

  13.         }

  14.         long after = System.currentTimeMillis();

  15.         System.out.println("set.iterator() for time=\t"  + (after - before));

  16.         before = System.currentTimeMillis();

  17.         /**

  18.          * while 循环写法

  19.          */

  20.         Iterator<Integer> iterator = set.iterator();

  21.         while (iterator.hasNext()) {

  22.             iterator.next();

  23.         }

  24.         after = System.currentTimeMillis();

  25.         System.out.println("set.iterator() while time=\t"  + (after - before));

  26.     }



2 增强for

 
  1.   /**

  2.      * 

  3.      * 增强for

  4.      * @param set

  5.      */

  6.     public static void forBoostTest(Set<Integer> set) {

  7.         long before = System.currentTimeMillis();

  8.         for (int item : set) {

  9.             System.out.println(item);

  10.         }

  11.         long after = System.currentTimeMillis();

  12.         System.out.println("set.for Boost time=\t"  + (after - before));

  13.     }


3 set.forEach 注意:java8 才支持

 
  1.     /**

  2.      *  foreach

  3.      * foreach 最慢不推荐 java8 lambda

  4.      * @param set

  5.      */

  6.     public static void forEachTest(Set<Integer> set) {

  7.         long before = System.currentTimeMillis();

  8.         set.forEach(item -> {

  9.             System.out.println(item);

  10.         });

  11.         long after = System.currentTimeMillis();

  12.         System.out.println("set.forEach time=\t"  + (after - before));

  13.     }

4 set.stream().forEach 注意:java8 才支持

 
  1. /**

  2.      *  stream foreach

  3.      * stream foreach java8 特有

  4.      * @param set

  5.      */

  6.     public static void streamForEachTest(Set<Integer> set) {

  7.         long before = System.currentTimeMillis();

  8.         set.stream().forEach(item -> {

  9.             // System.out.println(item);

  10.         });

  11.         long after = System.currentTimeMillis();

  12.         System.out.println("set.stream().forEach() time=\t"  + (after - before));

  13.     }

Collection.isEmpty()检测空

消灭 Java 代码的“坏味道”

使用 Collection.size() 来检测空逻辑上没有问题,但是使用 Collection.isEmpty()使得代码更易读,并且可以获得更好的性能。任何 Collection.isEmpty() 实现的时间复杂度都是 O(1) ,但是某些 Collection.size() 实现的时间复杂度可能是 O(n) 。

反例:

 
  1. if (collection.size() == 0) {

  2. ...

  3. }

正例:

 
  1. if (collection.isEmpty()) {

  2. ...

  3. }

如果需要还需要检测 null ,可采用CollectionUtils.isEmpty(collection)和CollectionUtils.isNotEmpty(collection)。

集合初始化尽量指定大小

Java 的集合类用起来十分方便,但是看源码可知,集合也是有大小限制的。每次扩容的时间复杂度很有可能是 O(n) ,所以尽量指定可预知的集合大小,能减少集合的扩容次数。

反例:

 
  1. int[] arr = new int[]{1, 2, 3};

  2. List<Integer> list = new ArrayList<>();

  3. for (int i : arr) {

  4. list.add(i);

  5. }

正例:

 
  1. int[] arr = new int[]{1, 2, 3};

  2. List<Integer> list = new ArrayList<>(arr.length);

  3. for (int i : arr) {

  4. list.add(i);

  5. }

字符串拼接使用 StringBuilder 

一般的字符串拼接在编译期 java 会进行优化,但是在循环中字符串拼接, java 编译期无法做到优化,所以需要使用 StringBuilder 进行替换。

反例:

 
  1. String s = "";

  2. for (int i = 0; i < 10; i++) {

  3. s += i;

  4. }

正例:

 
  1. String a = "a";

  2. String b = "b";

  3. String c = "c";

  4. String s = a + b + c; // 没问题,java编译器会进行优化

  5. StringBuilder sb = new StringBuilder();

  6. for (int i = 0; i < 10; i++) {

  7. sb.append(i); // 循环中,java编译器无法进行优化,所以要手动使用StringBuilder

  8. }

使用String.valueOf(value)代替""+value

当要把其它对象或类型转化为字符串时,使用 String.valueOf(value) 比""+value 的效率更高。

反例:

 
  1. int i = 1;

  2. String s = "" + i;

正例:

 
  1. int i = 1;

  2. String s = String.valueOf(i);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值