内容简介:Java平台包含两个通用的假设你已经熟悉它们,那么从
List接口
List 是一个有序的 Collection (有时称为序列),列表可能包含重复元素,除了从 Collection 继承的操作之外, List 接口还包括以下操作:
- 位置访问 — 根据列表中的数字位置操纵元素,这包括
get、set、add、addAll和remove等方法。 - 搜索 — 搜索列表中的指定对象并返回其数字位置,搜索方法包括
indexOf和lastIndexOf。 - 迭代 — 扩展
Iterator语义以利用列表的顺序性,listIterator方法提供此行为。 - 范围视图 —
sublist方法对列表执行任意范围操作。
Java平台包含两个通用的 List 实现, ArrayList ,通常是性能更好的实现,而 LinkedList 在某些情况下提供更好的性能。
集合操作
假设你已经熟悉它们,那么从 Collection 继承的操作都可以完成你期望它们做的事情,如果你不熟悉 Collection ,现在是阅读Collection接口部分的好时机, remove 操作始终从列表中删除指定元素的第一个匹配项, add 和 addAll 操作始终将新元素附加到列表的末尾,因此,以下语法将一个列表连接到另一个列表。
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 强化了对 equals 和 hashCode 方法的需求,因此可以比较两个 List 对象的逻辑相等性,而不考虑它们的实现类,如果两个 List 对象包含相同顺序的相同元素,则它们是相等的。
位置访问和搜索操作
基础的位置访问操作是 get 、 set 、 add 和 remove ( set 和 remove 操作返回被覆盖或删除的旧值),其他操作( indexOf 和 lastIndexOf )返回列表中指定元素的第一个或最后一个索引。
addAll 操作从指定位置开始插入指定 Collection 的所有元素,元素按指定 Collection 的迭代器返回的顺序插入,此调用是 Collection 的 addAll 操作的位置访问模拟。
这是在 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 实现,因为它没有实现(可选) add 和 remove 操作:数组不可调整大小。利用 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);
}
}
迭代器
正如你所期望的那样, List 的 iterator 操作返回的 Iterator 以适当的顺序返回列表的元素, List 还提供了一个更丰富的迭代器,称为 ListIterator ,它允许你在任一方向遍历列表、在迭代期间修改列表、并获取迭代器的当前位置。
ListIterator 从 Iterator 继承的三个方法( hasNext 、 next 和 remove )在两个接口中完全相同, hasPrevious 和 previous 操作和 hasNext 和 next 的很相似,前一个操作引用(隐式)游标之前的元素,而后者引用游标之后的元素, 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 的列表中, index 有 n+1 个有效值,从 0 到 n (包括 n )。
直观地说,游标总是在两个元素之间 — 一个将通过调用 previous 返回,一个将通过调用 next 返回。 n+1 个有效索引值对应于元素之间的 n+1 个间隙,从第一个元素之前的间隙到最后一个元素之后的间隙,下图显示了包含四个元素的列表中的五个可能的游标位置。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Java™ 教程(Set接口)
- nodejs使用express构建graphql接口项目教程
- Thrift RPC 系列教程(5)—— 接口设计篇:struct & enum设计
- 接口测试及常用接口测试工具
- Java中的Comparable接口和Comparator接口
- Java 的 Closeable 接口和 Cloneable 接口
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入浅出Ajax
(美)Brett McLaughlin / 东南大学出版社 / 2006-5 / 98.00元
本书将教会您如何在很短的时间内掌握使用JavaScript代码来向服务器提交异步请求?同时,您可以学习如何使用诸如动态HTML、XML、JSON、DOM等技术来解决开发过程中遇到的许多问题。让你从那些繁琐而笨拙的网站开发技术中彻底解放出来!本书将是一本指导您进行异步开发的经典参考书籍。 作为一名网站设计人员,您也许时常因为遇到以下情况而烦恼:用户只是移动了鼠标就要从服务器重载数据......一起来看看 《深入浅出Ajax》 这本书的介绍吧!