abstract:list集合的特点1)有序(存储和取出的元素一直)2)可重复list存储字符串并遍历import java.util.List; import java.util.ArrayList; import java.util.Iterator;public class ListTest1{ public&nb
list集合的特点
1)有序(存储和取出的元素一直)
2)可重复
list存储字符串并遍历
import java.util.List; import java.util.ArrayList; import java.util.Iterator;public class ListTest1{ public static void main(String[] args){ //创建集合对象 List list = new ArrayList(); //创建字符串并添加字符串 list.add("wu"); list.add("jia"); list.add("dong"); //遍历集合 Iterator it = list.iterator(); while(it.hasNext()){ String s = (String) it.next(); System.out.println(s); } } } ----------------------------- 输出结果 wu jia dong -------------------------------
练习:list存储自定义对象并遍历
import java.util.List;import java.util.ArrayList;import java.util.Iterator;public class ListDemo2{ public static void main(String[] args){ //创建集合对象 List list = new ArrayList(); Student s1 = new Student("wu",21); Student s2 = new Student("jia",22); Student s3 = new Student("dong",23); list.add(s1); list.add(s2); list.add(s3); Iterator it = list.iterator(); while(it.hasNext()){ Student s = (Student) it.next(); System.out.println(s); } } }class Student{ //成员变量 private String name; private int age; //无参构造方法 public Student(){ super(); } //有参构造方法 public Student(String name,int age){ this.name = name; this.age = age; } //setXxx()方法和getXxx()方法 public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setAge(int age){ this.age = age; } public int getAge(){ return age; } //toString()方法 public String toString(){ return "Student [name="+name+",age="+age+"]"; } } -------------------------------------- 输出结果 Student [name=wu,age=21] Student [name=jia,age=22] Student [name=dong,age=23] -------------------------------------
List集合特有的功能
1)添加功能
void add(int index, Object element):在指定位置添加元素
2) 获取功能
Object get(int index):获取指定位置的元素
3)列表迭代器
ListIterator listIterator():List集合特有的迭代器
4)删除功能
Object remove(int index):根据索引删除元素,返回被删除的元素
5)修改功能
Object set(int index, Object element):根据索引修改元素,返回被修改的元素
示例:
向指定位置添加元素
/* *void add(int index,Object element):在指定位置添加元素 */import java.util.ArrayList; import java.util.List;public class ListDemo3{ public static void main(String[] args){ //创建集合对象 List list = new ArrayList(); list.add("hadoop"); list.add("spark"); list.add("storm"); System.out.println("最先的list:"+list); //向指定位置添加元素 list.add(1,"data"); System.out.println("指定位置添加元素后的list:"+list); } } ------------------------------------- 输出结果 最先的list:[hadoop, spark, storm] 指定位置添加元素后的list:[hadoop, data, spark, storm] ---------------------------------------
get()方法获取指定元素和list的遍历
import java.util.List;import java.util.ArrayList;public class ListDemo4{ public static void main(String[] args){ //创建集合对象 List list = new ArrayList(); //添加元素 list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); //get()方法获取指定位置的元素 System.out.println(list.get(0)); System.out.println(list.get(1)); System.out.println("----------------------"); //for循环改进 //遍历的方式是size()和get() for(int i = 0;i<list.size();i++){ System.out.println(list.get(i)); } } } -------------------------------------- 输出结果 aaa bbb ---------------------- aaa bbb ccc ddd --------------------------------------
list存储自定义对象并遍历
import java.util.List;import java.util.ArrayList;public class ListDemo5{ public static void main(String[] args){ //创建集合对象 List list = new ArrayList(); Student s1 = new Student("www",21); Student s2 = new Student("jjj",22); Student s3 = new Student("ddd",24); list.add(s1); list.add(s2); list.add(s3); for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } } }class Student{ //成员变量 private String name; private int age; //无参构造方法 public Student(){ super(); } public Student(String name,int age){ this.name = name; this.age = age; } //get和set方法 public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setAge(int age){ this.age = age; } public int getAge(){ return age; } public String toString(){ return "Student [name="+name+",age="+age+"]"; } } ------------------------------------- 输出结果 Student [name=www,age=21] Student [name=jjj,age=22] Student [name=ddd,age=24] --------------------------------------------- 也可用迭代器去遍历
列表迭代器ListIterator
/* *列表迭代器: ListIterator listIterator():List集合特有的迭代器该迭代器继承了Iterator迭代器,所有可以直接使用hasNext()和next()方法*/import java.util.List;import java.util.ArrayList;import java.util.Iterator;import java.util.ListIterator;public class ListDemo6{ public static void main(String[] args){ //创建集合对象 List list = new ArrayList(); list.add("hive"); list.add("habase"); list.add("sqoop");/* Iterator it = list.iterator(); while(it.hasNext()){ String s = (String) it.next(); System.out.println(s); */ ListIterator it = list.listIterator(); while(it.hasNext()){ String s = (String) it.next(); System.out.println(s); } }}=-------------输出结果hivehabasesqoop----------------------
/* 特有功能 Object previous():获取上一个元素 boolean hasPrevious():判断是否有元素 注意:ListIterator可以实现逆向遍历,但须先正向遍历,所以无意义,不使用 */import java.util.List;import java.util.ArrayList;import java.util.ListIterator;public class ListDemo6{ public static void main(String[] args){ //创建集合对象 List list = new ArrayList(); list.add("hive"); list.add("habase"); list.add("sqoop"); ListIterator it = list.listIterator(); while(it.hasNext()){ String s = (String) it.next(); System.out.println(s); } System.out.println("-----------------------"); //逆向遍历 while(it.hasPrevious()){ String s = (String) it.previous(); System.out.println(s); } } } ---------------------------------- 输出结果 hive habase sqoop ----------------------- sqoop habase hive ---------------------------------
并发修改异常:ConcurrentModificationException
/* 一个集合,判断是否有"cccc"这个元素,如果有添加一个“wujiadong”元素 该异常产生原因:迭代器是依赖于集合而存在,在判断成功后,集合中添加了新元素,而迭代器却不知道,所以报错。即迭代器遍历元素时,通过集合不能修改元素 */import java.util.List; import java.util.ArrayList; import java.util.ListIterator;public class ListDemo7{ public static void main(String[] args){ //创建集合对象 List list = new ArrayList(); list.add("aaaa"); list.add("bbbb"); list.add("cccc"); list.add("dddd"); ListIterator it = list.listIterator(); while(it.hasNext()){ String s = (String) it.next(); if("cccc".equals(s)){ list.add("wujiadong"); } } System.out.println(list); } } ------------------------------------------ 输出结果Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) at java.util.ArrayList$Itr.next(ArrayList.java:851) at ListDemo7.main(ListDemo7.java:17)
注释:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常
------------------------------------------
解决方法
1)迭代器遍历元素,迭代器修改元素
2)集合遍历元素,集合修改元素
/*方式1:用迭代器,元素时添加在刚才迭代的元素后面*/import java.util.List;import java.util.ArrayList;import java.util.ListIterator;public class ListDemo7{ public static void main(String[] args){ //创建集合对象 List list = new ArrayList(); list.add("aaaa"); list.add("bbbb"); list.add("cccc"); list.add("dddd"); ListIterator it = list.listIterator();//注意这里不能用Iterator,该接口中不含add方法 while(it.hasNext()){ String s = (String) it.next(); if("cccc".equals(s)){ it.add("wujiadong");//通过迭代器添加元素 } } System.out.println(list); } } ------------------------------------------ 输出结果 [aaaa, bbbb, cccc, wujiadong, dddd] -------------------------------------------
/* 方式2:用集合,元素添加在最后 */import java.util.List; import java.util.ArrayList;public class ListDemo7{ public static void main(String[] args){ //创建集合对象 List list = new ArrayList(); list.add("aaaa"); list.add("bbbb"); list.add("cccc"); list.add("dddd"); for(int i=0;i<list.size();i++){ String s = (String) list.get(i); if("cccc".equals(s)){ list.add("wujiadong"); } } System.out.println(list); } } ----------------------------------------------- 输出结果 [aaaa, bbbb, cccc, dddd, wujiadong] -------------------------------------------------
List子类的特点
ArrayList
底层数据结构是数组,查询快,增删慢
线程不安全,效率高
Vector
底层数据结构是数组,查询快,增删慢
线程安全,效率低
LinkedList
底层数据结构是链表,查询慢,增删快
线程不安全,效率高