03_list-list接口

时间:2024-01-26 11:42:35

特点

  • List是Collection的子接口,是描述数据存储的接口
  • 数据结构表现为线性表,可以通过下标来操作
  • 存储数据有序
  • 可以存储重复元素
  • 可以存储null

list的API

  • ListCollection的子接口。所有肯定有Collection的所有方法。
  • 相对于Collectionlist多了一种遍历的方法fori。(因为有了get(index)这种方法)
void add(int index, E element)// 在指定位置添加元素。list添加的位置,只能在[0,length]之间

boolean addAll(int index, Collection<? extends E> c)// 在指定位置添加一个Collection的所有元素

E remove(int index)// 删除指定下标的元素,只能删除下标的位置[0, length-1]。返回的是删除的元素

E set(int index, E element)// 设置指定下标的元素为element

E get(int index)// 获取指定下标元素

int indexOf(Object o)// 获取元素的首个index
// 如果这个元素不存在,就会返回-1

int lastIndexOf(Object o)// 获取元素的最后一个index

ListIterator<E> listIterator()ListIterator<E> listIterator(int index)
List<E> subList(int fromIndex, int toIndex)

面向接口编程
一般都是拿接口去接取对象,而不是拿实现类去接取对象,因为可以方便之后的替换。


listIterator方法

返回一个ListIterator的对象。这个与迭代器(只能向后移动)类似,只是可以前后移动,可以返回index。

  • 有参构造,返回的迭代器对象,调用next返回的是指定下标的元素。
    • 传入的index的范围是:[0,length]
public interface ListIterator<E> extends Iterator<E>

-------------------------------------------------------------
继承迭代器的方法:

boolean hasNext() : // 判断后面是否还有元素可以遍历

E next()    : // 向后遍历

void remove()   : // 删除刚刚遍历的数据

-------------------------------------------------------------
ListIterator的方法:

boolean hasPrevious(): // 向前是否可以遍历

E previous(): // 向前遍历

int nextIndex() : // 向后遍历的数据的下标

int previousIndex() : // 向前遍历的下标

void add(E e) : // 添加一个数据到当前遍历位置
// 1. zs  ls  ww
//       |
// 2. listIterator.add("zl");
//    zs  zl  ls  ww
//           |

void set(E e) : // 修改刚刚遍历过的元素位置
// 可以连续set
// 1. zs  ls  ww
//       |
// 2. listIterator.set("zl");
//    zl  ls  ww
//       |

:如果我们想逆序遍历,可以list.listIterator(list.size());


subList方法

  • 从原有的集合中截取一部分。
  • 返回值为[fromIndex , toIndex)
  • subList生成的一个映射。这个生成的subList操作就是对原有集合的操作
  • 会出现并发修改异常的问题。
    • 当生成了subList之后,如果再修改原集合。再访问subList的对象,会报错。

Q:subList是不是把原有的集合截取了一个,产生一个新的数组呢?
A:subList只是一个引用,只是一个地址。

在这里插入图片描述