標籤:查看 style 地方 出棧 實現 contains override 遍曆 nta
* java.util.Map * Map看起來像是一個多行兩列的表格 * 每條記錄分為兩部分:key,value * 其中在一個Map中key是不允許重複的。(equals比較) * * 常用的實作類別:java.util.HashMap(散列演算法實現) * TreeMap(二叉樹實現) Map<String,Integer> map = new HashMap<String,Integer>(); * V put(K k,V v) * 將給定的key與value存入到Map中。 * 由於Map中key不允許重複,所以會出現兩種情況: * 1:存入的key在Map中還不存在,那麼直接將這對 * key-value存入Map,傳回值為NULL * 2:存入的key在Map中已經存在,那麼會將對應的 * value替換原來這個key對應的value,並將被 * 替換的value值返回。 map.put("語文", 98); map.put("數學", 97); map.put("英語", 95); map.put("物理", 92); map.put("化學", 96); * 存入順序與內部順序不一致 map.put("化學", 99); * V get(K k) * 根據給定的key去擷取對應的value * 若當前Map中不含有給定的key,則傳回值為NULL Integer num = map.get("數學"); * V remove(K k) * 將給定的key對應的這一對內容從Map中刪除 * 並將對應的value返回。 num = map.remove("化學"); System.out.println("刪除的value:"+num); * boolean containsKey(K k) * 查看當前Map是否包含給定的key * 包含的判斷是依據key的equals比較的結果 boolean containsKey = map.containsKey("語文"); * 遍曆Map * 遍曆Map有三種方式: * 1:遍曆所有的key * 2:遍曆每一組索引值對 * 3:遍曆所有的value(相對不常用) * LinkedHashMap * 內部使用一個LinkedList維護順序,可以做到 * 遍曆的時候與put的順序一致。若不需要順序, * 通常不使用該類。 * 遍曆所有的key: * Set<K> keySet() * 該方法會將所有的key存入一個Set集合後返回,所以遍曆該集合就相當於遍曆到所有的key了 Set<String> keySet = map.keySet(); for(String key : keySet){ System.out.println("key:"+key); } * 遍曆每一組索引值對 * Set<Entry> entrySet() * Entry是Map的內部類,每一個執行個體表示一組索引值對 * 其中包含兩個屬性,key,value. * 將每一組索引值對(Entry執行個體)存入一個Set集合後 * 將其返回。 Set<Entry<String,Integer>> entrySet = map.entrySet(); for(Entry<String,Integer> e:entrySet){ String key = e.getKey(); Integer value = e.getValue(); System.out.println(key+":"+value); } * Collection<V> values() * 將當前Map中所有的value值存入一個集合後返回 Collection<Integer> values = map.values(); for(Integer value : values){ System.out.println("value:"+value); } * 該類用於練習重寫equals與hashcode的注意事項 * 當我們使用自訂類型的執行個體作為HashMap中key的值 * 時,這個類的equals與hashcode的結果直接影響著 * HashMap查詢的效率 * 要避免一件事的產生: * hashcode值一樣,但是equals比較不為true!這會 * 嚴重影響HashMap效率 * JAVA API文檔中對於兩個方法的重寫有著要求: * 當我們重寫一個類的equals方法時就應當連同重寫 * hashcode方法。 * 還應同時滿足: * 當兩個對象equals比較為true時,hashcode返回的 * 值應當相等。反過來不強制,但最好也不同,否則影響 * HashMap效能。 * hashcode方法返回的應該是一個穩定的值,意思是說: * 當確定equals方法比較結果的屬性值沒有發生改變的 * 前提下,多次調用hashcode方法返回的值應當相同。 * public class Cell { private int row; private int col; public Cell(int row, int col) { super(); this.row = row; this.col = col; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + col; result = prime * result + row; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Cell other = (Cell) obj; if (col != other.col) return false; if (row != other.row) return false; return true; } } * 隊列 * 儲存一組元素,但是對於存取有要求,必須遵循先進先出原則 Queue<String> queue = new LinkedList<String>(); * boolean offer(E e) * 向隊列末尾追加一個元素 queue.offer("one"); queue.offer("two"); queue.offer("three"); queue.offer("four"); * E poll() * 從隊首擷取元素。注意,擷取後該元素就從 * 隊列中被移除了!出隊操作 String str = queue.poll(); System.out.println(str); * E peek() * 同樣可以擷取隊首元素,但是與poll不同的是 * 並不會將該元素從隊列中刪除。 str = queue.peek(); System.out.println(str); * 棧:儲存一組元素,存取必須遵循先進後出原則 * 通常用來實現具有"後退"功能的地方。 * Deque是Queue的子介面。 * 雙端隊列的特點是,隊列的兩端都可以進出元素。 * 若我們只調用一側的進出方法,就形成了棧結構 Deque<String> stack = new LinkedList<String>(); * void push(E e) * 將元素"壓入"棧中,入棧操作。新入棧的元素 * 會在棧頂(棧中第一個元素) stack.push("one"); stack.push("two"); stack.push("three"); stack.push("four"); * E pop() * 出棧操作,擷取棧頂元素,擷取後該元素 * 就從棧中被刪除了 String str = stack.pop(); System.out.println(str); * 同樣可以使用peek引用棧頂元素,而不做出棧操作 str = stack.peek(); System.out.println(str);
java課堂筆記------Map,隊列,棧