总的来说,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方法和迭代器遍历,使用迭代器遍历效率更高效。