Java入门基础java

Java集合之遍历

2015-10-04  本文已影响232人  Jadyn

在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方法是耗时的操作,所以并不推荐使用此方式。
方式一在性能上比方式三要好一些,并且方式一的代码更加干净易读。
在性能方面,方式四与方式一可以说是相同的。

上一篇 下一篇

猜你喜欢

热点阅读