サマリー:list集合的特點(diǎn)1)有序(存儲(chǔ)和取出的元素一直)2)可重復(fù)list存儲(chǔ)字符串并遍歷import java.util.List; import java.util.ArrayList; import java.util.Iterator;public class ListTest1{ public&nb
list集合的特點(diǎn)
1)有序(存儲(chǔ)和取出的元素一直)
2)可重復(fù)
list存儲(chǔ)字符串并遍歷
import java.util.List; import java.util.ArrayList; import java.util.Iterator;public class ListTest1{ public static void main(String[] args){ //創(chuàng)建集合對(duì)象 List list = new ArrayList(); //創(chuàng)建字符串并添加字符串 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); } } } ----------------------------- 輸出結(jié)果 wu jia dong -------------------------------
練習(xí):list存儲(chǔ)自定義對(duì)象并遍歷
import java.util.List;import java.util.ArrayList;import java.util.Iterator;public class ListDemo2{ public static void main(String[] args){ //創(chuàng)建集合對(duì)象 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; //無(wú)參構(gòu)造方法 public Student(){ super(); } //有參構(gòu)造方法 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+"]"; } } -------------------------------------- 輸出結(jié)果 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):根據(jù)索引刪除元素,返回被刪除的元素
5)修改功能
Object set(int index, Object element):根據(jù)索引修改元素,返回被修改的元素
示例:
向指定位置添加元素
/* *void add(int index,Object element):在指定位置添加元素 */import java.util.ArrayList; import java.util.List;public class ListDemo3{ public static void main(String[] args){ //創(chuàng)建集合對(duì)象 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); } } ------------------------------------- 輸出結(jié)果 最先的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){ //創(chuàng)建集合對(duì)象 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循環(huán)改進(jìn) //遍歷的方式是size()和get() for(int i = 0;i<list.size();i++){ System.out.println(list.get(i)); } } } -------------------------------------- 輸出結(jié)果 aaa bbb ---------------------- aaa bbb ccc ddd --------------------------------------
list存儲(chǔ)自定義對(duì)象并遍歷
import java.util.List;import java.util.ArrayList;public class ListDemo5{ public static void main(String[] args){ //創(chuàng)建集合對(duì)象 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; //無(wú)參構(gòu)造方法 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+"]"; } } ------------------------------------- 輸出結(jié)果 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){ //創(chuàng)建集合對(duì)象 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); } }}=-------------輸出結(jié)果hivehabasesqoop----------------------
/* 特有功能 Object previous():獲取上一個(gè)元素 boolean hasPrevious():判斷是否有元素 注意:ListIterator可以實(shí)現(xiàn)逆向遍歷,但須先正向遍歷,所以無(wú)意義,不使用 */import java.util.List;import java.util.ArrayList;import java.util.ListIterator;public class ListDemo6{ public static void main(String[] args){ //創(chuàng)建集合對(duì)象 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); } } } ---------------------------------- 輸出結(jié)果 hive habase sqoop ----------------------- sqoop habase hive ---------------------------------
并發(fā)修改異常:ConcurrentModificationException
/* 一個(gè)集合,判斷是否有"cccc"這個(gè)元素,如果有添加一個(gè)“wujiadong”元素 該異常產(chǎn)生原因:迭代器是依賴于集合而存在,在判斷成功后,集合中添加了新元素,而迭代器卻不知道,所以報(bào)錯(cuò)。即迭代器遍歷元素時(shí),通過(guò)集合不能修改元素 */import java.util.List; import java.util.ArrayList; import java.util.ListIterator;public class ListDemo7{ public static void main(String[] args){ //創(chuàng)建集合對(duì)象 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); } } ------------------------------------------ 輸出結(jié)果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)
注釋:當(dāng)方法檢測(cè)到對(duì)象的并發(fā)修改,但不允許這種修改時(shí),拋出此異常
------------------------------------------
解決方法
1)迭代器遍歷元素,迭代器修改元素
2)集合遍歷元素,集合修改元素
/*方式1:用迭代器,元素時(shí)添加在剛才迭代的元素后面*/import java.util.List;import java.util.ArrayList;import java.util.ListIterator;public class ListDemo7{ public static void main(String[] args){ //創(chuàng)建集合對(duì)象 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");//通過(guò)迭代器添加元素 } } System.out.println(list); } } ------------------------------------------ 輸出結(jié)果 [aaaa, bbbb, cccc, wujiadong, dddd] -------------------------------------------
/* 方式2:用集合,元素添加在最后 */import java.util.List; import java.util.ArrayList;public class ListDemo7{ public static void main(String[] args){ //創(chuàng)建集合對(duì)象 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); } } ----------------------------------------------- 輸出結(jié)果 [aaaa, bbbb, cccc, dddd, wujiadong] -------------------------------------------------
List子類的特點(diǎn)
ArrayList
底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢快,增刪慢
線程不安全,效率高
Vector
底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢快,增刪慢
線程安全,效率低
LinkedList
底層數(shù)據(jù)結(jié)構(gòu)是鏈表,查詢慢,增刪快
線程不安全,效率高