Java实现List,Map,Set 遍历的多种方式

  • Post author:
  • Post category:java




一、简介

我们在日常的学习和工作中,经常会遇到要遍历一些对象,这些对象可能是


List





Map





Set


等,今天就稍微列举几个它们常用的遍历方式,让大家也可以选取合适的遍历方式。先声明下,我这里的JDK环境是


JDK8


(担心有些小伙伴还是1.6,有些方法运行不了)。

普通for循环、增强for循环(foreach)、迭代器(iterator)、forEach



二、List的遍历方式



2.1、List常见初始化

一般是

List<String> list = Arrays.asList("apple", "banana", "pear", "orange", "strawberry");

或者

List<String> list = new ArrayList<>();
list.add("apple");// 苹果
list.add("banana");// 香蕉
list.add("pear");// 梨
list.add("orange");// 橘子
list.add("strawberry");// 草莓

或者

List<String> stringList = new ArrayList<String>(){{
   add("apple");// 苹果
   add("banana");// 香蕉
   add("pear");// 梨
   add("orange");// 橘子
   add("strawberry");// 草莓
}};



2.2、普通for循环

public static void methodOne(List<String> list) {
    // 最常见的for循环,拿到数组的长度就可以遍历,还能得到元素的索引
    for (int i = 0, len = list.size(); i < len; i++) {
        String value = list.get(i);
        log.info("for循环遍历方式得到元素【{}】,它的索引为【{}】", value, i);
    }
}



2.3、增强for循环(

推荐


public static void methodTwo(List<String> list) {
    // 增强for循环遍历,非常的方便,但是没法直接拿到元素的准确的索引,因为list的indexOf()方法如果遇到重复元素就不准确了
    for (String fruit : list) {
        log.info("增强for循环遍历方式得到元素【{}】", fruit);
    }
}



2.4、集合类通用遍历

public static void methodThree(List<String> list) {
    // 集合类通用遍历
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String value = iterator.next();
        log.info("集合类通用遍历方式得到元素【{}】", value);
    }
}



2.5、lambda表达式forEach方法

public static void methodFour(List<String> list) {
    // 通过lambda表达式forEach方法遍历
    list.forEach(value -> log.info("数组的foreach方法遍历得到元素【{}】", value));
}



2.6、Java8中stream流

public static void methodFive(List<String> list) {
    // Java8中stream流处理完后使用forEach方法
    list.stream().map(String::toUpperCase).forEach(value -> log.info("Java8中stream流处理完后遍历得到元素【{}】", value));
}

如果我们的结果还需要进行处理的话(比如过滤,集合,分组,统计等),我建议还是使用Java8的stream流,非常的简洁和方便。



2.7、统一测试

我这里就不分开写了,五个方法一起测试了,具体结果大家也可以看看。

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("apple");// 苹果
    list.add("banana");// 香蕉
    list.add("pear");// 梨
    list.add("orange");// 橘子
    list.add("strawberry");// 草莓
    // 调用(这只是演示,方法没有考虑null问题,实际根据需要处理)
    log.info("-------------------------List遍历->调用methodOne方法-------------------------------");
    methodOne(list);
    log.info("-------------------------List遍历->调用methodTwo方法(【推荐】)-------------------------------");
    methodTwo(list);
    log.info("-------------------------List遍历->调用methodThree方法-------------------------------");
    methodThree(list);
    log.info("-------------------------List遍历->调用methodFour方法-------------------------------");
    methodFour(list);
    log.info("-------------------------List遍历->调用methodFive方法-------------------------------");
    methodFive(list);
}

运行结果:

