美文网首页
Java集合框架体系详细梳理,含面试知识点。(二)

Java集合框架体系详细梳理,含面试知识点。(二)

作者: java部落 | 来源:发表于2017-11-03 16:23 被阅读0次

三、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());
      }

欢迎加入学习交流群569772982,大家一起学习交流。

相关文章

网友评论

      本文标题:Java集合框架体系详细梳理,含面试知识点。(二)

      本文链接:https://www.haomeiwen.com/subject/mditmxtx.html