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()方法所返回的最后一个元素的操作定义的
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遍历 | 遍历的时候想操作索引 |