-------------------------List遍历->调用methodOne方法-------------------------------
for循环遍历方式得到元素【apple】,它的索引为【0】
for循环遍历方式得到元素【banana】,它的索引为【1】
for循环遍历方式得到元素【pear】,它的索引为【2】
for循环遍历方式得到元素【orange】,它的索引为【3】
for循环遍历方式得到元素【strawberry】,它的索引为【4】
-------------------------List遍历->调用methodTwo方法(【推荐】)-------------------------------
增强for循环遍历方式得到元素【apple】
增强for循环遍历方式得到元素【banana】
增强for循环遍历方式得到元素【pear】
增强for循环遍历方式得到元素【orange】
增强for循环遍历方式得到元素【strawberry】
-------------------------List遍历->调用methodThree方法-------------------------------
集合类通用遍历方式得到元素【apple】
集合类通用遍历方式得到元素【banana】
集合类通用遍历方式得到元素【pear】
集合类通用遍历方式得到元素【orange】
集合类通用遍历方式得到元素【strawberry】
-------------------------List遍历->调用methodFour方法-------------------------------
数组的foreach方法遍历得到元素【apple】
数组的foreach方法遍历得到元素【banana】
数组的foreach方法遍历得到元素【pear】
数组的foreach方法遍历得到元素【orange】
数组的foreach方法遍历得到元素【strawberry】
-------------------------List遍历->调用methodFive方法-------------------------------
Java8中stream流处理完后遍历得到元素【APPLE】
Java8中stream流处理完后遍历得到元素【BANANA】
Java8中stream流处理完后遍历得到元素【PEAR】
Java8中stream流处理完后遍历得到元素【ORANGE】
Java8中stream流处理完后遍历得到元素【STRAWBERRY】



三、Map的遍历方式



3.1、Map常见初始化

一般是

Map<String, String> map = new HashMap<>();
map.put("apple", "苹果");
map.put("banana", "香蕉");
map.put("pear", "梨子");
map.put("orange", "橘子");
map.put("strawberry", "草莓");

或者

Map<String, String> map = new HashMap<String, String>(){{
     put("apple", "苹果");
     put("banana", "香蕉");
     put("pear", "梨子");
     put("orange", "橘子");
     put("strawberry", "草莓");
}};



3.2、entrySet + ForEach(

推荐


public static void methodOne(Map<String, String> map) {
    // 通过entrySet()得到Set集合,然后使用ForEach遍历
    Set<Map.Entry<String, String>> entries = map.entrySet();
    for (Map.Entry<String, String> entry : entries) {
        String key = entry.getKey();
        String value = entry.getValue();
        log.info("通过entrySet()得到Set集合,然后使用ForEach遍历map得到的结果:key-->{},value-->{}", key, value);
    }
}



3.3、entrySet +迭代器

public static void methodTwo(Map<String, String> map) {
    // 通过entrySet()得到Set集合,然后使用迭代器遍历
    Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry<String, String> entry = iterator.next();
        String key = entry.getKey();
        String value = entry.getValue();
        log.info("通过通用迭代器遍历map-->得到的结果:key-->{},value-->{}", key, value);
    }
}



3.4、keySet + 增强for循环

public static void methodThree(Map<String, String> map) {
    // 通过keySet()得到key集合,然后使用ForEach遍历key
    Set<String> keySets = map.keySet();
    for (String key : keySets) {
        String value = map.get(key);
        log.info("通过keySet()得到key集合(ForEach遍历),得到的结果:key-->{},value-->{}", key, value);
    }
}



3.5、keySet + 迭代器

public static void methodFour(Map<String, String> map) {
    // 通过keySet()得到key集合,然后使用迭代器遍历
    Iterator<String> iterator = map.keySet().iterator();
    while (iterator.hasNext()) {
        String key = iterator.next();
        String value = map.get(key);
        log.info("通过keySet()得到迭代集合(迭代器遍历),得到的结果:key-->{},value-->{}", key, value);
    }
}



3.6、lambda表达式forEach方法

public static void methodFive(Map<String, String> map) {
    // 通过lambda表达式forEach方法
    map.forEach((key, value) -> log.info("通过map的forEach()遍历map得到的结果:key-->{},value-->{}", key, value));
}



