创建测试类:
import java.util.*;
public class MyCount {
public static void main(String[] args) {
Map<Character, Integer> testMap = letsCount("111jjuu99");
//遍历方式1: 拿到 键值对
Set<Map.Entry<Character, Integer>> entries = testMap.entrySet();
Iterator<Map.Entry<Character, Integer>> iterator = entries.iterator();
while (iterator.hasNext()){
Map.Entry<Character, Integer> entry = iterator.next();
System.out.println("字符:"+entry.getKey()+"的个数为:"+entry.getValue());
}
//遍历方式2: 仅拿到 所有Key
Set<Character> keys = testMap.keySet();
for (Character key : keys) {
System.out.println("字符:"+key+"的个数为:"+testMap.get(key));
}
//遍历方式3: 仅拿到 所有Value =个数
Collection<Integer> values = testMap.values();
for (Integer value : values) {
System.out.println("个数是:"+value);
}
}
/**
* 统计该字符串中的每1个字符 个数
* @param str
* @return hashmap <字符,该字符个数>
*/
public static Map<Character,Integer> letsCount(String str){
Map<Character, Integer> hm = new HashMap<>();
char[] chars = str.toCharArray();
for (char aChar : chars) {
if(hm.containsKey(aChar)){
hm.put(aChar,hm.get(aChar)+1);
}else{
hm.put(aChar,1);
}
}
return hm;
}
}
关于 迭代器Iterator 和 增强for循环 的选择:
简化版:
推荐用迭代器Iterator。
a,可在迭代 同时用 Iterator的删除、增加方法——ListIterator
b.当list改为set数据结构,不用改遍历代码一直是Iterator
详细版:
可以看出,使用for each循环语句的优势在于更加简洁,更不容易出错,
不必关心 下标的起始值和终止值。
forEach不是关键字,关键字还是for,语句是由iterator实现的,
他们最大的不同之处就在于remove()方法上。
一般调用删除和添加方法都是具体集合的方法,例如:
List list = new ArrayList(); list.add(…); list.remove(…);
但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,
因为循环过程中list.size()的大小变化了,就导致了错误。
所以,如果想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,
因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,
例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。
forEach就是为了让用iterator循环访问的形式简单,写起来更方便。
当然功能不太全,
所以但如有删除操作,还是要用它原来的形式。
对比:
效率上
采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快
采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快
从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.
而使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.