集合中的迭代器
Collection接口继承了Iterable,Collection通过调用Iterator方法来得到迭代器,通过迭代器的方法来完成集合中元素的遍历迭代。
Iterator<E> iterator();
常用方法:
boolean hasNext();
判断当前Iterator是否可以继续运行
E next();
获取Itreator当前指向元素,并且指向下一个元素
void remove();
删除
【注意】:
1.remove方法有且只能删除通next方法获取的元素
2.remove方法如果想要使用,必须紧挨着next方法
package com.wcc.b.iterator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* @Author kk
* @Date 2020/3/16 9:48
*/
public class Demo1 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<String>();
c.add("烤羊排");
c.add("油闷大虾");
c.add("土豆牛肉");
c.add("麻辣香锅");
c.add("孜然肉片");
c.add("酸汤肥牛");
/*
获取当前集合对应的Iterator迭代器对象
*/
//Collection接口继承了Iterable,Collection通过调用Iterator方法来得到迭代器,
//通过迭代器的方法来完成集合中元素的遍历迭代。
Iterator<String> iterator = c.iterator();
System.out.println("当前集合是否可以正常运行:" + iterator.hasNext());
System.out.println("获取当前指向的元素:" + iterator.next());
System.out.println("获取当前指向的元素:" + iterator.next());
/*
执行结果:
获取当前指向的元素:烤羊排
获取当前指向的元素:油闷大虾
*/
iterator.remove();
//因为离着remove最近的next指向的是油闷大虾,所以删除了油闷大虾
System.out.println(c);
iterator.remove();
System.out.println(c);
/*
[烤羊排, 土豆牛肉, 麻辣香锅, 孜然肉片, 酸汤肥牛]
Exception in thread "main" java.lang.IllegalStateException
at java.base/java.util.ArrayList$Itr.remove(ArrayList.java:1009)
at com.wcc.b.iterator.Demo1.main(Demo1.java:37)
*/
}
}
package com.wcc.b.iterator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* @Author kk
* @Date 2020/3/16 10:03
*/
public class Demo2 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<String>();
c.add("烤羊排");
c.add("油闷大虾");
c.add("土豆牛肉");
c.add("麻辣香锅");
c.add("孜然肉片");
c.add("酸汤肥牛");
Iterator<String> iterator = c.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
//通过集合删除元素
c.remove("土豆牛肉");
/**
* Exception in thread "main" java.util.ConcurrentModificationException
* at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)
* at java.base/java.util.ArrayList$Itr.next(ArrayList.java:996)
* at com.wcc.b.iterator.Demo2.main(Demo2.java:25)
*
* Iterator在创建的过程中,会同集合中的每个元素打招呼,记录每一个元素的位置
* 在Iterator执行next方法过程中,会按照初始的条件一个一个遍历,但是当集合中删除某个已经被
* 迭代器记录的元素时,迭代器会因为找不到元素而发生异常
*
* 这里是因为集合中的元素,对于集合本身和当前Iterator而言是一个共享资源
* 不管是哪一方操作元素,都存在影响对方的情况【共享资源冲突问题】
*/
}
}
}
List<E>集合接口特征和方法
特征:有序,可重复
有序:添加顺序和存储顺序一致
可重复:相同元素可以同时添加
List<E>接口下的实现类,存在一定的下标操作机制
ArrayList<E> 底层数组形式操作,可以通过下标直接访问
LinkedList<E>底层是一个双向链表接口,下标等价于计数器
特定的方法:
增:
add(E e);
在List接口下,当前方法是添加元素到集合的末尾,尾插法
addAll(Collection<? extends E> c);
List接口下,当前方法是添加另一个集合到当前集合的末尾,要求添加的集合中
保存的元素和当前集合保存元素一致,或者说是当前集合保存的元素的子类
add(int index, E e);
在指定的下标位置,添加指定元素
add(int index, Collection<? extends E> c);
与上一个addAll方法一致
删:
void clear();
清空整个集合
remove(Object obj);
删除集合中的指定元素
removeAll(Collection<?> c);
删除两个集合的交集
retainall(Collection<?> c);
保留两个集合的交集
E remove(int index);
删除指定下标的元素,返回值是被删除的元素
改:
E set(int index, E e);
使用指定元素替换指定下标index的元素,返回值是被替换的元素
查:
int size();
有效元素个数
boolean isEmpty();
判断当前集合是否为空
boolean contains(Object obj);
判断该集合中是否有某个元素
boolean containsAll(Collection<?> c);
判断c集合是不是该集合的子集
int indexOf(Object obj);
查询指定元素所在的下标位置
int lastIndexOf(Object obj);
查询指定元素最后一次出现的位置
E get(int index);
获取指定下标的元素
List<E> subList(int fromIndex, int endIndex);
获取当前集合的子集合
方法演示代码:
package com.wcc.c.List;
import java.util.ArrayList;
import java.util.List;
/**
* @Author kk
* @Date 2020/3/16 11:18
*/
public class Demo1 {
public static void main(String[] args) {
//List接口没有对象,所以用实现类ArrayList
List<String> list = new ArrayList<String>();
list.add("酱油炒饭");
list.add("酱爆牛肉");
list.add("扬州炒饭");
list.add("黄金炒饭");
list.add("老干妈炒饭");
System.out.println(list);
list.add(3,"鱼香肉丝炒饭");
System.out.println(list);
List<String> list2 = new ArrayList<String>();
list2.add("干炒牛河");
list2.add("炒方便面");
list2.add("炒饼丝");
list2.add("干炒牛河");
list.addAll(list2);
System.out.println(list);
//[酱油炒饭, 酱爆牛肉, 扬州炒饭, 鱼香肉丝炒饭, 黄金炒饭,
// 老干妈炒饭, 干炒牛河, 炒方便面, 炒饼丝, 肉火烧]
System.out.println(list.remove(5));
//老干妈炒饭
list.set(4,"我是饭");
System.out.println(list);
//[酱油炒饭, 酱爆牛肉, 扬州炒饭, 鱼香肉丝炒饭, 我是饭, 干炒牛河, 炒方便面, 炒饼丝, 肉火烧]
System.out.println(list.indexOf("干炒牛河"));
//5
System.out.println(list.lastIndexOf("干炒牛河"));
//8
List<String> list3 = list.subList(0,5);
//subList方法要头不要尾
System.out.println(list3);
//[酱油炒饭, 酱爆牛肉, 扬州炒饭, 鱼香肉丝炒饭, 我是饭]
}
}
未完待续......