Java集合之遍历

作者: Jadyn | 来源:发表于2015-10-04 20:20 被阅读232次

    在Java开发中,集合,可以说使我们必然要使用到的一个框架。对集合的遍历也是我么经常要进行的操作,而遍历操作又有多种,下面就对集合遍历进行以下总结。

    一、List、Set的遍历

    List与Set都继承了Collection接口,从某种程度上来说可以将List和Set看作同一种类型,因此对于他们的遍历方式也是相同的。

    下面以List为例进行讲述
    List<String> lists = new ArrayList<>();
    lists.add("A");
    lists.add("B");
    lists.add("C");
    lists.add("D");
    lists.add("E");
    lists.add("F");
    

    方式一:

    普通for循环

    for (int i = 0; i < lists.size(); i++){
        System.out.println(lists.get(i));
    }
    

    当然这种方式对于Set集合是不适用的,因为Set集合中并没有get index方法。

    方式二:

    for-each循环

    for(String s : lists){
        System.out.println(s);
    }
    

    对于这种方式的遍历,是会存在一些问题的。首先,每次遍历集合类时,都需要写很多样板代码,对遍历进行改造也很麻烦,需要修改每一个for循环。并且这样做也模糊了代码的本意,需阅读完整个循环体才能理解这段代码的意图,无形当中增加了时间成本。

    方式三:

    使用Iterator外部迭代

    Iterator<String> iterator = lists.iterator();
    while(iterator.hasNext()){
        System.out.println(iterator.next());
    }
    

    方式四:

    使用Iterator迭代

    for (Iterator iterator = lists.iterator(); iterator.hasNext();)
    {
        String string = (String) iterator.next();           
    }
    

    实际上方式四和方式三是类似的,区别只不过是方式三使用while循环,方式四使用for循环。
    并且从内部来说方式二(for-each循环)与方式三、方式四(Iterator遍历)其实是相同的,属于外部迭代,只是形式不同。for-each其实是一个封装了迭代的语法糖。
    但从性能上来说,使用Iterator性能会更好些。
    总体上说,无论是for-each循环还是迭代器遍历都会将行为和方法混为一谈,很难抽象出各种不同的操作。

    方式五:

    Stream内部迭代

    List<String> lists = new ArrayList<String>();
    lists.add("A");
    lists.add("B");
    lists.add("Ct");
    lists.add("Dt");
    lists.add("Et");
    lists.add("Ft");
    long count = lists.stream().filter(new Predicate<String>(){
        @Override
        public boolean test(String t){
            return t.endsWith("t");
        }
    }).count();
    System.out.println(count);
    

    在这里我们过滤出以"t"结尾的字符串,并打印出这样字符串的个数。
    这是Java8新出来的一个类,Stream使用函数式编程的方式在集合类上进行复杂操作的工具。我们可以通过这种流机制、Stream类中的各种操作符以及Java中的函数接口去做任何我们想做的事情,并且代码的可读性也大大提高。

    二、Map的遍历

    Map<Integer, String> maps = new HashMap<Integer, String>();
    maps.put(1, "A");
    maps.put(2, "B");
    maps.put(3, "C");
    maps.put(4, "D");
    maps.put(5, "E");
    

    方式一:

    for-each单独遍历key和value

    //遍历keys
    for(Integer key : maps.keySet()){
        System.out.println(key);
    }
    //遍历values
    for(String value : maps.values()){
        System.out.println(value);
    }
    

    方式二:

    先遍历keys,然后通过key查找值

    for(Integer key : maps.keySet()){
        String value = maps.get(key);
        System.out.println(key+":"+value);
    }
    

    方式三:

    通过Entry进行遍历

    for (Map.Entry<Integer, String> entry : maps.entrySet()){
        Integer key = entry.getKey();//获取key
        String value = entry.getValue();//获取value
        System.out.println(key + ":" + value);
    }
    

    方式四:

    使用迭代器进行遍历

    Iterator<Map.Entry<Integer, String>> iterator = maps.entrySet().iterator();
    while (iterator.hasNext()){
        Map.Entry<Integer, String> entry = iterator.next();
        Integer key = entry.getKey();//获取key
        String value = entry.getValue();//获取value
    }
    
    四种遍历方式的比较

    在这四种方式中,方式二是效率最低的一种方式,因为从从键取值的get方法是耗时的操作,所以并不推荐使用此方式。
    方式一在性能上比方式三要好一些,并且方式一的代码更加干净易读。
    在性能方面,方式四与方式一可以说是相同的。

    相关文章

      网友评论

      本文标题:Java集合之遍历

      本文链接:https://www.haomeiwen.com/subject/ppygcttx.html