List API

List

一个ordered collection,也叫sequence(序列)。该界面的用户可以精确控制列表中每个元素的插入位置,用户可以通过其整数索引(列表中的位置)访问元素,并在列表中搜索元素。

与Sets不同,List通常允许重复的元素(List判断两者相等的标准是equals())。更正式地说,列表通常允许成对的元素e1和e2,使得e1.equals(e2),并且如果它们完全允许空元素,则它们通常允许多个空元素。

新添方法(相对于Collection)

List作为Collection的子接口,除了Collection中的所有方法外,还新加了一些根据索引来操作集合元素的方法:

import java.util.ArrayList;
import java.util.List;

public class ListTest {
    public static void main(String[] args) {
        List lt = new ArrayList();
        lt.add("All");
        lt.add("around");
        lt.add("the");
        lt.add("world");
        System.out.println(lt);

        lt.add(1,"the"); //在index为1的地方插入"the"
        for (int i =0;i<lt.size();i++){
            System.out.println(lt.get(i));  //返回index为i的元素
        }
        //删除index为1的元素
        lt.remove(1);
        System.out.println(lt);
        //返回"the"的index
        System.out.println(lt.indexOf("the"));
        //将index为2的元素替换为"THE"
        lt.set(2,"THE");
        System.out.println(lt);
        //截取子集合 2(包括) 到 4(不包括)
        System.out.println(lt.subList(2,4));

    }
}

输出结果

[All, around, the, world]
All
the
around
the
world
[All, around, the, world]
2
[All, around, THE, world]
[THE, world]

无论是添加操作还是删除操作,List只要是需要判断两者是否为同一个对象,或者是否相等时,都是通过equals方法(可以由添加的对象的类中进行重写)来判断的。

默认方法sort()和replaceAll()

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class ListTest {
    public static void main(String[] args){
        List ls = new ArrayList();
        ls.add("What");
        ls.add("do");
        ls.add("you");
        ls.add("mean");
        /**
         * sort方法需要一个Comparator对象来控制元素排序,可以使用lambda表达式作为参数
         * List默认是由从小到大来排的,但可以通过Comparator对象来改变排序规则
         */
        ls.sort((o1,o2)-> ((String)o1).length()>((String)o2).length()? 1:((String)o1).length()==((String)o2).length()?1:-1);
        System.out.println(ls);
        /**
         * replaceAll方法需要一个UnaryOperator来替换所有的集合元素,UnaryOperator也是一个函数式接口,
         * 也可以用lambda表达式作为参数
         */
        //使用目标类型为UnaryOperator的lambda表达式来替换集合中的所有元素
        //该lambda表达式控制使用每个字符串的长度作为新的集合元素
        ls.replaceAll(ele->((String)ele).length());
        System.out.println(ls);
    }
}

输出结果

[do, you, What, mean]
[2, 3, 4, 4]

listIterator()方法与listIterator对象

与Set只提供了一个Iterator()方法不同,List还额外提供了一个listIterator()方法,该方法返回一个listIterator对象。ListIterator接口继承了Iterator接口,提供了专门操作List的方法。ListIterator接口在Iterator接口的基础上增加了以下用法:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListTest2 {
    public static void main(String[] args) {
        String[] ly = {
          "my","mom","don't","like","you",",but","she","likes","everyone"
        };
        List ls = new ArrayList();
        for (int i = 0;i<ly.length;i++){
            ls.add(ly[i]);
        }

        ListIterator listIterator = ls.listIterator();
        while (listIterator.hasNext()){
            System.out.println(listIterator.next());
            //ListIterator还可以通过add()方法向List集合中添加元素
            //Iterator只能删除元素(remove())
            listIterator.add("--");
        }
        System.out.println("=====================下面开始反向迭代======================");
        while (listIterator.hasPrevious()){     //boolean hasPrevious():返回迭代器关联的集合是否还有上一个元素
            System.out.println(listIterator.previous());    //Object previous():返回该迭代器的上一个元素
        }
    }
}

输出结果

my
mom
don't
like
you
,but
she
likes
everyone
=====================下面开始反向迭代======================
--
everyone
--
likes
--
she
--
,but
--
you
--
like
--
don't
--
mom
--
my

不可修改的List(unmodifiable List)

List.of和List.copyOf静态工厂方法(static factory methods)提供了一种创建不可修改列表的便捷方法。这些方法创建的List实例具有以下特征:

  • 它们是不可修改的。元素无法添加,删除或替换。调用List上的任何mutator方法将始终引发UnsupportedOperationException。但是,如果所包含的元素本身是可变的,则可能导致列表的内容似乎发生变化。
  • 它们不允许使用null元素。尝试使用null元素创建它们会导致NullPointerException。
  • 如果所有元素是可序列化的(serializable),那么它们是可序列化的。
  • 列表中元素的顺序与提供的参数或提供的数组中的元素的顺序相同。
  • 它们是value-based,调用者不应该对返回实例的identity做任何的假设,工厂(factories)可以自由创建新实例或重用现有实例,因此,在这些实例上的身份敏感(identity-sensitive)操作(reference equality (==), identity hash code, and synchronization)是不可靠的,应该避免。
  • 它们按照“序列化表格”(Serialized Form)页面上的指定进行序列化。