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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM