三、Iterator接口
对 Collection 进行迭代的迭代器,即对所有的Collection容器进行元素取出的公共接口。
该迭代器对象依赖于具体容器,因为每一个容器的数据结构都不同,所以该迭代器对象是在具体容器中进行内部实现的。(内部类,可以看具体容器的源码)
对于使用容器者而言,具体的实现方法不重要,只要通过具体容器获取到该实现的迭代器的对象即可,也就是iterator()方法,而不用new。(Iterator<String> ite=list.iterator();)
image小知识点:使用迭代器过程中while和for的区别
1 第一种
2 Iterator<String> ite=list.iterator();
3 while(ite.hasNext())//判断下一个元素之后有值
4 {
5 System.out.println(ite.next());
6 }
7 第二种
8 Iterator<String> ite=list.iterator();
9 for(Iterator it = coll.iterator(); it.hasNext(); ){
10 System.out.println(it.next());
11 }
第一种方法while循环结束后迭代器对象还在内存中存在,还能继续使用迭代器对象。
第二种方法for循环结束后迭代器对象就消失了,清理了内存,开发中第二种常用。
Iterator的一个子接口
|--ListIterator接口(列表迭代器)
应用场景:
顾名思义,只能用于List的迭代器。
在使用迭代器迭代的过程中需要使用集合中的方法操作元素,出现ConcurrentModificationException异常时,具体看下面的例子。
出现异常情况代码:
Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();//java.util.ConcurrentModificationException
//在使用迭代器的过程中使用集合中的方法add()操作元素,出现异常。
//可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。
if(obj.equals("abc2")){
list.add("abc9");
}
else
System.out.println("next:"+obj);
}
System.out.println(list);
解决办法代码:
public static void main(String[] args) {
List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
System.out.println("list:"+list);
ListIterator it = list.listIterator();//获取列表迭代器对象
//它可以实现在迭代过程中完成对元素的增删改查。
//注意:只有list集合具备该迭代功能.
while(it.hasNext()){
Object obj = it.next();
if(obj.equals("abc2")){
it.add("abc9"); //ListIterator提供了add方法
}
}
四、Map接口
Map接口与Set类似,可以对照着来学,比如比较器在TreeMap中也适用。
Map:
一次添加一对元素,Collection 一次添加一个元素。
Map也称为双列集合,Collection集合也称为单列集合。
其实map集合中存储的就是键值对,map集合中必须保证键的唯一性。
常用方法:
1,添加
value put(key,value):返回前一个和key关联的值,如果没有返回null.
2,删除
void clear():清空map集合。
value remove(key):根据指定的key翻出这个键值对。
3,判断
boolean containsKey(key):是否包含该key
boolean containsValue(value):是否包含该value
boolean isEmpty();是否为空
4,获取
value get(key):通过键获取值,如果没有该键返回null。当然,可以通过是否返回null,来判断是否包含指定键。
int size(): 获取键值对的个数。
**Map常用的子类:
|--Hashtable :内部结构是哈希表,是同步的。不允许null作为键,null作为值。
|--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。
|--HashMap : 内部结构是哈希表,不是同步的。允许null作为键,null作为值。
|--TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。
Map的迭代方法:
Map本身没有迭代器。
方法一:利用Map接口的values()方法,返回此映射中包含的值的
<a title="java.util 中的接口" style="margin: 0px; padding: 0px;">Collection
</a>
(值不唯一),
然后通过Collecion的迭代器进行迭代。(只需要Value,不需要Key的时候)
public class MapDemo {
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<Integer,String>();
method_2(map);
}
public static void method_2(Map<Integer,String> map){
map.put(8,"zhaoliu");
map.put(2,"zhaoliu");
map.put(7,"xiaoqiang");
map.put(6,"wangcai");
Collection<String> values = map.values();
Iterator<String> it2 = values.iterator();
while(it2.hasNext()){
System.out.println(it2.next());
}
}
}
方法二:通过keySet方法获取map中所有的键所在的
Set集合
(Key和Set的都具有唯一性),
再通过Set的迭代器获取到每一个键,再对每一个键通过Map集合的get方法获取其对应的值即可。
Set<Integer> keySet = map.keySet();
Iterator<Integer> it = keySet.iterator();
while(it.hasNext()){
Integer key = it.next();
String value = map.get(key);
System.out.println(key+":"+value);
}
方法三:利用Map的
内部接口Map.EntrySet<K,V>使用iterator。
通过Map的entrySet()方法,将键和值的映射关系作为对象存储到Set集合中
这个映射关系的类型就是Map.Entry类型(结婚证)。
再通过Map.Entry对象的getKey和getValue获取其中的键和值。
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
while(it.hasNext()){
Map.Entry<Integer, String> me = it.next();
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key+":"+value);
}
方法四:通过Map.entrySet<K,V>遍历key和value
(推荐,尤其是容量大时)
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
网友评论