总的来说,Collection接口和Map接口是所有集合框架的父接口。Collection接口的子接口包括:Set接口、List接口和Queue接口。

1.List集合:List集合是最基础的一种集合,它是一种有序列表。它的行为和数组几乎完全相同,内部按照元素放入到先后顺序存放,每个元素都可以通过索引确定自己的位置,都是从下标0开始。

List集合的遍历方式:

a. for循环,根据索引配合get(int)方法遍历(不推荐)

public class Main {
    public static void main(String[] args) {
        List<String> list =  Arrays.asList("杭州", "北京", "上海", "南京");
        for (int i=0; i<list.size(); i++) {
            String s = list.get(i);
            System.out.println(s);
        }
    }
}

b. foreach循环(foreach循环本身就相当于使用Iterator遍历)

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("杭州", "北京", "上海", "南京");
        for (String s : list) {
            System.out.println(s);
        }
    }
}

c. 迭代器(Iterator)遍历(效率高,推荐使用)

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("杭州", "北京", "上海", "南京");
        Iterator<String> it = list.iterator();
            while( it.hasNext()){

            String s = it.next();
            System.out.println(s);
           }
       
    }
}

2. set集合: set集合是一种无序,唯一(不包含重复元素)的集合。常用的实现类是HashSet, 内部使用HashMap作为存储结构,因此没有下标值,所以无法使用for循环遍历。

set的遍历方式:

a. 使用foreash遍历

public class Main {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        set.add("pear");
        set.add("orange");
        for (String s : set) {
            System.out.println(s);
        }
    }
}

b. 迭代器(Iterator)遍历

public class Main {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        set.add("pear");
        set.add("orange");
         Iterator<String> it = set.iterator();
            while( it.hasNext()){

            String s = it.next();
            System.out.println(s);
           }
       
    }
}

3. Map集合: 和list类似,Map也是一个接口。最常见的实现类是HashMap,内部是键-值映射表的数据结构,而这种数据结构能够高效的通过key 查找到 value(如果key不存在,则返回null)。

遍历Map:

a.  遍历Map的key值 :对于Map来说,要遍历key可以使用for each循环来遍历Map实例的KeySet()方法返回的Set集合,他是包含不重复的key集合。

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 123);
        map.put("pear", 456);
        map.put("banana", 789);
        for (String key : map.keySet()) {
            Integer value = map.get(key);
            System.out.println(key + " = " + value);
        }
    }
}

b. 同时遍历key和value: 同样可以使用for each循环遍历Map对象的entrySet()集合,它里面包含了每一个key-value映射。

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 123);
        map.put("pear", 456);
        map.put("banana", 789);
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key + " = " + value);
        }
    }
}

4.Queue队列: Queue队列实现了一个先进先出(First In First Out)的有序表,它只有两个操作:队尾添加元素,队首取出元素。它是一个接口,常见的实现类有LinkedList(无界队列),ArrayBlockingQueue(有界队列)。

a . 第一种遍历方式:

public class Test02 {
     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;
		while((item = queue.poll()) != null) {
			System.out.println(item);
		}
		
	}
}

b. 迭代器遍历:

public class Test02 {
     public static void main(String[] args) {
		Queue<String> queue = new LinkedList<String>();
		queue.offer("a1"); //队首
		queue.offer("a2");
		queue.offer("a3");
		queue.offer("a4"); //队尾
        Iterator it = queue.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
	}
}

5. Deque双端队列:Deque双端队列的特点是两头都进,两头都出。既可以把元素添加到队首,也可以添加到队尾。既可以从队首获取,也可以从队尾获取。它是Queue的子接口。

a. 第一种遍历方式(会导致队列为空):

 public static void main(String[] args) {
		Deque<String> deque = new LinkedList<String>();
		deque.offerLast("A");
		deque.offerLast("B");
		deque.offerFirst("C");
		deque.offerLast("D");
		deque.offerFirst("E");
		System.out.println(deque);
		String item = null;
//		while((item = deque.pollFirst()) != null) {
//			System.out.println(item);
//		}
		
		while((deque.peekLast()) != null) {
			System.out.println(deque.pollLast());
		}
	
	}
}

b. 迭代器遍历:

public static void main(String[] args) {
		Deque<String> deque = new LinkedList<String>();
		deque.offerLast("A");
		deque.offerLast("B");
		deque.offerFirst("C");
		deque.offerLast("D");
		deque.offerFirst("E");
		System.out.println(deque);
         Iterator<String> it = deque.iterator();
	  while(it.hasNext()) {
		  System.out.println(it.next());
	  }
	}
}

6. Stack 栈 :栈(Stack)是一种后进先出(Last In First Out)数据结构,它只有入栈和出栈操作,它的使用场景:Jvm方法栈,完成进制转换,计算中缀表达式。

a. 第一种遍历方式(考虑栈是否为空):

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());
		}
      }
  }

b. foreash遍历:

 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");
        for(String s : stack) {
			System.out.println(s);
		}
	}
}

c. 迭代器遍历:

 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");
        Iterator<String> it = stack.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}
}

综上 :Collection接口的子接口遍历时都可以使用foreash方法和迭代器遍历,使用迭代器遍历效率更高效。


版权声明:本文为m0_66947503原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_66947503/article/details/124693426