Java集合类遍历相关问题
在Java的世界里添加许多的集合类,在之前的一片博文里面也写到了相关集合类的类别,在这里就不再赘述了。本片博文将讲述这些集合类的遍历问题。
Java的集合类遍历方式有两种:只读性访问,可修改性访问(直奔主题)
1、只读性访问:
对于所有的线性表来说(比如ArrayList,LinkList,Set,Stack)都实现了或者间接实现了Iterable接口,即可以通过Iterator对集合类进行遍历。也可以通过for循环进行直接遍历。
通过for循环进行遍历:
-
ArrayList<String> list = new ArrayList<String>();
-
list.add("1233");
-
list.add("4566");
-
for (String string : list) {
-
System.out.println(string);
-
}
当然,通过for循环完全可以这样来遍历线性表,这是因为他们都实现了同一个接口Iterable。当让我们也可以通过下面的方式。
-
ArrayList<String> list = new ArrayList<String>();
-
list.add("1233");
-
list.add("4566");
-
Iterator<String> it = list.iterator();
-
while(it.hasNext()){
-
System.out.println(it.next());
-
}
这种就是通过线性表的迭代器来访问线性表内的元素。
第二类就是对非线性表进行访问了(比如HashMap),对于非线性表的访问方式有一下三种方式:
1)通过遍历key值访问
-
HashMap<String,String> map = new HashMap<String,String>();
-
map.put("123", "123");
-
map.put("234","234");
-
for(String key : map.keySet()){
-
System.out.println(map.get(key));
-
}
通过map.keySet()方法将所有的键值(key 值)以集合的方式返回。这也说明了为什么Map里面为什么不能够同时有两个相同的
key了。
2)通过entity实体进行访问,这样在不知道key的情况下将每一对键-值对作为一个实体进行访问。
-
HashMap<String,String> map = new HashMap<String,String>();
-
map.put("123", "123");
-
map.put("234","234");
-
Set<Map.Entry<String, String>> entitySet = map.entrySet();
-
for (Entry<String, String> entity : entitySet) {
-
System.out.println(entity.getKey()+" "+entity.getValue());
-
}
通过entity实体的getKey和getValue方法实现对map的遍历。其实这种遍历方式有些类似于线性表的遍历。
3)通过迭代器实现对Map 值的遍历(
切记这里说的是值的遍历)
-
HashMap<String,String> map = new HashMap<String,String>();
-
map.put("123", "123test");
-
map.put("234","234test");
-
Iterator<String> values = map.values().iterator();
-
while(values.hasNext()){
-
System.out.println(values.next());
-
}
这种方式将map中所有的值作为一个Collection进行返回,之后通过集合的Iterator方式进行访问。
2、可修改性访问:
这里面主要讲一下可修改性访问方式。与只读性访问有很大的不同在于访问方式的多样性。对于只读性访问无论是线性表还是非线性表来说都有很多访问方式,但是对于可读性访问方式非线性表只有一种访问方式那就是通过迭代器进行访问。之前遇到过这样的问题,当通过for循环方式对HashMap进行访问时,并通过条件对相关元素进行删除后,对下一个元素进行访问时就会报出java.util.ConcurrentModificationException错误。下面看一下错误代码:
-
HashMap<String,String> map = new HashMap<String,String>();
-
map.put("123", "123");
-
map.put("234", "234");
-
for(String value : map.values()){
-
map.remove("123");
-
}
红色标识的一行为报错行。报错原因是当map执行remove操作时仅对modCount 进行了自增处理,而当我再次取值时发现里面有个判断 if (modCount != expectedModCount)throw new ConcurrentModificationException();。先解释一下modCount 表示已修改次数,
expectedModCount表示期望修改次数。所以当通过map执行remove时只是让modCount进行了自增,而没有对expectedModcount进行同步。然而通过迭代器进行remove时在最后方法的末尾执行了 一下 expectedModCount = modCount;,所以通过Iterator进行删除不会产生问题。
阅读(2373) | 评论(0) | 转发(0) |