五、集合——4-List集合
4-List集合
List集合代表一个元素有序,可重复的集合,集合中的每个元素都有与其对应的索引(类似于数组)。
1.List接口和ListIterator接口
list接口:
(1)List接口继承了Collection接口,所以可以使用Collection接口中的所有方法,同时,由于List是有序集合,有索引,所以增添了几个根据索引来操作集合元素的方法:
import java.util.ArrayList; import java.util.List; public class ListTest { public static void main(String[] args) { //创建List集合 List list = new ArrayList(); //向list中添加元素 list.add(new String("a")); list.add(new String("b")); list.add(new String("c")); list.add(new String("d")); //将新的字符串对象插入到索引为1处,之后元素向后移动 list.add(1,new String("e")); System.out.println(list); //删除第二个元素 remove()方法的参数也可以是一个对象的引用,每次删除List集合中第一个与其相等的元素 list.remove(1);
list.remove("b"); System.out.println(list); //获取指定元素的索引 System.out.println(list.indexOf("c")); //替换指定索引处的元素 list.set(1,"a"); System.out.println(list); //截取子集合 list = list.subList(0, 2); //不包括索引为2的元素 System.out.println(list); } }
(2)判断两个List中的元素是否相等,只要通过equals()方法进行比较即可;
(3)每次从集合中删除一个对象时,总是删除List集合中第一个与其相等的对象;
(4)List中的其他方法:
import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.function.UnaryOperator; public class ListTest2 { public static void main(String[] args) { //sort()方法 //用于对List集合进行排序 List list = new ArrayList(); list.add(2); list.add(1); list.add(3); list.add(5); list.add(4); System.out.println(list); //输出2 1 3 5 4 list.sort(new Comparator(){ @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub Integer a = (Integer)o1; Integer b = (Integer)o2; return a-b; }}); System.out.println(list); //因为Comparator接口是一个函数式接口,所以可以是使用Lambda表达式 list.sort((o1,o2)->((Integer)o1-(Integer)o2)); System.out.println(list); } }
ListIterator接口:
(1)ListIterator接口继承了Iterator接口,提供了专门用于操作List集合的方法;
(2)ListIterator接口的使用:
import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListIteratorTest { public static void main(String[] args) { String[] stus = { "Abb", "Bca", "Cad", "Cba" }; List list = new ArrayList(); //插入元素 for(int i=0;i<stus.length;i++){ list.add(stus[i]); } ListIterator lt = list.listIterator(); //正常迭代 while(lt.hasNext()){ System.out.println(lt.next()); //ListIterator提供了add()方法为集合添加元素 lt.add("aaaaaa"); } //反向迭代 while(lt.hasPrevious()){ System.out.println(lt.previous()); } } }
2.ArrayList和Vector实现类
(1)ArrayList和Vecter都是基于数组实现的两个List类,他们分配了一个动态的允许再分配的Object[]数组,他们使用参数initialCapacity来设置数组的长度,当向ArrayList或者Vector中谈价元素时,这个参数会自动增加;
(2)可以通过ensureCapaCity(int minCapacity)的方法一次性的增加initialCapacity参数,避免增加重分配Object[]的次数来提高性能;
(3)如果创建一个空的ArrayList或者Vector,不指定他们的initailCapacity参数,则Object[]默认的长度为0;
(4)ArrayList是非线程安全的,而Vector是线程安全的,但是不建议使用Vector,而是使用Collections工具类让ArrayList集合成为一个线程安全的集合;
3.固定长度的List
(1)Arrays.ArrayList是一个固定长度的List,这个List不是集合框架中的List而是在Arrays工具类中内部类ArrayList的实例。这是一个长度固定的List集合,程序只能遍历访问该集合中的元素,而不能进行其中的元素操作。