Iterator 要注意 一个迭代器只能用一次:
//分别取键值
it.forEachRemaining(o1->System.out.println(o1.getKey()));
it.forEachRemaining((o1)->System.out.println(o1.getValue()));
第二条语句打印值 就一个都不会出现,因为 迭代器就类似指针,第一条语句指到了map的结尾 那么 第二条语句就没法执行了 当然这个不会报错 因为只是后边没东西了 所以自己就结束了
foreach 在内不能直接修改元素 改不出去
package day0818;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;import java.util.function.Consumer;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class Demo1 {
public static void main(String[] args) {
//ArrayList集合遍历
List list=new ArrayList<>();
//1.forEach
list.forEach(System.out::println);
//2.for循环
// list.get()
for(int index=0;index0) {
System.out.println(list.remove(0));
}
//3.foreach
for(Integer a:list) {
System.out.println(a);
}
//4.迭代器
Iterator it=list.iterator();
//4.1迭代器的forEach方法
it.forEachRemaining(System.out::println);
//4.2while
//it.next()
while(it.hasNext()) {
System.out.println(it.next());
}
// 5.转成数组 再遍历数组
Integer[] a1 = new Integer[list.size()];
list.toArray(a1);
for (Integer temp : a1) {
System.out.println(temp);
}
//第二种初始化方式
Integer[] a2=(Integer[])list.toArray(new Integer[0]);
for (Integer temp : a2) {
System.out.println(temp);
}
//6. ListIterator 在使用List、ArrayList、LinkedList和Vector的时候可以使用。
ListIterator listIterator=list.listIterator();
//迭代器方法通用
listIterator.forEachRemaining(System.out::println);
//正着来
while(listIterator.hasNext()) {
System.out.println(listIterator.next());
}
//倒着来
while(listIterator.hasPrevious()) {
System.out.println(it.next());
}
//也可以 通过迭代器拿到下标后再取得元素
while(listIterator.hasNext()) {
list.get(listIterator.nextIndex());
}
//7.Stream 来自Java 1.8 的 集合专属工具类
//输出结果不一定按顺序来 并行处理
list.stream().forEach(System.out::println);
//按顺序来的
list.stream().forEachOrdered(System.out::println);
}
}
初学者一定很奇怪,这俩一定有什么区别吧,毕竟底层实现不同,然而事实是没什么区别,当然我这里说的是方法没什么区别,都是那几个方法,但是效率不一样,所以面试一般会问这个,链表的话最好不要用于循环而是用的foreach和迭代器,的foreach其实原理也是迭代器,用于的话,效率真的挺低的,我为了省事,直接复制了⬇️。
package day0818;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
public class Demo2 {
public static void main(String[] args) {
List list = new LinkedList<>();
// 1.forEach
list.forEach(System.out::println);
// 2.for循环
// list.get()
for (int index = 0; index < list.size(); index++) {
System.out.println(list.get(index));
}
// 2.2 list.remove 当然这个遍历完 集合也就空了
while (list.size() > 0) {
System.out.println(list.remove(0));
}
// 3.foreach
for (Integer a : list) {
System.out.println(a);
}
// 4.迭代器
Iterator it = list.iterator();
// 4.1迭代器的forEach方法
it.forEachRemaining(System.out::println);
// 4.2while
// it.next()
while (it.hasNext()) {
System.out.println(it.next());
}
// 5.转成数组 再遍历数组
Integer[] a1 = new Integer[list.size()];
list.toArray(a1);
for (Integer temp : a1) {
System.out.println(temp);
}
//第二种初始化方式
Integer[] a2=(Integer[])list.toArray(new Integer[0]);
for (Integer temp : a2) {
System.out.println(temp);
}6. ListIterator 在使用List、ArrayList、LinkedList和Vector的时候可以使用。
ListIterator listIterator = list.listIterator();
// 迭代器方法通用
listIterator.forEachRemaining(System.out::println);
// 正着来
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
// 倒着来
while (listIterator.hasPrevious()) {
System.out.println(it.next());
}
// 也可以 通过迭代器拿到下标后再取得元素
while (listIterator.hasNext()) {
list.get(listIterator.nextIndex());
}
// 7.Stream 来自Java 1.8 的 集合专属工具类
// 输出结果不一定按顺序来 并行处理
list.stream().forEach(System.out::println);
// 按顺序来的
list.stream().forEachOrdered(System.out::println);
}
}
因为也是由Collection 来的,所以用法上其实和 List 区别不大,但是 和List有着根本的区别,一言以蔽之,就是 有序,无下标,唯一;而 List 则无序 可重复,有下标。
所以很显然了,靠下标遍历的for循环不能用了
package day0818;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.Set;
import java.util.TreeSet;
public class Demo3 {
public static void main(String[] args) {
Set set = new TreeSet<>();
set.add(1);
//1.forEach
set.forEach(System.out::println);
// 2.for循环
// 2.2 set.remove 需要传入元素,且这个返回值是boolean类型,所以也是没法用的
// while(set.size()>0) {
// System.out.println(set.remove(0));
// }
// 3.foreach 之前说了它相当于迭代器,所以也能用
for (Integer a : set) {
System.out.println(a);
}
// 4.迭代器
Iterator it = set.iterator();
// 4.1迭代器的forEach方法
it.forEachRemaining(System.out::println);
// 4.2while
// it.next()
while (it.hasNext()) {
System.out.println(it.next());
}
// 5.转成数组 再遍历数组
Integer[] a1 = new Integer[set.size()];
set.toArray(a1);
for (Integer temp : a1) {
System.out.println(temp);
}
// 第二种初始化方式
Integer[] a2 = (Integer[]) set.toArray(new Integer[0]);
for (Integer temp : a2) {
System.out.println(temp);
}
// 6. ListIterator 在使用list、Arrayset、Linkedset和Vector的时候可以使用。
// 7.Stream 来自Java 1.8 的 集合专属工具类
// 输出结果不一定按顺序来 并行处理
set.stream().forEach(System.out::println);
// 按顺序来的
set.stream().forEachOrdered(System.out::println);
}
}
package day0818;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Demo4 {
public static void main(String[] args) {
Map map=new HashMap<>();
map.put("aa", 123);
map.put("bbb", 321);
//1.forEach
map.forEach((k,v)->System.out.println(k+","+v));
//2.for循环 在这里也是不行的
//3.foreach 要通过 entryset 变为 键值set
for(Map.Entry m:map.entrySet()) {
System.out.println(m.getKey()+","+m.getValue());
}
//4.迭代器 也需要变成EntrySet
Iterator> it=map.entrySet().iterator();
//分别取键值
it.forEachRemaining(o1->System.out.println(o1.getKey()));
it.forEachRemaining((o1)->System.out.println(o1.getValue()));
//或者
Set> entry=map.entrySet();
entry.iterator().forEachRemaining((o1)->System.out.println(o1.getKey()));
entry.iterator().forEachRemaining((o1)->System.out.println(o1.getValue()));
//5.entry 的forEach
entry.forEach((o1)->System.out.println(o1.getKey()+","+o1.getValue()));
//6.把键值分别转成 set 和list 集合 再遍历
map.keySet().iterator().forEachRemaining(System.out::println);
map.values().iterator().forEachRemaining(System.out::println);
//7.流
map.entrySet().stream().forEach((o1)->System.out.println(o1.getKey()+","+o1.getValue()));
map.entrySet().stream().forEachOrdered((o1)->System.out.println(o1.getKey()+","+o1.getValue()));
}
}
本以为数组队列可以有下标 结果发现也是取不到下标的
package day0818;
import java.util.ArrayDeque;
import java.util.Iterator;
import java.util.ListIterator;
import java.util.Queue;
public class Demo5 {
public static void main(String[] args) {
Queue q=new ArrayDeque<>();
q.add(1);
q.offer(2);
//1.forEach
q.forEach(System.out::println);
//2.for循环
//2.2 q.remove 当然这个遍历完 集合也就空了
while(q.size()>0) {
// System.out.println(q.remove());
//或者
System.out.println(q.peek());
}
//3.foreach
for(Integer a:q) {
System.out.println(a);
}
//4.迭代器
Iterator it=q.iterator();
//4.1迭代器的forEach方法
it.forEachRemaining(System.out::println);
//4.2while
//it.next()
while(it.hasNext()) {
System.out.println(it.next());
}
// 5.转成数组 再遍历数组
Integer[] a1 = new Integer[q.size()];
q.toArray(a1);
for (Integer temp : a1) {
System.out.println(temp);
}
//第二种初始化方式
Integer[] a2=(Integer[])q.toArray(new Integer[0]);
for (Integer temp : a2) {
System.out.println(temp);
}
//6. ListIterator 在使用q、Arrayq、Linkedq和Vector的时候可以使用。
//7.Stream 来自Java 1.8 的 集合专属工具类
//输出结果不一定按顺序来 并行处理
q.stream().forEach(System.out::println);
//按顺序来的
q.stream().forEachOrdered(System.out::println);
}
}
package day0818;
import java.util.ArrayDeque;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Queue;
public class Demo5 {
public static void main(String[] args) {
Queue q = new LinkedList<>();
q.add(1);
q.offer(2);
// 1.forEach
q.forEach(System.out::println);
// 2.for循环
// 2.2 q.remove 当然这个遍历完 集合也就空了
while (q.size() > 0) {
// System.out.println(q.remove());
// 或者
System.out.println(q.peek());
}
// 3.foreach
for (Integer a : q) {
System.out.println(a);
}
// 4.迭代器
Iterator it = q.iterator();
// 4.1迭代器的forEach方法
it.forEachRemaining(System.out::println);
// 4.2while
// it.next()
while (it.hasNext()) {
System.out.println(it.next());
}
// 5.转成数组 再遍历数组
Integer[] a1 = new Integer[q.size()];
q.toArray(a1);
for (Integer temp : a1) {
System.out.println(temp);
}
// 第二种初始化方式
Integer[] a2 = (Integer[]) q.toArray(new Integer[0]);
for (Integer temp : a2) {
System.out.println(temp);
}
// 6. ListIterator 在使用q、Arrayq、Linkedq和Vector的时候可以使用。
// 7.Stream 来自Java 1.8 的 集合专属工具类
// 输出结果不一定按顺序来 并行处理
q.stream().forEach(System.out::println);
// 按顺序来的
q.stream().forEachOrdered(System.out::println);
}
}
感觉队列都一样,别的就不介绍了。剩下的只是存储是 比如PriorityQueue 优先队列 可以自定义顺序等等,具体介绍在之前的 集合 文章里有
Deque 也是一样的 所以这篇文章就到这里吧。