1.概述
有序的colletion(也称为序列).此接口的用户可以对列表中的每个元素的插入位置进行精确的控制,用户可以根据元素的整数索引(在列表中的位置)来访问元素,并搜索列表中的元素.
2.特点
- 元素都有下标
- 数据是有序的
- 允许存放重复的元素
3.List方法速查表
4.List接口方法测试
package partThree;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**本类用于测试List接口*/
public class TestList {
public static void main(String[] args) {
//创建list接口的多态对象,因为是接口,所以不能直接创建,需要使用Arraylist
List<String> list = new ArrayList<>();
//2.练习继承自Collection父接口的方法
list.add("大力娃"); //想list集合中存入数据
list.add("千顺娃");
list.add("头铁娃");
list.add("喷火娃");
list.add("喷水娃");
list.add("隐身娃");
list.add("紫娃娃");
System.out.println(list); //打印查看集合中的数据
//list.clear(); //清空集合
//System.out.println(list); //[]
System.out.println(list.contains("喷火娃"));//true,判断集合是否包含指定元素
System.out.println(list.equals("喷水娃"));//false,集合对象与String数据不等
System.out.println(list.isEmpty());//false,判断集合是否为空
System.out.println(list.remove("紫娃娃"));//移除集合中指定的元素
System.out.println(list.size());//6,获取集合中元素的个数
System.out.println(Arrays.toString(list.toArray()));//将集合转成数组
//3.测试List接口自己的方法--List有序,可以根据索引来操作集合中的元素
list.add("发福蝶");//追加在最后
list.add(1,"大蟒鞋");//在指定的索引处添加元素
list.add(3,"大脑斧");//在指定的索引处添加元素
System.out.println(list);
System.out.println(list.indexOf("发福蝶"));//3,获取指定元素第一次出现的索引
System.out.println(list.lastIndexOf("发福蝶"));//8,获取指定元素最后一次出现的索引
System.out.println(list);
//根据索引删除元素,并将被删除的元素返回
System.out.println(list.remove(2)); //根据索引删除集合中的元素
System.out.println(list); //千顺娃被删除
System.out.println(list.get(3));//获取指定索引处的元素
System.out.println(list.set(7,"蝎子精"));//修改指定索引处元素的值为蝎子精
System.out.println(list); //发福蝶被换成蝎子精
//集合间的操作
List<String> list2 = new ArrayList<>();//创建第2个集合
list2.add("1");//向集合2中添加元素
list2.add("2");
list2.add("3");
list2.add("4");
System.out.println(list2);//查看集合中的元素
System.out.println(list.addAll(list2));//将2集合的所有元素追加到list集合的末尾
System.out.println(list); //打印添加元素后的list
System.out.println(list.addAll(1,list2));//在list指定索引处,添加list2的所有元素
System.out.println(list); //打印添加元素后的list
}
}
5.List遍历详解
list提供了 iterator
及 listIterator
迭代器,其中 listIterator
继承于Iterator接口
,只能用于各种List类型的访问。可以通过调用listIterator()
方法产生一个指向List开始处的ListIterator
, 还可以调用 listIterator(n)
方法创建一个一开始就指向列表索引为n的元素处的ListIterator
。
iterator
其主要方法有:
hashnext()
:判断当前游标指向位置的是否有元素存在;next()
:返回当前游标位置的元素,并将游标移动到下一个位置;remove()
:删除当前游标所在上一个位置的元素,此操作只能在每次执行完成next()
方法后执行一次;
需要注意的是,Iterator
只能单向移动,Iterator.remove()
是唯一安全的方式来在迭代过程中修改集合;如果在迭代过程中以任何其它的方式修改了基本集合将会产生未知的行为。而且每调用一次next()
方法,remove()
方法只能被调用一次,如果违反这个规则将抛出一个异常。
listIterator(n)
相比于 iterator
来说,提供了更加丰富的功能:
add()
:在遍历中添加指定的元素hasNext()
:判断当前游标指向位置的是否有元素存在;hasPrevious()
:判断当前游标指向位置的上一个位置是否有元素存在;next()
:返回当前游标位置的元素,并将游标移动到下一个位置;nextIndex()
:返回当前游标位置的元素所在下标,并将游标移动到下一个位置;previous()
:返回当前游标位置的元素,并将游标移动到上一个位置;previousIndex()
:返回当前游标位置的元素所在下标,并将游标移动到上一个位置;remove()
:移除当前游标所在上一个位置的元素,此操作只能在每次执行完成next()
方法后执行一次;set()
:重新设置当前游标所在位置的元素
package partThree;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/* 本类用于进一步测试List接口的练习*/
public class TestList2 {
public static void main(String[] args) {
//1.创建多态对象
List<String> list = new ArrayList<>();
//2.向接口中添加元素
list.add("喜羊羊");
list.add("美羊羊");
list.add("懒羊羊");
list.add("小肥羊");
list.add("肥牛卷");
System.out.println(list);
//3.测试集合的迭代
/* 集合的迭代方式:
1.for循环
2.foreach 高效for循环
3.iterator
4.listIterator
*/
//方式一:因为List集合是有序的,元素有下标的,所以可以根据下标进行遍历
//从哪开始:0 到哪结束:list.size()-1 如何变化++
//i代表的就是集合中元素的索引值
for(int i = 0;i<list.size();i++){
//根据本轮循环遍历到的索引值获取对应的集合元素
System.out.println(list.get(i));
}
System.out.println("************方式一结束*************");
//方式二:因为普通for循环遍历效率低,语法复杂,所以使用高效for来遍历
//格式for(本轮遍历到的元素类型 元素名 :要遍历的内容名){循环体}
for( String s : list){
System.out.println(s);
}
System.out.println("************方式二结束*************");
//方式三:从父接口中继承过来的迭代器iterator
//1.获取对应的迭代器对象
System.out.println("Before iterate : " + list);
Iterator<String> it = list.iterator();
//2.通过刚刚获取到的迭代器循环迭代集合中的所有元素
while(it.hasNext()){//判断是否仍有下一个元素可以迭代
//获取当前位置的元素,并将游标移动到下一个位置
String s = it.next();
if("肥牛卷".equals(s)){
it.remove();
}
}
System.out.println("After iterate : " + list);
System.out.println("************方式三结束*************");
/**方式四:listIterator属于List接口特有的迭代器
* Iterator<E>--父接口--hasNext() next()
* ListIterator<E>--子接口--除了父接口的功能以外
* 还有自己的特有功能,比如逆序遍历,添加元素等等,但是不常用
* public interface ListIterator<E>extends Iterator<E>*/
//1.获取迭代器对象
ListIterator<String> it2 = list.listIterator();
//2.判断是否有下一个元素可以迭代
while(it2.hasNext()){
System.out.println(it2.next());
}
System.out.println("************方式四结束*************");
System.out.println("listIterator的逆序遍历:");
ListIterator<String> it3 = list.listIterator();
while(it3.hasNext()){//判断是否有下一个元素可迭代
System.out.println(it3.next());//打印当前迭代到的元素
if(!it3.hasNext()){//直到迭代器没有下一个元素可迭代--到最后了
System.out.println("开始逆序迭代:");
while (it3.hasPrevious()){//判断是否有上一个元素可迭代
System.out.println(it3.previous());//打印获取到的上一个元素
}
break;//终止循环,不然会一直从头到尾,再从尾到头迭代
}
}
System.out.println("************方式五结束*************");
}
}