列表迭代器:java
ListIterator listerator():List集合特有的迭代器面試
該迭代器繼承了Iterator迭代器,因此,就能夠直接使用hasNext()和next()方法併發
特有功能:spa
Object previous();獲取上一個元素code
boolean hasPrevious():判斷是否有元素對象
注意:ListIterator能夠實現逆向遍歷,可是必須先正向遍歷,才能逆向遍歷,因此通常無心義,不使用blog
1 package com.wyh.Iterator; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 import java.util.ListIterator; 7 8 /** 9 * @author WYH 10 * @version 2019年11月9日 下午7:31:41 11 * 12 * ListIterator : List集合特有的迭代器 13 * 14 */ 15 public class ListIteratorDemo1 { 16 public static void main(String[] args) { 17 //建立集合 18 List i = new ArrayList(); 19 20 //建立字符串對象並將其添加到集合中 21 i.add("王友虎"); 22 i.add("李宏燦"); 23 i.add("趙以浩"); 24 i.add("齊博源"); 25 i.add("李先鋒"); 26 27 //ListIterator 繼承了 Iterator,因此能夠用它的實現 28 Iterator it = i.iterator(); 29 while(it.hasNext()) { 30 String s = (String)it.next(); 31 System.out.println(s); 32 } 33 System.out.println("----------------------"); 34 35 36 // previous()逆向打印 37 ListIterator list = i.listIterator(); 38 /*//若是逆向打印處於第一個位置,輸出爲空 39 * System.out.println("------------逆向打印------------------"); 40 while(list.hasPrevious()) { 41 String s3 = (String)list.previous(); 42 System.out.println(s3); 43 }*/ 44 while(list.hasNext()) { 45 String s2 = (String)list.next(); 46 System.out.println(s2); 47 } 48 System.out.println("------------逆向打印------------------"); 49 while(list.hasPrevious()) { 50 String s3 = (String)list.previous(); 51 System.out.println(s3); 52 } 53 54 55 56 } 57 58 }
一個十分重要出現問題的點,也是面試常常會問到的點。併發修改錯誤。繼承
問題: 我有一個集合,以下,請問,我想判斷裏面有沒有"李宏燦"這個元素,若是有,我就添加一個元素到集合中,請寫代碼實現。字符串
因而大部分人不知道這個併發修改錯誤的時候,會按照本身的邏輯按照如下代碼實現:get
1 /*//建立迭代器(Iterator迭代器)(錯誤示範-----------------) 2 Iterator it = list.iterator(); 3 //找到元素並進行添加張國興 4 while(it.hasNext()) { 5 String s = (String)it.next(); 6 if("李宏燦".equals(s)) { 7 list.add("123"); 8 } 9 } 10 System.out.println("list:"+list);*/
結果,咱們發現報錯,但是咱們的邏輯是沒有錯的,那到底錯在哪呢?(報錯:併發修改異常:ConcurrentModificationException)
產生的緣由:
迭代器是依賴於集合而存在的,在判斷成功後,集合中添加了新的元素,而迭代器殊不知道你已經添加了新元素,因此就報錯了,這個錯叫併發修改異常。
如何解決呢:
A: 迭代器迭代元素,迭代器修改元素,咱們使用List集合特有的迭代器:ListIterator listerator()
結果:元素是跟在剛纔迭代查找到的元素的後面
B:集合遍歷元素,集合修改元素(普通的for循環實現)
結果:在末尾進行添加
代碼實現:
1 package com.wyh.Iterator; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.ListIterator; 6 7 /** 8 * @author WYH 9 * @version 2019年11月9日 下午7:51:26 10 * 11 * 併發修改異常:ConcurrentModificationException 12 * 13 */ 14 public class ListIteratorDemo2 { 15 public static void main(String[] args) { 16 //建立集合對象 17 List list = new ArrayList(); 18 19 //建立字符串對象並將其添加到集合中去 20 list.add("王友虎"); 21 list.add("李宏燦"); 22 list.add("趙以浩"); 23 list.add("齊博源"); 24 list.add("李先鋒"); 25 26 /*//建立迭代器(Iterator迭代器)(錯誤示範-----------------) 27 Iterator it = list.iterator(); 28 //找到元素並進行添加張國興 29 while(it.hasNext()) { 30 String s = (String)it.next(); 31 if("李宏燦".equals(s)) { 32 list.add("123"); 33 } 34 } 35 System.out.println("list:"+list);*/ 36 37 //方法1:建立ListIterator迭代器,迭代器調用add方法進行添加 38 ListIterator listt = list.listIterator(); 39 while(listt.hasNext()) { 40 String s = (String)listt.next(); 41 if("李宏燦".equals(s)) { 42 listt.add("張國興"); //在找到的元素後面進行添加 43 } 44 } 45 System.out.println("list:"+list); 46 47 //方法2:利用for循環直接對集合進行遍歷,集合中有添加的方法 48 for(int i = 0;i<list.size();i++) { 49 String s = (String)list.get(i); 50 if(s.equals("李宏燦")) { 51 list.add("張果喜"); //在末尾進行添加 52 } 53 } 54 System.out.println("list:"+list); 55 56 57 58 } 59 60 }