摘要: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
底层数据结构是链表,查询慢,增删快
线程不安全,效率高