Java™ 教程(List接口)

栏目: Java · 发布时间: 6年前

内容简介:Java平台包含两个通用的假设你已经熟悉它们,那么从

List接口

List 是一个有序的 Collection (有时称为序列),列表可能包含重复元素,除了从 Collection 继承的操作之外, List 接口还包括以下操作:

  • 位置访问 — 根据列表中的数字位置操纵元素,这包括 getsetaddaddAllremove 等方法。
  • 搜索 — 搜索列表中的指定对象并返回其数字位置,搜索方法包括 indexOflastIndexOf
  • 迭代 — 扩展 Iterator 语义以利用列表的顺序性, listIterator 方法提供此行为。
  • 范围视图 — sublist 方法对列表执行任意范围操作。

Java平台包含两个通用的 List 实现, ArrayList ,通常是性能更好的实现,而 LinkedList 在某些情况下提供更好的性能。

集合操作

假设你已经熟悉它们,那么从 Collection 继承的操作都可以完成你期望它们做的事情,如果你不熟悉 Collection ,现在是阅读Collection接口部分的好时机, remove 操作始终从列表中删除指定元素的第一个匹配项, addaddAll 操作始终将新元素附加到列表的末尾,因此,以下语法将一个列表连接到另一个列表。

list1.addAll(list2);

这是这个语法的非破坏性形式,它产生第三个 List ,其中包含附加到第一个列表的第二个列表。

List<Type> list3 = new ArrayList<Type>(list1);
list3.addAll(list2);

请注意,此语法在其非破坏性形式中利用了 ArrayList 的标准转换构造函数。

这是一个将一些名称聚合到 List 中的示例(JDK 8及更高版本):

List<String> list = people.stream()
.map(Person::getName)
.collect(Collectors.toList());

Set 接口一样, List 强化了对 equalshashCode 方法的需求,因此可以比较两个 List 对象的逻辑相等性,而不考虑它们的实现类,如果两个 List 对象包含相同顺序的相同元素,则它们是相等的。

位置访问和搜索操作

基础的位置访问操作是 getsetaddremovesetremove 操作返回被覆盖或删除的旧值),其他操作( indexOflastIndexOf )返回列表中指定元素的第一个或最后一个索引。

addAll 操作从指定位置开始插入指定 Collection 的所有元素,元素按指定 Collection 的迭代器返回的顺序插入,此调用是 CollectionaddAll 操作的位置访问模拟。

这是在 List 中交换两个索引值的一个小方法。

public static <E> void swap(List<E> a, int i, int j) {
    E tmp = a.get(i);
    a.set(i, a.get(j));
    a.set(j, tmp);
}

当然,有一个很大的区别,这是一个多态算法:它交换任何 List 中的两个元素,无论其实现类型如何,这是另一种使用前面 swap 方法的多态算法。

public static void shuffle(List<?> list, Random rnd) {
    for (int i = list.size(); i > 1; i--)
        swap(list, i - 1, rnd.nextInt(i));
}

此算法包含在 Java 平台的 Collections 类中,使用指定的随机源随机置换指定的列表,这有点微妙:它从底部向上运行列表,反复将随机选择的元素交换到当前位置。不像大多数天真的洗牌尝试,这是公平的(假设一个公平的随机源,所有排列都有相同的可能性)和快速(需要完全 list.size()-1 交换),以下程序使用此算法以随机顺序打印其参数列表中的单词。

import java.util.*;

public class Shuffle {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        for (String a : args)
            list.add(a);
        Collections.shuffle(list, new Random());
        System.out.println(list);
    }
}

事实上,这个程序可以更短、更快, Arrays 类有一个名为 asList 的静态工厂方法,它允许将数组视为 List ,此方法不会复制数组, List 中的更改会写入数组,反之亦然。生成的 List 不是通用 List 实现,因为它没有实现(可选) addremove 操作:数组不可调整大小。利用 Arrays.asList 并调用 shuffle 的库版本(使用默认的随机源),你将得到以下 微小程序 ,其行为与前一个程序相同。

import java.util.*;

public class Shuffle {
    public static void main(String[] args) {
        List<String> list = Arrays.asList(args);
        Collections.shuffle(list);
        System.out.println(list);
    }
}

迭代器

正如你所期望的那样, Listiterator 操作返回的 Iterator 以适当的顺序返回列表的元素, List 还提供了一个更丰富的迭代器,称为 ListIterator ,它允许你在任一方向遍历列表、在迭代期间修改列表、并获取迭代器的当前位置。

ListIteratorIterator 继承的三个方法( hasNextnextremove )在两个接口中完全相同, hasPreviousprevious 操作和 hasNextnext 的很相似,前一个操作引用(隐式)游标之前的元素,而后者引用游标之后的元素, previous 操作向后移动光标,而 next 向前移动光标。

这是在列表中向后迭代的标准语法。

for (ListIterator<Type> it = list.listIterator(list.size()); it.hasPrevious(); ) {
    Type t = it.previous();
    ...
}

请注意前面的语法中 listIterator 的参数, List 接口有两种形式的 listIterator 方法,不带参数的形式返回位于列表开头的 ListIterator ,带有 int 参数的形式返回一个位于指定索引处的 ListIterator 。索引引用初始调用 next 返回的元素,对 previous 的初始调用将返回索引为 index-1 的元素,在长度为 n 的列表中, indexn+1 个有效值,从 0n (包括 n )。

直观地说,游标总是在两个元素之间 — 一个将通过调用 previous 返回,一个将通过调用 next 返回。 n+1 个有效索引值对应于元素之间的 n+1 个间隙,从第一个元素之前的间隙到最后一个元素之后的间隙,下图显示了包含四个元素的列表中的五个可能的游标位置。

Java™ 教程(List接口)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ActionScript 3.0 Cookbook

ActionScript 3.0 Cookbook

Joey Lott、Darron Schall、Keith Peters / Adobe Dev Library / 2006-10-11 / GBP 28.50

Well before Ajax and Microsoft's Windows Presentation Foundation hit the scene, Macromedia offered the first method for building web pages with the responsiveness and functionality of desktop programs......一起来看看 《ActionScript 3.0 Cookbook》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具