1. 程式人生 > >Map集合例項練習二

Map集合例項練習二

本篇主要講解hashMap的遍歷:!!!!!!!!!!!!!這可以是重點之重,一定要掌握運用!!!!

遍歷方式1 :  通過鍵的集合,獲取值 .

package cn.map2;

import java.util.Collection;
import java.util.HashMap;
import java.util.Set;
/*
 * 遍歷方式1 :  通過鍵的集合,獲取值 .
 * 演示方法 Collection<V> values()    //返回所有值的集合
 */
public class Demo5 {
	public static void main(String[] args) {
		// 建立 HashMap 物件
		HashMap<String, String> hashMap = new HashMap<>();
		// 新增 元素 put 方法
		//值是可以重複的,鍵是唯一的
		hashMap.put("馬雲", "企業家教育家"); // {馬雲=企業家教育家}
		hashMap.put("馬化騰", "企業家"); // {馬化騰=企業家, 劉強東=企業家}
		hashMap.put("劉強東", "企業家");
		Set<String> keySet = hashMap.keySet();
		for (String key : keySet) {
			String value = hashMap.get(key); // 通過 鍵 獲取值
			System.out.println(key + " -- " + value);
		}
		//列印所有的值
		System.out.println("==================================");
		System.out.println("列印所有的值");
		Collection<String> values = hashMap.values(); // 應用不多 .
		for (String v : values) {
			System.out.println(v);
		}
	}
}

以上輸出結果為:

劉強東 -- 企業家
馬化騰 -- 企業家
馬雲 -- 企業家教育家
==================================
列印所有的值
企業家
企業家
企業家教育家
 

Java集合框架知識總結

4.1 Collection:

4.1.1 List 介面 :

List:裡面物件全部是有序的(通過三種方法來遍歷)
ArrayList,LinkedList,Vertor

ArrayList:本質上 ArrayList 裡維護的就是動態可變長度的陣列。

常用方法:
   增:add(4) 物件 位置+物件  集合 集合+位置。
   刪:remove(2)下標刪物件,直接刪物件。
   改:set(1) 下標  物件。
   查:get() 下標得物件, indexOf()物件得下標。

   contains()必須是同一個物件才返回true  iterator() size()。

LinkedList:本質上 LinkedList 裡維護的是動態可變長度的雙向連結串列

 常用方法:
   增:add(4) 物件 位置,物件 集合 位置,集合 +2(物件) 新增:addFirst() addLast()。
   刪:remove(2)下標刪物件,直接刪物件 +2(物件) 新增:removeFirst() removeLast()。
   改:set(1) 下標 物件
   查:get() 下標得物件 indexOf()物件得下標 +2(物件) 新增:getFirst() getLast()。

     contains() iterator()size()。

Vertor:執行緒安全,執行效率非常低

 常用方法:
   增:add(4) 物件 位置,物件 集合 位置,集合 addElement(物件) insertElement(物件)。
   刪:remove(2)下標刪物件,直接刪物件 removeElement(物件) removeAllElment()。
   改:set(1) 下標,物件 setElementAt(物件,下標)。
   查:get() 下標得物件 indexOf()物件得下標。

    contains() iterator() size()。

   iterator() :hasNext()判斷有沒有下一個元素。
   next()獲取下一個元素。
   remove()在迭代器中移除元素。

4.1.2 Set介面:

不允許出現重複的方法,允許有一個null值,都沒有順序索引(通過增強for迴圈和迭代來遍歷),所以查不了,改不了。
  要想存入Set,必須重寫equals()和hashCode()方法(String已經重寫),兩者返回值都為真表明相等,比的是內容。
  其實一個equals()就可以,但是當存入資料量大的時候,一一比較效率非常低,加入hashCode,就是來判斷不是同一個物件的。
  用hashCode()無法判斷是同一個物件。

  因為所有的已經存入的物件儲存在一個table裡面,比較的效率非常高。
      如果已存在,是不能再往裡面新增(而Map是後面覆蓋前面)。

HashSet:

  內部維護的是HashMap的一個例項,存的是key的集合。
  元素的表現是無序的,但一旦新增完元素,元素位置是固定的(也就是說你無論再執行多少遍,這個顯示的順序都一樣),再新增新元素,不會影響前面元素的位置,給新增的元素分配位置,只要不打亂前面的元素位置,前面的元素位置就不會再發生變化。

 常用方法:
  增:add(物件)。
  刪:clear()移除所有物件 ,remove(物件)。
  改:沒有,沒下標。
  查:除了遍歷出所有,沒有,因為沒有下標。
  contains()內容相同就返回true  iterator() size()

LinkedHashSet:

