Java List集合

92 阅读2分钟

List集合

List集合的特点

  • 有序:存和取的元素顺序一致
  • 有索引:可以通过索引操作元素
  • 可重复:存储的元素可以重复

List集合的特有方法

  • Collection的方法List都继承了
  • List集合因为有索引,所以多了很多索引操作的方法
方法名称说明
void add(int index, E element)在此集合中的指定位置插入指定的元素
E remove(int index)删除指定索引的元素,返回被删除的元素
E set(int index, E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素

List集合中删除元素的两种方法

  • List集合中有两个删除方法
    • 直接删除元素(Collection提供):boolean remove(E e)
    • 根据索引删除元素(重载):E remove(int index)
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
  • 接下来调用remove方法
list.remove(1);
  • 此时删除的是1这个元素,还是1索引上的元素?
    • 正确答案:1索引上的元素
    • 在调用方法的时候,如果方法出现了重载,会优先调用实参和形参类型一致的那个方法
    • 在这里1就是int类型元素,所以会优先调用根据索引删除元素的方法
  • 如果想调用直接删除的元素的方法,需要对1进行手动装箱
Integer i = Integer.valurOf(1);
list.remove(i);
  • 这时删除的就是1这个元素
    • 理由同上,这里的1已经是Integer类型,所以优先调用直接删除元素的方法

List集合的遍历方式

List集合有五种遍历方式

  • 迭代器遍历

  • 列表迭代器遍历

  • 增强for遍历

  • Lambda表达式遍历

  • 普通for循环

列表迭代器遍历

ListIterator是Iterator的子接口,可以向任意方向遍历列表,在迭代期间修改列表,并获得迭代器在列表中的当前位置

获取ListIterator迭代器

方法名称说明
ListIterator Listliterator()返回列表迭代器对象,游标指向0索引元素的前面
  • 在ListIterator中提出了一个概念:cursor(译为”游标、指针“,以下统称游标)这个游标的位置就代表着迭代器的位置,而游标的位置总是在两个元素之间

  • 而ListIterator中提供的常用方法不是根据光标位置定义的,而是根据对调用next()或previous()方法所返回的最后一个元素的操作定义的

Snipaste_2022-11-02_19-48-38.png

ListIterator中的常用方法

方法名称说明
boolean hasNext()判断游标的后面是否有元素,有元素返回true,没有元素返回false
E next()获取游标后面的元素,同时游标后移一位
int nextIndex()返回游标后面元素的索引
boolean hasPrevious()判断游标的前面是否有元素,有元素返回true,没有元素返回false
E previous()获取游标前面的元素,同时游标前移一位
int hasPrevious()返回游标前面元素的索引
void add(E e)在游标前面插入元素
void set(E e)修改最后一次通过next()或previous()方法获取的元素
void remove()移除最后一次通过next()或previous()方法获取返回的元素
  • 细节
    • 当游标指向集合末尾,再调用next()方法获取元素,报错:NoSuchElementException
    • 当游标指向集合最前面,再调用previous()方法获取元素,报错:NoSuchElementException
    • 当没有迭代,也就是没有调用next()和previous()方法直接调用set()或remove()方法时会报错:illegalStateException

五种遍历方式对比

遍历方式使用情况
迭代器遍历在遍历的时候需要删除元素
列表迭代器在遍历的时候需要添加元素
增强for遍历仅仅想遍历
Lambda表达式遍历仅仅想遍历
普通for遍历遍历的时候想操作索引