3.7、Java8流的forEach遍历(

推荐


public static void methodSix(Map<String, String> map) {
    // 通过Java8流的forEach遍历
    map.entrySet().stream().forEach((entry) -> {
        String key = entry.getKey();
        String value = entry.getValue();
        log.info("通过Java8流遍历map得到的结果:key-->{},value-->{}", key, value);
    });
}



3.8 、统一测试

public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("apple", "苹果");
    map.put("banana", "香蕉");
    map.put("pear", "梨子");
    map.put("orange", "橘子");
    map.put("strawberry", "草莓");
    // 调用(这只是演示,方法没有考虑null问题,实际根据需要处理)
    log.info("-------------------------Map遍历-->调用methodOne方法(【推荐】)-------------------------------");
    methodOne(map);
    log.info("-------------------------Map遍历-->调用methodTwo方法-------------------------------");
    methodTwo(map);
    log.info("-------------------------Map遍历-->调用methodThree方法-------------------------------");
    methodThree(map);
    log.info("-------------------------Map遍历-->调用methodFour方法-------------------------------");
    methodFour(map);
    log.info("-------------------------Map遍历-->调用methodFive方法-------------------------------");
    methodFive(map);
    log.info("-------------------------Map遍历-->调用methodSix方法(【推荐】)-------------------------------");
    methodSix(map);
}

运行结果:

-------------------------Map遍历-->调用methodOne方法(【推荐】)-------------------------------
通过entrySet()得到Set集合,然后使用ForEach遍历map得到的结果:key-->banana,value-->香蕉
通过entrySet()得到Set集合,然后使用ForEach遍历map得到的结果:key-->orange,value-->橘子
通过entrySet()得到Set集合,然后使用ForEach遍历map得到的结果:key-->apple,value-->苹果
通过entrySet()得到Set集合,然后使用ForEach遍历map得到的结果:key-->pear,value-->梨子
通过entrySet()得到Set集合,然后使用ForEach遍历map得到的结果:key-->strawberry,value-->草莓
-------------------------Map遍历-->调用methodTwo方法-------------------------------
通过通用迭代器遍历map-->得到的结果:key-->banana,value-->香蕉
通过通用迭代器遍历map-->得到的结果:key-->orange,value-->橘子
通过通用迭代器遍历map-->得到的结果:key-->apple,value-->苹果
通过通用迭代器遍历map-->得到的结果:key-->pear,value-->梨子
通过通用迭代器遍历map-->得到的结果:key-->strawberry,value-->草莓
-------------------------Map遍历-->调用methodThree方法-------------------------------
通过keySet()得到key集合(ForEach遍历),得到的结果:key-->banana,value-->香蕉
通过keySet()得到key集合(ForEach遍历),得到的结果:key-->orange,value-->橘子
通过keySet()得到key集合(ForEach遍历),得到的结果:key-->apple,value-->苹果
通过keySet()得到key集合(ForEach遍历),得到的结果:key-->pear,value-->梨子
通过keySet()得到key集合(ForEach遍历),得到的结果:key-->strawberry,value-->草莓
-------------------------Map遍历-->调用methodFour方法-------------------------------
通过keySet()得到迭代集合(迭代器遍历),得到的结果:key-->banana,value-->香蕉
通过keySet()得到迭代集合(迭代器遍历),得到的结果:key-->orange,value-->橘子
通过keySet()得到迭代集合(迭代器遍历),得到的结果:key-->apple,value-->苹果
通过keySet()得到迭代集合(迭代器遍历),得到的结果:key-->pear,value-->梨子
通过keySet()得到迭代集合(迭代器遍历),得到的结果:key-->strawberry,value-->草莓
-------------------------Map遍历-->调用methodFive方法-------------------------------
通过map的forEach()遍历map得到的结果:key-->banana,value-->香蕉
通过map的forEach()遍历map得到的结果:key-->orange,value-->橘子
通过map的forEach()遍历map得到的结果:key-->apple,value-->苹果
通过map的forEach()遍历map得到的结果:key-->pear,value-->梨子
通过map的forEach()遍历map得到的结果:key-->strawberry,value-->草莓
-------------------------Map遍历-->调用methodSix方法(【推荐】)-------------------------------
通过Java8流遍历map得到的结果:key-->banana,value-->香蕉
通过Java8流遍历map得到的结果:key-->orange,value-->橘子
通过Java8流遍历map得到的结果:key-->apple,value-->苹果
通过Java8流遍历map得到的结果:key-->pear,value-->梨子
通过Java8流遍历map得到的结果:key-->strawberry,value-->草莓



四、Set的遍历方式



4.1、Set常见初始化

一般是

Set<String> set = new HashSet<>();
set.add("apple");// 苹果
set.add("banana");// 香蕉
set.add("pear");// 梨
set.add("orange");// 橘子
set.add("strawberry");// 草莓

或者