HashSet的子類,只有四個新增的構造器,沒有其他新增方法,內部維護的是LinkedHashMap的一個例項,是雙向連結串列結構。
  元素存放順序和迭代順序一樣(按順序)。
  常用方法同HashSet。

TreeSet:

   確保元素處於排序狀態,底層為樹結構。使用它可以從Set中提取有序的序列。

   兩種排序方法:自然排序和定製排序,預設採用自然排序。
   自然排序:會呼叫集合元素的comparaTo(物件)方法來比較元素之間的大小關係,然後把集合按升序排列(實現 Comparable介面)。
   定製排序:通過Comparator(比較器)介面,需要重寫compara(物件,物件),要實現定製排序,需要把comparator例項作為形 參傳給TreeSet的構造器。
   要想把元素放到TreeSet中,必須實現Comparable介面,同時必須實現comparaTo方法。
   或者繼承Comparator介面,然後重寫compara方法。
   first() last()lower(物件) heigher(物件) 其他檢視方法。

4.2 Map集合:

維護"鍵值對"的關聯性
  key,value 必須都為引用型別資料
  key不可以重複(後覆蓋先),儲存在Set集合中(因為Set集合裡面的元素不能重複,所以,,還必須重寫equals和hashCode()方法),經常用String,因為都已經實現
  put(key,value) remove(key) putAll(Map map) clear()清除所有 。(基本全是通過Set,也就是key,唯一性)。


 獲取key的集合:
     Set<> set= map.keySet();Iterator<> it=set.iterator();get(key) 迭代器。


 獲取value的集合:
      Collection values() 迭代器,增強for都可以。


   Entry集合:
     Set<Entry<,>> entrys = map.entrySet();
     for(Entry<String,String> entry : entrys)迭代器,增強for都可以
     get(key) containsKey(key) containsValue(value) size isEmpty() equals()比較的當然是內容啦

4.2.1 HashMap:

 允許key和value的值為null。
  表現是無序的 比較key相等和Set一樣。
  LinkedHashMap:子類,有序的(等同上面的HashSet和LinkedHashSet)只比HashMap慢一點。而在迭代訪問時發而更快,因為它使用連結串列維護內部次序。

4.2.2 TreeMap:

有序。 基於紅黑樹資料結構的實現。檢視"鍵"或"鍵值對"時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。

4.2.3 HashTable:

   最古老,不允許key和value值為null

Properties:

  是HashTable的子類,用來處理檔案的屬性。
  檔案屬性必須是key_value,必須都是字串,存取資料用put(key,value),get(key)。

4.3 Collections:

  集合操作類
  排序:
  Collections.reverse(list) 反序
  Collections.shuffle()隨機
  Collections.sort()自然順序升序
  Collections.swap(物件,位置,位置)交換
  查詢:
  max()
  min()frequency(Collections,物件);
  copy(目標list,srclist)
  Collections.repalceAll(list,old物件,new物件)

  synchronizedXXX();
  synchronizedList(list)

4.4 總結:         

       1.執行緒安全的是vertor和HashTable。
       2. List:允許重複的,全部有序(允許null)。
  3.Set: HashSet無序的表現(一個null),其中HashSet的子類LinkedHashSet有序,TreeSet有序。
  4.Map:HashMap無序的表現(一次null),其中HashMap的子類LinkedHashMap有序,TreeMap有序,HashTable無序(不能為null)。

  5.ArrayList:查詢效率高,增刪效率低。
  6.LinkedList:查詢效率低,增刪效率高。
  7.Vertor:執行效率非常低。

  8.HashSet:良好的增刪查詢效能。
  9.LinkedHashSet:查詢效率低,插入效率比HashSet低。

  10.Map物件高於List。因為Map除了Value外還需要一個Object的Key,從而增大了Map的容量。

     11. HashSet,HashMap的元素都是無序的,而他們的子類都是有序的,雙向連結串列,非常類似,因為HashMap中的唯一的約束就是key,而 key恰恰是被HashMap維護的
       12.TreeSet和TreeMap都是有序的,兩個很類似。

       13. 如果Map知道了Key,List知道了index,其效能在一百萬條資料中無多大差別。

   14.List按物件進入的順序儲存物件,不做排序或編輯操作。Set對每個物件只接受一次,並使用自己內部的排序方法(通常,你只關心某個元素是否屬於 Set,而不關心它的序否則應該使用List)。Map同樣對每個元素儲存一份,但這是基於"鍵"的,Map也有內建的排序,因而不關心元素新增的 順序。如果新增元素的順序對你很重要,應該使LinkedHashSet或者LinkedHashMap。

      15.HashMap就是使用物件的hashCode()進行快速查詢的。此方法能夠顯著提高效能。