List接口继承自Collection接口,是单列集合的一个重要分支。
在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。
另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法,如下表所示
ArrayList是List接口的一个实现类,底层的存储结构式数组。
ArrayList集合中大部分方法都是从父类Collection和List继承过来的,其中add()方法和get()方法用于实现元素的存取。
package test;
import java.util.*;
public class test1 {
public static void main(String[] args) {
List list = new ArrayList();
//add和get实现集合存取
list.add("java");
list.add("python");
list.add("mysql");
System.out.println("集合长度" + list.size());
System.out.println(list);
//可见集合里的下标也是从0开始的
System.out.println(list.get(2));
//输出:
//集合长度3
//[java, python, mysql]
//mysql
List list1 = new ArrayList();
list1.add("11");
list1.add("22");
list1.add("33");
System.out.println(list1);
//实现一个集合追加到另一个集合
list.addAll(list1);
System.out.println(list);
//查看一个元素在集合中最后出现的位置
System.out.println(list.lastIndexOf("11"));
}
}
ArrayList集合在查询元素时速度很快,但在增删元素时效率较低。
为了克服这种局限性,可以使用List接口的另一个实现类LinkedList。
该集合内部维护了一个双向循环链表,所以LinkedList集合对于元素的增删操作具有很高的效率。LinkedList集合添加元素和删除元素的过程如下图所示。
LinkedList集合具有增删元素效率高的特点。
package test;
import java.util.LinkedList;
public class test2 {
public static void main(String[] args) {
LinkedList link = new LinkedList();
link.add("java");
link.add("python");
link.add("c");
System.out.println(link);
System.out.println(link.toString());
link.add(3, "mysql");
System.out.println(link);
link.addFirst("scala");
System.out.println(link);
System.out.println(link.getFirst());
//link.remove(2);
//输出:
//[java, python, c]
//[java, python, c]
//[java, python, c, mysql]
//[scala, java, python, c, mysql]
//scala
}
}
在程序开发中,经常需要遍历集合中的所有元素。
针对这种需求,JDK专门提供了一个接口Iterator。
Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。
package test;
import java.util.ArrayList;
import java.util.Iterator;
public class test3 {
public static void main(String[] args) {
ArrayList list=new ArrayList();
list.add("R");
list.add("java");
list.add("python");
list.add("mysql");
Iterator iterator=list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,接下来通过一个图例来演示Iterator对象迭代元素的过程,如下图所示。
需要特别说明的是,当通过迭代器获取ArrayList集合中的元素时,都会将这些元素当做Object类型来看待,如果想得到特定类型的元素,则需要进行强制类型转换
为了简化书写,从JDK5.0开始,提供了foreach循环。foreach循环是一种更加简洁的for循环,也称增强for循环。foreach循环用于遍历数组或集合中的元素,其具体语法格式如下
package test;
import java.util.ArrayList;
public class test4 {
public static void main(String[] args) {
ArrayList list=new ArrayList();
list.add("C");
list.add("Java");
list.add("Python");
for (Object object:list){
System.out.println(object);
}
}
}
foreach不能用于修改,以一个String类型的数组为例。
package test;
public class test5 {
static String[] strs = {"aaa", "bbb", "ccc"};
public static void main(String[] args) {
for(String str:strs){
str="ddd";//不能进行更改
}
System.out.println("foreach循环修改后的数组:"+strs[0]+";"+strs[1]+";"+strs[2]);
for (int i=0;i<strs.length;i++){
strs[i]="ddd";
}
System.out.println("普通for循环修改后的数组:"+strs[0]+";"+strs[1]+";"+strs[2]);
}
}
迭代器周期内不能增删元素,通过一个案例来演示这种异常。
package test;
import java.util.ArrayList;
import java.util.Iterator;
public class test6 {
public static void main(String[] args) {
//test1();
test2();
//test3();
}
public static void test1() {
ArrayList list = new ArrayList();
list.add("java");
list.add("C");
list.add("mysql");
list.add("python");
Iterator it = list.iterator();
while (it.hasNext()) {
Object object = it.next();
if ("java".equals(object)) {
list.remove(object);
}
}
System.out.println(list);
}
public static void test2() {
ArrayList list = new ArrayList();
list.add("java");
list.add("C");
list.add("mysql");
list.add("python");
Iterator it = list.iterator();
while (it.hasNext()) {
Object object = it.next();
if ("java".equals(object)) {
list.remove(object);
list.remove(object);
break;
}
}
System.out.println(list);
}
public static void test3(){
ArrayList list = new ArrayList();
list.add("java");
list.add("C");
list.add("mysql");
list.add("python");
Iterator it=list.iterator();
while (it.hasNext()){
Object object=it.next();
if ("java".equals(object)){
it.remove();
}
}
System.out.println(list);
}
}