JAVA复习5(集合——集合的遍历 Iteratorforeach、Enumeration——HashMap、HashTable、LinkedHashMap——map的遍历)
集合的遍歷 Iterator?? foreach? 掌握?? Enumeration
?
List??? Set??? 觀察兩個(gè)接口
?
迭代器輸出 Iterator
?
?
Set接口 或者 List 接口 都存在Iterator方法 該方法返回一個(gè)Iterator接口,通過該接口可與獲得迭代器
?
Iterator 的方法
1 public boolean?hasNext(); 判斷集合中的下一個(gè)元素是否存在
?
2 public E?next()? 取得集合中的下一個(gè)元素
?
3 default?void?remove() 刪除迭代器中元素
范例:實(shí)現(xiàn)迭代輸出
| package org.collection; ? import java.util.ArrayList; import java.util.Iterator; import java.util.List; ? public class ListDemo01 { ? ???? public static void main(String[] args) { ????????? ????????? ?List<String> all=new ArrayList<>(); ????????? ? ????????? ? ????????? ?all.add("hello"); ????????? ? ????????? ?all.add("world"); ????????? ? ????????? ?all.add("haha"); ????????? ? ? ????????? //1 聲明迭代接口 ????????? ? ????????? ?Iterator<String> iter=all.iterator(); ????????? ? ????????? ?while(iter.hasNext()) { ?????????????? ? ?????????????? ?String str=iter.next();//如果存在元素 取出賦值給 str ?????????????? ? ?????????????? ?System.out.println(str); ????????? ?} ???? } } ? |
?
?
2 Foreach 輸出
| ?//2 foreach輸出 ????????? ?for(String str:all) { ?????????????? ? ?????????????? ?System.out.println(str); ????????? ?}?? |
?
?
3 枚舉輸出 Enumeration
Enumeration 也是一個(gè)古老的接口,和Vector 是一樣的, Enumeration 主要就是為Vector服務(wù)的
觀察Vector 類中的方法
public?Enumeration<E>?elements() ;返回值正好就是Enumeration Vector獨(dú)有的方法,如果想使用該方法可以不轉(zhuǎn)型 或者向下轉(zhuǎn)型
?
Enumeration 方法有兩個(gè):
?
1 boolean?hasMoreElements(); 判斷下一個(gè)元素是否存在
?
2 E?nextElement(); 取得下一個(gè)元素
?
范例: 使用枚舉輸出 Enumeration ( 只為Vector服務(wù)) (了解)
| ?//3 枚舉輸出 Enumeration ????????? ? ????????? ?Enumeration<String> enm=all.elements(); //獲得枚舉輸出接口 ????????? ? ????????? ?while(enm.hasMoreElements()) {? //判斷下一個(gè)元素是否存在 ?????????????? ? ?????????????? ?String str=enm.nextElement();? //取出下一個(gè)元素 ?????????????? ? ?????????????? ?System.out.println(str); ????????? ?} ????????? ? |
?
?
Map 接口
?
之前學(xué)習(xí)的Collection 接口 都是順序結(jié)構(gòu),在Colleciont接口中保存的所有對象都是單個(gè)對象,而Map是鍵值對的方式出現(xiàn)的
?
鍵? Key???? 值 value
?
1???????????? 張三
?
張三??????? 123456
?
在Map集合中最大的父接口就是 Map 該接口的定義如下:
| public interface Map<K,V>? K?? V 使用的時(shí)候可以定義兩個(gè)泛型 一個(gè) K? 另一個(gè)是V |
?
Map接口中的核心方法:
1? public V?put(K?key, V?value);? 往map集合中添加元素,k?? v
?
2? public V?get(Object?key)? 給定一個(gè)key 取出key對應(yīng)的V
?
3 Set<Map.Entry<K,V>>?entrySet(); 把一個(gè)map集合轉(zhuǎn)換為Set集合
?
4 public boolean?containsKey(Object?key) 查詢指定的key是否存在
?
5 public Set<K>?keySet(); 其中的key 轉(zhuǎn)換為set
?
6public ?V?remove(Object?key) ; 根據(jù)指定的key刪除元素
?
?
Map本身是一個(gè)接口,接口不能直接使用,實(shí)現(xiàn)類
?
1 HashMap
2 HashTable
3 LinkedHashMap
4 TreeMap
范例: 實(shí)現(xiàn)Map集合的應(yīng)用(HashMap)
| public static void main(String[] args) { ????????? // k 只能是String?? v 只能是int ????????? Map<String, Integer> all=new HashMap<>(); ????????? ????????? //通過put的方法添加元素到Map集合 ????????? all.put("one", 1); ????????? ????????? all.put("two", 2); ????????? ????????? all.put("one", 3); //重復(fù)的key ????????? ????????? System.out.println(all); ???? } |
在hashMap中 Key值是不能重復(fù)的, value是可以重復(fù)的, 如果出現(xiàn)了相同的key 之前的key 會(huì)被覆蓋掉
范例:使用get方法取得map集合中的指定內(nèi)容
| System.out.println(all.get("one")); |
?
?
使用HashMap中 put方法 get方法
?
Put存放 鍵值對? ,get? 通過 key 取得對應(yīng)的value ;
?
特點(diǎn):其實(shí)對于put的方法也是存在返回值的 當(dāng)存儲的key在map集合中不存在則返回null? 如果存在相同的key 返回上一個(gè)相同key的value
?
?
相關(guān)方法的使用:
?
1 刪除
Remove
| System.out.println(all.remove("noe")); |
?
2 查找指定的key是否存在
| System.out.println(all.containsKey("one")); |
3 查找指定的value是否存在
| System.out.println(all.containsValue(1)); |
?
?
2 HashTable
?
其實(shí)相對于HashMap也是一個(gè)古老的類,功能上和HashMap完全一樣,但是區(qū)別是:
1 HashTable 線程安全? 同步處理?? 效率低??? key?? 和? value? 都不允許為null
?
2 HashMap 非線程安全, 異步處理? 效率高?? key? 和? value 都允許為null
?
面試題
?
3 LinkedHashMap
?
HashMap在集合的使用中是最常用的,但是它的特點(diǎn)是存放的數(shù)據(jù)是無序的,而如果現(xiàn)在想要存放的數(shù)據(jù)為有序的map集合 則可以使用LinkedHashMap完成 (有序? 存放的順序)
| public static void main(String[] args) { ????????? ????????? Map<String, Integer> all=new LinkedHashMap<>(); ????????? all.put("three", 3); ????????? ????????? all.put("two", 2); ????????? ????????? all.put("one", 1); ????????? ????????? System.out.println(all); ???? } |
?
LinkedHashMap 主要的實(shí)現(xiàn)形式基于鏈表實(shí)現(xiàn)的,既然是鏈表的保存,其保存的數(shù)據(jù)量一般不會(huì)太大,如果使用該結(jié)構(gòu)的時(shí)候存儲了大量的數(shù)據(jù),則時(shí)間復(fù)雜度會(huì)大量的攀升
?
?
4 TreeMap? (樹結(jié)構(gòu)? 二叉樹)
?
TreeMap子類的特點(diǎn):就是可以按照key進(jìn)行排序,使用這個(gè)類的時(shí)候一定要配合一個(gè)接口:
?
Comparable 接口
TreeMap定義如下:
| public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializabl |
?
范例: 實(shí)現(xiàn)TreeMap排序
| public static void main(String[] args) { ????????? ????????? Map<String, Integer> all=new TreeMap<>(); ????????? all.put("C", 3); ????????? all.put("B", 2); ????????? all.put("A", 1); ????????? System.out.println(all); ???? } |
?
練習(xí): 自己定義一個(gè)類 作為key存儲在TreeMap 實(shí)現(xiàn)key的排序
| public static void main(String[] args) { ????????? ????????? ????????? Map<Person, Integer> all=new TreeMap<>(); ???? ????????? all.put(new Person("張三",20), 3); ????????? ????????? all.put(new Person("小強(qiáng)",999), 2); ????????? ????????? all.put(new Person("隔壁老王",89), 1); ????????? ????????? System.out.println(all); ???? } |
?
?
主要掌握 HashMap? LinkedHashMap? TreeMap? HashTable 了解其實(shí)現(xiàn)類的特點(diǎn):在開發(fā)中根據(jù)實(shí)際的業(yè)務(wù)需求選擇使用相應(yīng)的實(shí)現(xiàn)類
?
map的遍歷:
?
Map.Entry接口:
| ?static class Node<K,V> implements Map.Entry<K,V> |
?
?
?
在Map.Entry接口中提供了如下方法:
?
1? public K?getKey() 取得key
?
2?? public V?getValue() 取得value
?
通過之前提到一個(gè)方法 entrySet()
Public Set<Map.Entry<K,V>>?entrySet()? 返回值包含了 Map.entry :
?
思考 : 在Map集合中 key是不可重復(fù)的,treeMap 有序的? HashMap 是無序的 和Set集合非常的相似 key底層和set實(shí)現(xiàn)的原理是一樣的 所以實(shí)際上map和set是可以相互轉(zhuǎn)換的
?
Map.entry 里面存放的是 key? value? 最終遍歷取值的也是通過map.entry?
?
范例: 實(shí)現(xiàn)Map集合的遍歷
| package org.map; ? import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.Set; ? public class HashMapDemo { ? ???? public static void main(String[] args) { ????????? ????????? // k 只能是String?? v 只能是int ????????? Map<String, Integer> all=new HashMap<>(); ????????? ????????? //通過put的方法添加元素到Map集合 ????????? all.put("one", 1); ????????? ????????? all.put("two", 2); ????????? ????????? all.put("three", 3); ????????? ????????? //1 將map集合轉(zhuǎn)換為Set集合 ????????? ????????? Set<Map.Entry<String, Integer>> set=all.entrySet(); ????????? ????????? //2 遍歷set集合 ????????? Iterator<Map.Entry<String, Integer>> iter=set.iterator(); ????????? ????????? //循環(huán)取出迭代器中的內(nèi)容 ????????? while(iter.hasNext()) { ?????????????? ?????????????? Map.Entry<String, Integer> me=iter.next(); ?????????????? ?????????????? System.out.println(me.getKey()); //取得key的方法 ?????????????? ?????????????? System.out.println(me.getValue());//取得value的方法 ????????? } ???? } } ? |
?
總結(jié)
以上是生活随笔為你收集整理的JAVA复习5(集合——集合的遍历 Iteratorforeach、Enumeration——HashMap、HashTable、LinkedHashMap——map的遍历)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 酷狗音乐耳机线控切歌怎么设置
- 下一篇: 集合三人斗地主的思路