集合分为collection和Map,Java中遍历集合,可以统一通过实现迭代器Iterator接口来进行集合的遍历。
一、List接口
List:一种有序列表的集合,允许添加重复元素。具体实现类有ArrayList(基于数组实现)和LinkedList(基于链表实现)。
List的三种遍历方式
1、for循环遍历
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
}
2、foreach循环(和迭代器原理相同)
for(String s:list) {
System.out.println(s);
}
3、Iterator迭代器
Iterator<String> itor=list.iterator();
while(itor.hasNext()) {
System.out.println(itor.next());
}
二、Set接口
Set(相当于Map的key,没有value)使用Map作为存储结构,不允许重复(可用于去除重复元素值),元素需要正确覆写equals()和hashCode()方法,否则无法正确放入Set。
常见实现类:HashSet(无序唯一)和TreeSet (TreeSet有序,实现了sortedSet接口)
Set的两种遍历方式
1、foreach(相当于iterator)
for(String s:set) {
System.out.println(s);
}
1、Iterator 迭代器
Iterator<String> it=set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
三、Map接口
Map:使用键值对存元素key-value,key不允许重复,value可以重复。
常见三种实现类:
HashMap:最常用的Map实现类,采用数组+链表+红黑树存储,
LinkedHashMap:不能重复,有序
TreeMap:不能重复,但可以自动排序
Map的两种遍历方式
1、for each遍历
Map的keySet()方法,返回Set集合
Map<String, Integer> map=new HashMap<String, Integer>();
map.put("A", 11);
map.put("D", 22);
map.put("C", 99);
for(String key:map.keySet()) {
Integer value=map.get(key);
System.out.println(key+"-"+value);
}
Map的entrySet()集合,包含key-value
Map<String, Integer> map=new HashMap<String, Integer>();
map.put("A", 11);
map.put("D", 22);
map.put("C", 99);
for(Map.Entry<String, Integer> entry:map.entrySet()) {
System.out.println(entry);
}
2、Iterator迭代器
Map的keySet()方法,返回Set集合,iterator 迭代器
Map<String, Integer> map=new HashMap<String, Integer>();
map.put("A", 11);
map.put("D", 22);
map.put("C", 99);
Iterator<String> it=map.keySet().iterator();
while(it.hasNext()) {
String key=it.next();//it.next()一次循环用一次,所以要用key存保证每次循环值不变
System.out.println(key+"="+map.get(key));
}
Map的entrySet()集合,包含key-value,iterator迭代器
Iterator<Map.Entry<String, Integer>> it=map.entrySet().iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
四、Queue 队列 (接口)
Queue:先进先出(first in first out)线性表结构。只两个基本操作,把元素添加至队尾,从队头取出元素。
有界队列的常见实现类:ArrayBlockingQueue
无界队列的常见实现类:LinkedList
queue的两种遍历方式
1、第一种遍历方式
Queue<String> q=new LinkedList<String>();
q.offer("A");
q.offer("C");
q.offer("B");
String str=null;
while((str=q.poll())!=null) {
System.out.println(str);
}
2、foreach循环(和迭代器原理相同)
for(String s:q) {
System.out.println(s);
}
3、Iterator迭代器
Iterator<String> it=q.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
五、Deque 双端队列(接口)
Deque:继承了Queue接口,但与Queue不同的是:入队既可以在队尾,也可在队首。出队也是即可队尾出队,也可队首出队。(调用方法通常为xxxfirst()或xxxlast()。) 实现类有ArrayList和LinkedList
Deque的两种遍历方式
1、第一种遍历方式
Deque<String> dq=new LinkedList<String>();
dq.addFirst("A");
dq.addFirst("C");
dq.addLast("B");
String str=null;
while((str=dq.poll())!=null) {
System.out.println(str);
}
2、for each遍历
for(String s:dq) {
System.out.println(s);
}
3、Iterator迭代器
Iterator<String> it=dq.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
六、Stack 栈
Stack:后进先出(LIFO),往stack中压入(push(E))元素,最后进去的最早弹出(pop(E)),取出栈顶元素但不弹出(peek(E))。
Stack的两种遍历方式
1、遍历并出栈
Stack<String> stack=new Stack<String>();
stack.push("A1");
stack.push("A3");
stack.push("A2");
while(!stack.isEmpty()) {
System.out.println(stack.pop());
}
2、for each遍历
for(String s:stack) {
System.out.println(s);
}
2、Iterator迭代器
Iterator<String> it=stack.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
总结
Java的集合都可以用for each循环,List、Set、Queue…会迭代每个元素,Map会迭代每个key。Java集合使用统一的iterator遍历,Iterator对任何集合都采用同一种访问模式且对集合内部结构一无所知。