一:List接口:
子类:ArrayList LinkedList
特点:Unlike sets, lists typically allow duplicate elements.不像set集合,List集合允许元素重复。
The List interface provides four methods for positional (indexed) access to list elements. Lists (like Java arrays) are zero based. List集合提供一些关于索引的访问元素的方法,和数组一样起始索引:0;
也就是说List集合是存取是有序的。比如存:11,12,13.取元素也是11,12,13.
List集合比对2个对象使用equals()比较。
也就是说之前Collection的方法,我们可以用精确的索引来操作。
1 package test09; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class List_Demo { 7 public static void main(String...args){ 8 list_test(); 9 } 10 public static void list_test(){ 11 List<Integer> li_te=new ArrayList<>(); 12 li_te.add(11); 13 li_te.add(12); 14 li_te.add(13); 15 li_te.add(14); 16 li_te.add(15); 17 li_te.add(0,99);//指定位置添加元素。 18 System.out.print(li_te); 19 li_te.remove(0);//指定位置删除元素。 20 System.out.print(li_te); 21 Integer get_el=li_te.get(1); 22 System.out.print(get_el);//指定位置获取元素,如果超出索引报错误:IndexOutOfBoundsException 23 li_te.set(0,88);//replace替换指定位置的元素。 24 System.out.print(li_te); 25 for(Integer i=0;i<li_te.size();i++){ 26 System.out.print(li_te.get(i));//使用索引进行迭代。 27 } 28 } 29 }
二:迭代器Iterator并发异常处理:
看如下代码:
1 package test09; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 7 public class List_It { 8 public static void main(String...args){ 9 op_It(); 10 } 11 public static void op_It(){ 12 List<String> str_list=new ArrayList<>(); 13 str_list.add("i"); 14 str_list.add("b"); 15 str_list.add("n"); 16 str_list.add("m"); 17 Iterator<String> str_it=str_list.iterator(); 18 while (str_it.hasNext()){ 19 String test_str=str_it.next(); 20 if (test_str.equals("m")){ 21 str_list.add("k"); 22 } 23 } 24 } 25 }
报如下的错误:
Exception in thread "main" java.util.ConcurrentModificationException
这是为什么呢?
这是因为在我们使用迭代器Iterator的时候,同时对集合元素进行操作,但是迭代器并不知道集合发生变化,所以抛出如上的错误。
解决方法:解决并发引起的错误,在迭代的集合元素的时候,不要进行相关的元素操作。
或者使用listiterator方法。
ListIterator<E>
listIterator()
将如上的代码进行修改:
1 package test09; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 import java.util.ListIterator; 7 8 public class List_It { 9 public static void main(String...args){ 10 op_It(); 11 } 12 public static void op_It(){ 13 List<String> str_list=new ArrayList<>(); 14 str_list.add("i"); 15 str_list.add("b"); 16 str_list.add("n"); 17 str_list.add("m"); 18 ListIterator<String> str_it=str_list.listIterator(); 19 while (str_it.hasNext()){ 20 if(str_it.next().equals("m")){ 21 str_it.add("222"); 22 } 23 } 24 System.out.print(str_list); 25 } 26 }
在迭代的过程中,如果不想不引起并发异常,可以使用ListIterator迭代器,在迭代的过程对数组的修改。只有List有这特性,因为List有索引。