1. 程式人生 > >JAVA-初步認識-常用對象API(集合框架-ListIterator接口)

JAVA-初步認識-常用對象API(集合框架-ListIterator接口)

不用 分享 就會 mod 開始 截圖 body bsp cep

一.

把list往外取的動作也說一下,(有可能說的是從list中取出元素的動作)。

技術分享圖片

技術分享圖片

從list中取出所有的元素,采用iterator,因為list屬於Colletion的子類,Colletion中具備的東西list也都有。(上面的截圖中list只是一個空的容器,然後不斷地往裏面添加元素,或者刪減元素)返回了iterator是怎麽理解

技術分享圖片

技術分享圖片

DOS結果沒有任何問題。

list有自己特有的元素取出方式,list.get(index),輸入集合中的某一個角標值,打印出來的結果就是該角標上的元素。

如果是取出所有的元素,就是如下圖所示。帶著角標,就和數組的操作是一樣的。(list中沒有寫length,為什麽不寫length而寫size

)

技術分享圖片

只有它具備這種取出方式,set不具備,set只有iterator。

現在接著取集合中的元素,換一種形式來操作,將叠代器拿來借用一下。不直接做輸出動作,而是設置一個對象來接收返回的元素。

存的時候,add方法參數列表中通過多態的知識點,往裏面存的任意對象都被提升被object類了。

技術分享圖片

技術分享圖片

技術分享圖片

DOS結果有兩個疑問,一是為什麽會有next:abc1出現,二是為什麽會有異常出現?

沒見過這個包,要學會去查閱API文檔,去util包中的異常中,搜索ConcurrentModificationException。

技術分享圖片

什麽是並發修改?這是我們開發中常出現的問題。

問題的原因是:list集合中往裏面存了三個元素,存一次集合的長度就擴展一次。存了三個,長度就為三。在長度為三的集合中,我們調用了它的叠代器,Iterator it=it.iterator();這時候叠代器的值是三,換句話說,這個時候調用叠代器,叠代器只知道集合中有三個元素。叠代器就按照三個元素的方式開始了取出。在後面的判斷中,集合添加了元素abc9,擴展了長度,但是叠代器不知道。叠代器叠不叠代這個元素是搞不清楚的,因為現在是叠代器在操作這些元素,而在叠代器操作的過程中,又在用集合操作這個元素(list.add("abc9"))。操作叠代器,叠代器是一個對象,集合也是一個對象,兩者不是同一個東西。集合和叠代器同時在對這個元素進行修改。就會導致叠代出問題。這就是產生異常的原因。

該如何解決此異常。如果一定要在操作時,進行判斷,往list集合中添加元素,那怎麽修改?既然叠代和集合同時訪問,造成了並發。那麽,使用集合操作的時候,不叠代。使用叠代操作時,不集合,別沖突就是。在叠代操作時不用集合,那麽只能用叠代操作(意思是用叠代來添加元素),反正只有兩種操作方式,要麽集合,要麽叠代,叠代來自於集合。所以,叠代的時候,集合不能參與,叠代完了再說。但是叠代中只有三個方法,一個判斷有沒有,一個是獲取,最後一個是刪除,並沒有添加的方法。

技術分享圖片

叠代器本身有局限性,叠代器下面有子接口,listIterator列表叠代器。

技術分享圖片

子接口中提供了添加的方法,修改,獲取,刪除,判斷。怎麽拿到子接口對象呢?list集合中還有一個方法沒有介紹,就是ListIterator(),根據這個方法可以拿到列表叠代器。這個叠代器,只有list有(整個集合框架體系中,都有叠代器的存在)。

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

listIterator接口中還有一些其他的方法。

技術分享圖片

技術分享圖片

hasPrevious方法是判斷前面是否有元素。

技術分享圖片

技術分享圖片

遍歷完了之後,hasNext的結果是false,而hasPrevious的結果則是true。因此,這裏叠代器可以往前走。

技術分享圖片

技術分享圖片

DOS結果中豎著的abc3,abc9,abc1就是hasNext的方法(不是3,2,1,是因為前面采用了set方法,改掉了0角標的元素)。

JAVA-初步認識-常用對象API(集合框架-ListIterator接口)