总结java集合中List,Set,Map,Queue,Deque,Stack的遍历方式
欲要了解集合的遍历首先应该清楚这些集合的继承结构:Mao
下图大致的汇总的这些接口(除Stack)的继承结构,和他们常用的实现类。
因为上述所有的类型,都可以用Iterator迭代器的方式来遍历,所以先介绍迭代器,以及迭代器的常用方法使用。
(1):Iterator接口的介绍
Iterator表示迭代器,迭代器是一种通用的遍历Collection集合的方式。
Collection接口有一个来自父接口Iterable接口的Iterator()方法,该方法返回一个Iterator 对象,因此所有实现Collection的子类都使用Iterator对象来遍历集合的元素
(2):Iterator接口常用方法的使用
hasNext()集合中是否有下一个元素
next();取出集合中的下一个元素并返回
remove()删除元素
Iterator迭代器内部原理:
迭代器内部有个指针,首先需要调用hasNext()方法来盘对集合中是否有元素,如果有元素,那么就调用nexr()方法获取对应的元素并返回。直到获取到最后一个元素并返回。
顺便补充个常见问题:
NoSuchElementException()
当使用Iiterator对象的next()方法获取集合中的元素,如果已经获取到了最后一个元素,也就是(while循环执行完成),还要继续调用next()方法,此时就会产NOSuchElementException异常,因为此时迭代器已经迭代到集合的最后一个元素。
而且由于forech循环的内部就是一个迭代器Iterator,因此可以使用迭代器遍历的,也可以使用foreach循环来遍历。
foreach循环的语法格式:
for(数据类型 变量名:集合/数组){ //打印输出集合/数组的内容
}
下来分别介绍各个集合的遍历方法,及其代码实现:
1.List集合的遍历方式
public class testListIterator {
List<String> list1 = Arrays.asList("你好","我","亲爱","的","这个","世界");
//用Iterator遍历List集合
Iterator<String> iterator = list1.iterator();
while(iterator.hasNext()) {
String s= iterator.next();
System.out.println(s);
}
//用foreach循环遍历
for(String s:list1) {
System.out.println(s);
}
//用for循环遍历
for(int i=0;i<list1.size();i++){
System.out.println(list1.get(i));
}
}
2.Set集合:
由于set内部是使用HashMap作为存储结构的,所以它没有下标,因此无法使用以下标为索引进行for循环遍历。
Set的遍历方式如下:
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<String> set = new HashSet<>();
set.add("你好");
set.add("这");
set.add("个");
set.add("世界");
//使用迭代器
Iterator<String> iterator =set.iterator();
while(iterator.hasNext()) {
String s = iterator.next();
System.out.println(s);
}
//使用foreach
for(String s:set) {
System.out.println(s);
}
}
}
3.Map集合:Map集合最常见的实现类是HashMap,其内部是以键——值对的结构来存储数据的。也就是用key来查找value。
public class Main {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String,String>();
map.put("云想衣裳花想容","春风拂槛露华浓");
map.put("若非群玉山头见","会向瑶台月下逢");
//迭代器迭代
Iterator<Entry<String,String>> iterator = map.entrySet().iterator();
//Map中用Entry内部类来表示一个键值对,一个键值对就是一个Entry。
//Map.Entry里面包含了getKey() 和getValue()方法。
//entrySet实现了Set接口里面,存放了键值对。
while(iterator.hasNext()) {
Entry<String,String> entry = iterator.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"---"+value);
}
System.out.println();
for(Entry<String,String>entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"---"+value);
}
System.out.println();
//用foreach循环遍历key或者values
for(String key:map.keySet()) {
System.out.println(key);
}
for(String value:map.values()) {
System.out.println(value);
}
}
}
4.Queue队列:先进先出的存储结构,常见的实现类有LinkedList。
遍历方式:
public class Main1 {
public static void main(String[] args){
Queue<String> queue =new LinkedList<String>();
queue.offer("a1");
queue.offer("a2");
queue.offer("a3");
queue.offer("a4");
String item = null;
//便于理解queue的存取机构的自定义遍历方式
//这里用了poll来取出,所以最后queue集合里面空了
while((item =queue.poll())!=null){
System.out.println(item);
}
queue.offer("a1");
queue.offer("a2");
queue.offer("a3");
queue.offer("a4");
//迭代器遍历
Iterator iterator =queue.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
//foreach循环遍历
for(String s:queue){
System.out.println(s);
}
}
}
5.Deque双端队列
Deque双端队列的特点是两头都可以进,两头都可以出。他说Queue的子接口。
遍历方式:
public class test02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Deque<String> deque =new LinkedList<String>();
deque.offerFirst("B1");
deque.offerLast("B2");
deque.offer("B3");
deque.offerLast("B4");
deque.offerLast("B5");
deque.offerLast("B6");
System.out.println(deque);
System.out.println();
//自定义的遍历方式
while(deque.peekLast()!=null) {
System.out.println(deque.pollLast());
}
System.out.println();
deque.offerFirst("B1");
deque.offerLast("B2");
deque.offer("B3");
deque.offerLast("B4");
deque.offerLast("B5");
deque.offerLast("B6");
//for循环遍历
for(String s: deque) {
System.out.println(s);
}
//迭代器遍历
System.out.println();
Iterator iterator =deque.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
6.Stack栈:栈是一种后进先出的数据结构,它只有入栈和出站操作,他不是一个接口,他是在java.util;中定义的一个public class。继承了Vector;
遍历方式:
```java
public static void main(String[] args) {
Stack<String> stack = new Stack<String>();
stack.push("A1");
stack.push("A2");
stack.push("A3");
stack.push("A4");
stack.push("A5");
//自定义遍历方式
while(!stack.isEmpty()) {
System.out.println(stack.pop());
}
}
stack.push("A1");
stack.push("A2");
stack.push("A3");
stack.push("A4");
stack.push("A5");
//foreach遍历
for(String s : stack) {
System.out.println(s);
}
//迭代器遍历
Iterator<String> iterator = stack.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}