位置访问操作

List API 有八种位置访问操作方法:

  • add(T type)
  • add(int index, T type)
  • remove(Object o)
  • remove(int index)
  • get(int index)
  • set(int index, E element)
  • int indexOf(Object o)
  • int lastIndexOf(Object o)

所以,如果我们有一个 List:

List<String> strings = new ArrayList<String>();

我们想要添加字符串 Hello World! 和“再见世界!” 对它来说,我们会这样做:

strings.add("Hello world!");
strings.add("Goodbye world!");

我们的列表将包含两个元素。现在我们假设我们要添加“程序启动!” 在列表的前面。我们会这样做:

strings.add(0, "Program starting!");

注意:第一个元素是 0

现在,如果我们想要删除再见世界! 我们可以这样做:

strings.remove("Goodbye world!");

如果我们想删除第一行(在这种情况下将是“程序启动!”,我们可以这样做:

strings.remove(0);

注意:

  1. 添加和删​​除列表元素会修改列表,如果同时迭代列表,这可能会导致 ConcurrentModificationException

  2. 添加和删​​除元素可以是 O(1)O(N),具体取决于列表类,使用的方法以及是在列表的开头,结尾还是中间添加/删除元素。

为了在指定位置检索列表元素,你可以使用 List API 的 E get(int index); 方法。例如:

strings.get(0);

将返回列表的第一个元素。

你可以使用 set(int index, E element); 替换指定位置的任何元素。例如:

strings.set(0,"This is a replacement");

这将设置字符串 This is a replacement 作为列表的第一个元素。

注意:set 方法将覆盖位置 0 处的元素。它不会在位置 0 处添加新 String 并将旧字符串推送到位置 1。

int indexOf(Object o); 返回作为参数传递的第一次出现的对象的位置。如果列表中没有出现该对象,则返回 -1 值。如果你调用,继续上一个例子:

strings.indexOf("This is a replacement")

当我们在列表的位置 0 设置字符串 This is a replacement 时,预计会返回 0。如果在调用 int indexOf(Object o); 时列表中出现多个事件,则如上所述将返回第一次出现的索引。通过调用 int lastIndexOf(Object o),你可以检索列表中最后一次出现的索引。因此,如果我们添加另一个这是替代品

strings.add("This is a replacement");
strings.lastIndexOf("This is a replacement");

这次 1 将返回而不是 0;