Set<String> set = new HashSet<String>(){{
    add("apple");// 苹果
    add("banana");// 香蕉
    add("pear");// 梨
    add("orange");// 橘子
    add("strawberry");// 草莓
}};



4.2、通过增强for循环(

推荐


public static void methodOne(Set<String> set) {
    // 通过增强for循环遍历
    for (String value : set) {
        log.info("通过foreach遍历得到结果:{}", value);
    }
}



4.3、通用迭代器遍历

public static void methodTwo(Set<String> set) {
    // 通用迭代器遍历
    Iterator<String> iterator = set.iterator();
    while (iterator.hasNext()) {
        String value = iterator.next();
        log.info("通用迭代器遍历得到结果:{}", value);
    }
}



4.4、lambda表达式forEach方法

public static void methodThree(Set<String> set) {
    // 通过lambda表达式forEach方法遍历
    set.forEach(value -> log.info("通过lambda表达式forEach方法遍历得到结果:{}", value));
}



4.5、Java8流的foreach方法

public static void methodFour(Set<String> set) {
    // 通过Java8流的foreach方法遍历
    set.stream().forEach(value -> {
        log.info("通过Java8流的foreach方法遍历得到结果:{}", value);
    });
}



4.6、转数组再for循环

public static void methodFive(Set<String> set) {
    // 转数组再for循环遍历
    int size = set.size();
    String[] strArray = new String[size];
    // 一定要注意的是strArray的类型要和set的类型一致(集合的类型是什么,数组的类型就要是什么)
    String[] strings = set.toArray(strArray);
    for (String value : strings) {
        log.info("通过转数组再for循环遍历得到结果:{}", value);
    }
}



4.7、统一测试

public static void main(String[] args) {
    Set<String> set = new HashSet<>();
    set.add("apple");// 苹果
    set.add("banana");// 香蕉
    set.add("pear");// 梨
    set.add("orange");// 橘子
    set.add("strawberry");// 草莓
    // 调用(这只是演示,方法没有考虑null问题,实际根据需要处理)
    log.info("-------------------------Set遍历->调用methodOne方法【推荐】-------------------------------");
    methodOne(set);
    log.info("-------------------------Set遍历->调用methodTwo方法-------------------------------");
    methodTwo(set);
    log.info("-------------------------Set遍历->调用methodThree方法-------------------------------");
    methodThree(set);
    log.info("-------------------------Set遍历->调用methodFour方法-------------------------------");
    methodFour(set);
    log.info("-------------------------Set遍历->调用methodFive方法-------------------------------");
    methodFive(set);
}

运行结果:

-------------------------Set遍历->调用methodOne方法【推荐】-------------------------------
通过foreach遍历得到结果:banana
通过foreach遍历得到结果:orange
通过foreach遍历得到结果:apple
通过foreach遍历得到结果:pear
通过foreach遍历得到结果:strawberry
-------------------------Set遍历->调用methodTwo方法-------------------------------
通用迭代器遍历得到结果:banana
通用迭代器遍历得到结果:orange
通用迭代器遍历得到结果:apple
通用迭代器遍历得到结果:pear
通用迭代器遍历得到结果:strawberry
-------------------------Set遍历->调用methodThree方法-------------------------------
通过lambda表达式forEach方法遍历得到结果:banana
通过lambda表达式forEach方法遍历得到结果:orange
通过lambda表达式forEach方法遍历得到结果:apple
通过lambda表达式forEach方法遍历得到结果:pear
通过lambda表达式forEach方法遍历得到结果:strawberry
-------------------------Set遍历->调用methodFour方法-------------------------------
通过Java8流的foreach方法遍历得到结果:banana
通过Java8流的foreach方法遍历得到结果:orange
通过Java8流的foreach方法遍历得到结果:apple
通过Java8流的foreach方法遍历得到结果:pear
通过Java8流的foreach方法遍历得到结果:strawberry
-------------------------Set遍历->调用methodFive方法-------------------------------
通过转数组再for循环遍历得到结果:banana
通过转数组再for循环遍历得到结果:orange
通过转数组再for循环遍历得到结果:apple
通过转数组再for循环遍历得到结果:pear
通过转数组再for循环遍历得到结果:strawberry



版权声明:本文为Alian_1223原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。