java学习笔记:集合之List
List集合
----
1.所属包名:java.util.List
2.List有索引,可以用普通for循环。(没有索引,就不刻意用普通for循环。)
3.List是有序的Collection,也称为序列。
4.List集合的特点:
(1)有序(存储和取出元素的顺序一致)
(2)存储的元素可重复
5.代码
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
List<String> list = new ArrayList<String>();
list.add("hello");
//...
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
6.List集合特有的成员方法(完全是针对索引操作的)
void add(int index, E element);//在指定位置添加元素,后面的元素往后移
E remove(int index);//删除指定位置的元素,返回被删除的元素
E get(int index);//获取指定位置的元素
E set(int index, E element);//修改指定位置的元素,返回被修改的元素
7.List集合的普通for遍历
(1)迭代器
(2)普通for循环 int size()
for(int i = 0; i < list.size(); i++){
System.out.println(list.get(i));
}
8.List列表迭代器的特有功能
ListIterator<E> listIterator();//返回此列表元素的列表迭代器,允许程序员按任意方向遍历列表。正向遍历方式与Iterator相同。
public interface ListIterator<E> extends Iterator<E>;
ListIterator<String> list = list.listIterator();
特有功能:
E previous();//返回列表中的前一个元素
boolean hasPrevious();//如果以逆向遍历列表,列表迭代器有多个元素,则返回true
注意事项:ListIterator可以实现逆向遍历,但是要求先正向遍历,才能逆向遍历。
9.ConcurrentModificationException并发修改异常的原因及解决方案
产生的原因:迭代器依赖于集合而存在,在判断成功后,集合中添加了新元素,而迭代器并不知道,所以就报错了。即迭代器遍历集合中的元素的时候,不要使用集合对象去修改集合中的元素。
解决方案:
方案一:用列表迭代器时,迭代器遍历的时候,用迭代器修改集合中的元素。元素是跟在刚才迭代的元素后面的。
方案二:用普通for循环时,集合遍历的时候,可以通过集合对象修改集合中的元素。元素是在最后添加的。(推荐此方案)
方案一的代码:
ListIterator<Student> it = list.listIterator();
while(it.hasNext){
Student stu = it.next();
if(stu.equals(stu2)){
it.add(stu4);//用迭代器添加
}
}
方案二的代码:
for(int i = 0; i < list.size(); i++){
Student stu = list.get(i);
if(stu.equals(stu2)){
list.add(stu4);//用集合添加
}
}
10.正向删除时,要调整i,i--
逆向删除时,不用调整i
正向删除的代码:
for(int i = 0; i < list.size(); i++){
if(list.get(i).equals("5")){
list.remove(i);
i--;
}
}
逆向删除的代码:
for(int i = list.size(); i >= 0; i--){
if(list.get(i).equals("5")){
list.remove(i);
}
}
11.增强for:是for循环的一种
格式:
for(元素的数据类型 变量名:数组名或者Collection集合对象名){
使用变量名即可,这个变量名代表的就是数组或者Collection集合中的元素
}
例如:
for(int x:arr){
System.out.println(x);
}
好处:简化了数组和Collection集合的遍历
弊端:目标不能为null
在遍历前,对目标做不为null的判断:
if(list != null){
for(...:list){...}
}
增强for其实就是用来替代迭代器的。
用哪种循环?只想打印集合时,用增强for;如果有增删集合时,用普通for。
====