Java各种集合,遍历方式详细总结

版权声明:转载请注明! https://blog.csdn.net/smile_geek_sq/article/details/81805922

首先说些注意事项:

Iterator 要注意 一个迭代器只能用一次:

//分别取键值

it.forEachRemaining(o1->System.out.println(o1.getKey()));

it.forEachRemaining((o1)->System.out.println(o1.getValue()));

第二条语句打印值 就一个都不会出现,因为 迭代器就类似指针,第一条语句指到了map的结尾 那么  第二条语句就没法执行了 当然这个不会报错 因为只是后边没东西了 所以自己就结束了

foreach  在内不能直接修改元素  改不出去

 

List:

 

ArrayList:

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<Integer> list=new ArrayList<>();
		//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<Integer> 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<Integer> 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);
		
		
	}

}

LinkedList:

初学者一定很奇怪,这俩一定有什么区别吧,毕竟底层实现不同,然而事实是没什么区别,当然我这里说的是方法没什么区别,都是那几个方法,但是效率不一样,所以面试一般会问这个,链表的话最好不要用于循环而是用的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<Integer> 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<Integer> 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<Integer> 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);
	}

}

Set

TreeSet:

因为也是由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<Integer> 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<Integer> 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);

	}

}

Map

HashMap:

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<String, Integer> 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<String,Integer> m:map.entrySet()) {
			System.out.println(m.getKey()+","+m.getValue());
		}
		//4.迭代器  也需要变成EntrySet   
		Iterator<Entry<String, Integer>> it=map.entrySet().iterator();
		//分别取键值
		it.forEachRemaining(o1->System.out.println(o1.getKey()));
		it.forEachRemaining((o1)->System.out.println(o1.getValue()));
		//或者
		Set<Entry<String, Integer>> 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()));
		
	}

}

Queue 

ArrayQueue:

本以为数组队列可以有下标 结果发现也是取不到下标的

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<Integer> 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<Integer> 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<Integer> 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<Integer> 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 也是一样的  所以这篇文章就到这里吧。

感谢阅读,有错误的地方,望指出。谢谢

猜你喜欢

转载自blog.csdn.net/smile_geek_sq/article/details/81805922