• Java笔记--Java的List、Iterator用法


    1. List的使用

    准备知识:

      List继承自Collection接口。List是一种有序集合,List中的元素可以根据索引(顺序号:元素在集合中处于的位置信息)进行取得/删除/插入操作。
      跟Set集合不同的是,List允许有重复元素。对于满足e1.equals(e2)条件的e1与e2对象元素,可以同时存在于List集合中。当然,也有List的实现类不允许重复元素的存在。
      List还提供一个listIterator()方法,返回一个ListIterator接口对象,和Iterator接口相比,ListIterator添加元素的添加,删除,和设定等方法,还能向前或向后遍历。
      List接口的实现类主要有ArrayList,LinkedList,Vector,Stack等
      LinkedList、ArrayList是非同步的(unsynchronized)。
      如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
      尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。

    注意:ArrayList的下标从0开始,如果一个List有4个元素,则list.size()为4;
    list中可以添加任何对象,举例:
    class Node {
    	。。。。。
    }
    
    上面定义了一个Node类,下面使用List   (我们使用ArrayList)
    Node n1 = new Node();
    Node n2 = new Node();
    List list=new ArrayList();
    list.add(n1);
    list.add(n2);  //这里是将对象加入到list中
    for(int i=0;i<list.size();i++){//利用循环,将Node对象全部一一取出
        Node n = (Node)list.get(i);
      //注意,这里一定要强制类型转换,因为List中取出的对象都是Object类型的
    }

     另一种遍历List的方法

    for(String str:list){
        System.out.print(str+" ");
    }

    修改元素的值

    ArrayList()中存放的只是对象的引用,如果你将A存到ArrayList(),然后修改A的值,ArrayList()中存放的值就会自动转变。
    如果有A的引用可以直接这么写 A.a=你需要的值
    如果不知道 可以通过ArrayList().get(indexof(A))取得A的引用,然后修改属性

    移除最后一个元素

    list.remove(list.size()-1);

    或者用下面的Iterator也可(推荐用Iterator)

     

    2. Iterator迭代器的使用

    迭代器模式有叫做游标(Cursor)模式。GOF给出的定义:提供一种方法访问一个容器(container)对象中的各个元素,而又不暴露该对象的内部细节。

      (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
      (2) 使用next()获得序列中的下一个元素。
      (3) 使用hasNext()检查序列中是否还有元素。
      (4) 使用remove()将迭代器新返回的元素删除。

     注:remove()删除最近一次调用iter.next()获取的容器内部的元素值,如果还未调用过iter.next()则在使用iter.remove()时候报错。 

    //迭代器的应用
    List<String> l1 = new ArrayList<String>();
    l1.add("lee");
    l1.add("xee");
    l1.add("bee");
    l1.add("dee");
    
    System.out.println(l1.size());  //输出当前List大小
    Iterator it = l1.iterator();   //获取迭代器
    it.next();   //获取下一个元素(这里为第一个元素)
    it.remove(); //删除上个语句获取的元素
    System.out.println(l1.size());  //在此输出List大小
    		
    for(Iterator iter = l1.iterator();iter.hasNext();){
    	String str = (String)iter.next();
    	System.out.println(str);
    }
    

    输出结果

    4
    3
    xee
    bee
    dee

     

    3. Iterator和Iterable区别

    转自:http://perfy315.iteye.com/blog/1459201

    java.lang.Iterable
    java.util.Iterator

    Iterator是迭代器类,而Iterable是接口。好多类都实现了Iterable接口,这样对象就可以调用iterator()方法。一般都是结合着用,比如
    HashSet类就实现了Iterable接口,而要访问或打印出Set中所有内容时,就可以这样: 

    HashSet<String> set = new HashSet<String>();
    Iterator itr = set.iterator();
    while(itr.hasNext()){
        System.out.println(itr.next());
    }

    为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢? 

    看一下JDK中的集合类,比如List一族或者Set一族,都是实现了Iterable接口,但并不直接实现Iterator接口。
    仔细想一下这么做是有道理的。

    因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。
    如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。
    当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。
    除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。
    但即时这样,Collection也只能同时存在一个当前迭代位置。
    而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。
    多个迭代器是互不干扰的。

    拿一个自定义类为例

    Node集成Iterable接口,那么必须实现iterator方法:

    class Node implements Iterable{
        @Override
        public Iterator iterator() {
            // TODO Auto-generated method stub
            return null;
        }
    }

     Node集成Iterator接口,那么必须实现hasNext、next、remove方法

    class Node implements Iterator{
    
        @Override
        public boolean hasNext() {
            // TODO Auto-generated method stub
            return false;
        }
    
        @Override
        public Object next() {
            // TODO Auto-generated method stub
            return null;
        }
    @Override
    public void remove() { // TODO Auto-generated method stub } }

    对于Iterable,实现了它的类有 ArrayList, LinkedList, HashSet, TreeSet, Vector, Stack..
    所有实现Iterable的类:

    All Known Implementing Classes: 
    AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList, BatchUpdateException, BeanContextServicesSupport, BeanContextSupport, ConcurrentLinkedDeque, ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DataTruncation, DelayQueue, EnumSet, HashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList, LinkedTransferQueue, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, RowSetWarning, SerialException, ServiceLoader, SQLClientInfoException, SQLDataException, SQLException, SQLFeatureNotSupportedException, SQLIntegrityConstraintViolationException, SQLInvalidAuthorizationSpecException, SQLNonTransientConnectionException, SQLNonTransientException, SQLRecoverableException, SQLSyntaxErrorException, SQLTimeoutException, SQLTransactionRollbackException, SQLTransientConnectionException, SQLTransientException, SQLWarning, Stack, SyncFactoryException, SynchronousQueue, SyncProviderException, TreeSet, Vector 


     如何遍历HashMap:http://www.cnblogs.com/meieiem/archive/2011/11/02/2233041.html

  • 相关阅读:
    THOR: Tracking Holistic Object Representations
    Multi-Agent Reinforcement Learning Based Frame Sampling for Effective Untrimmed Video Recognition
    Multi-shot Pedestrian Re-identification via Sequential Decision Making
    Deep Reinforcement Learning with Iterative Shift for Visual Tracking
    A3C 算法资料收集
    Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning with a Stochastic Actor
    Real-time ‘Actor-Critic’ Tracking
    基于java的分布式爬虫
    跟我一起数据挖掘(23)——C4.5
    众推架构的进一步讨论
  • 原文地址:https://www.cnblogs.com/gnivor/p/4194522.html
Copyright © 2020-2023  润新知