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