卓尔高考网

Java 中的 List —— 有序序列

篇首语:本文由小编为大家整理,主要介绍了Java 中的 List —— 有序序列相关的知识,希望对你有一定的参考价值。

List 在 java 中是个有序序列:

一、容量

ArrayList 中有一个容量概念,表示基础数组的大小(无参时默认为 10)。在需要的时候(比如 add操作)会自动增加其容量。LinkedList 没有这个概念。

TreeMap 也有容量,默认是 16.

 

二、改善的 search 方法

LinkedList 与 ArrayList 都很低效。比如 Collection 的 contain 和 remove 方法而言。他们均花费线性时间。可以使用相应的算法。

 

三、改善的 remove 方法(此方法对 ArrayList 无效,ArrayList 由于 remove 会改变数组结构,结构重组将花费大量时间。)

 foreach 的局限性

public static void removeEvensVer2(List lst) {    for(Integer x : lst) {        if (x % 2 == 0)            lst.remove(x);    }}抛异常 java.util.ConcurrentModificationException

使用 while循环(但是这个方法对于 LinkedList 来说有几个糟糕的操作:1,使用 get方法,去遍历,在遍历的时候 get也花费线性时间。2,remove 同理,remove方法本身也花费线性时间)

 public static void removeEvensVer1(List lst) {        int i = 0;        while (i < lst.size())            if (lst.get(i) % 2 == 0)                lst.remove(i);            else                i++;    }

迭代器自带的 remove 处理 LinkedList:

当迭代到其节点时处理 remove 该节点的元素,仅花费常数时间。此外,LinkedList 除了 Collection 借口提供的 iterator方法之外, 还有扩展的 listIterator()  返回一个扩展接口 ListIterator,具有 hasPrevious()  pevious()  add(Anytype x)  set(AnyType newVal) 方法。主要方便从末尾向前迭代,和在迭代时添加和改变值(对于 LinkedList 改变和添加值花费较少。)

public static void removeEvensVer3(List lst) {    Iterator itr = lst.iterator();    while (itr.hasNext())        if (itr.next() % 2 == 0)            itr.remove();}

 

四、排序

对于有序序列,可以使用 Collections.sort(List list, Comparator c) 按照自己的要求进行排序。

对于 TreeSet/TreeMap 基于红黑树数据结构,可以按照元素的自然顺序,或者创建 set 时提供的 Comparator 进行排序。

 

五、 ArrayList 与 LinkedList、Array 的区别

Array 固定长度,可以包含 primitives 基础类型与对象了;

ArrayList 基于数组结构,是大小可变数组的实现。ArrayList 只能包含 对象,可以使用泛型;

LinkedList 基于双向链表结构,List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 getremove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列 (实现了 Queue 与 Deque 接口)。

 

以上是关于Java 中的 List —— 有序序列的主要内容,如果未能解决你的问题,请参考以下文章

您可能还会对下面的文章感兴趣: