Java Mapコレクションの詳細

12795 ワード

一、Map
とりあえずMapについてお話ししましょう~
プログラムに数百万人の学生が格納されており、学生を検索するために学号を使用する必要がある場合、この需要の有効なデータ構造はMapです.
Mapはキー(key)に従って要素を格納する容器で、キー(key)は下付き文字に似ており、リストには下付き文字は整数である.Mapでキーを押すと、任意のタイプのオブジェクトを使用できます.Mapには重複するキー(Key)は使用できません.各キーには対応する値(value)があります.
1つのキー(key)とそれに対応する値はmapセットの要素を構成する.
Mapの要素は2つのオブジェクトで、1つのオブジェクトがキー、1つのオブジェクトが値です.キーは繰り返してはいけませんが、値は繰り返してもいいです.
最上位の共通性の方法を見てサブクラス特有のオブジェクトを探す.
MapとCollectionは集合フレームワークで並列に存在する
Mapはキー値ペアを格納しています
Mapストレージ要素はputメソッド、Collectionはaddメソッドを使用
Mapコレクションは、要素を直接取り出す方法ではなく、先にSetコレクションに移行し、反復によって要素を取得します.
Mapコレクション内のキーは一意性を保証する
つまりCollectionは単列集合,Mapは二列集合である.
まとめ: 
Mapは一度に1対の要素を保存し、Collectionは一度に1つ保存します.Mapのキーは重複せず、一意であることを保証します.
Mapは一度に1対の要素を保存して、キーの値の対の形式で存在します.キーと値はマッピング関係があります.必ずキーの一意性を保証します.
apiドキュメントを表示するには、次の手順に従います.
interface Map
K-このマッピングによって維持されるキーのタイプ
V-マップ値のタイプ
コンセプト
キーを値のオブジェクトにマップします.1つのマッピングに重複するキーを含めることはできません.各キーは最大1つの値にしかマッピングできません.
特長
KeyとValueは1対1の関係です.例えば、ナンバープレートです. :家  夫:奥さん
二列集合
Map    :
 ---| Map                 。            ;             。
			---| HashMap         ,    
            ---| TreeMap           

---|Hashtable:
          ,      ,     null ,null 。
    , HashMap   。
---|HashMap:
          ,       ,    null ,null 。
        ,    hashCode  , equals  。
---| LinkedHashMap:
              。  Map          。
---|TreeMap:
          。   map         。    Comparable  Comparator       。return 0,        。

一般的な方法
1、  :
	1、V put(K key, V value)    (     key ,     value   
    ,       ,       null)                                          
	2、putAll(Map extends K,? extends V> m)              
        (    )。
2、  
	1、remove()          ,  key  
	2、clear()           
3、  
     1:value get(key);               。           , 
   null。

3、  :
	1、boolean isEmpty()      0  true  false
    2、boolean containsKey(Object key)              key
3、boolean containsValue(Object value)              value
4、  :
Int size()

追加:
このケースではHashMapを用いて,学生の名前と年齢のマッピング関係を確立した.重複するキーを追加しようとします.
public class Demo1 {
	public static void main(String[] args) {
		//     Map     
		Map map1 = new HashMap();
		map1.put("jack", 20);
		map1.put("rose", 18);
		map1.put("lucy", 17);
		map1.put("java", 25);
		System.out.println(map1);
		//        (   ),        (   )  ,		 System.out.println(map1.put("jack", 30)); //20
		       
		Map map2 = new HashMap();
		map2.put("   ", 100);
		map2.put("  ", 20);
		System.out.println("map2:" + map2);
//                     。
		map1.putAll(map2);
		System.out.println("map1:" + map1);
         //
	}
}

削除:
//   :
		// remove()       ,  key  
		// clear()       

		Map map1 = new HashMap();
		map1.put("jack", 20);
		map1.put("rose", 18);
		map1.put("lucy", 17);
		map1.put("java", 25);
		System.out.println(map1);				
//   key,            。
		System.out.println("value:" + map1.remove("java"));
		map1.clear();
		System.out.println("map1:" + map1);

取得:
//   :
		// V get(Object key)      key    value  
		// int size()        
		Map map1 = new HashMap();
		map1.put("jack", 20);
		map1.put("rose", 18);
		map1.put("lucy", 17);
		map1.put("java", 25);
		System.out.println(map1);
		// V get(Object key)      key    value  
		// int size()        
		System.out.println("value:" + map1.get("jack"));
		System.out.println("map.size:" + map1.size());

判断:
//   :
		// boolean isEmpty()    0  true  false
		// boolean containsKey(Object key)             key
		// boolean containsValue(Object value)

		Map map1 = new HashMap();
		map1.put("jack", 20);
		map1.put("rose", 18);
		map1.put("lucy", 17);
		map1.put("java", 25);
		System.out.println(map1);
		System.out.println("isEmpty:" + map1.isEmpty());
		System.out.println("containskey:" + map1.containsKey("jack"));
		System.out.println("containsvalues:" + map1.containsValue(100));

Mapを巡る方法:
1、 map            set  。
		Set keySet()        key   Set  
                                get         。
2、 values() ,      .
		Collection values()     key  
3、 Map.Entry             
		Set> entrySet()
 map                  
Map.Entry    Map.Entry    getKey,
getValue      。

1つ目の方法:keySetの使用
MapをSetコレクション(keySet()に変換し、Setの各要素(Iterator)がMapコレクションのすべてのキーであることをSetの反復器で取り出し、getメソッドでキーに対応する値を取得します.
public class Demo2 {
	public static void main(String[] args) {
		Map map = new HashMap();
		map.put(1, "aaaa");
		map.put(2, "bbbb");
		map.put(3, "cccc");
		System.out.println(map);

		//
		//     :
		//      :   keySet
		//       key value,         
		// Set keySet()      key   Set  

		Set ks = map.keySet();
		Iterator it = ks.iterator();
		while (it.hasNext()) {
			Integer key = it.next();
			String value = map.get(key);
			System.out.println("key=" + key + " value=" + value);
		}
	}
}

2つ目の方法: valuesですべての値を取得し、keyオブジェクトを取得できません.
public static void main(String[] args) {
		Map map = new HashMap();
		map.put(1, "aaaa");
		map.put(2, "bbbb");
		map.put(3, "cccc");
		System.out.println(map);
//      :
		//   values      ,     key  
		// Collection values()

		Collection vs = map.values();
		Iterator it = vs.iterator();
		while (it.hasNext()) {
			String value = it.next();
			System.out.println(" value=" + value);
		}
}

3つ目の方法:Map.Entry
public static interface Map.Entry
Map.Entryオブジェクトが格納されているSetセットは、MapのentrySet()メソッドによって取得されます.
Set> entrySet()
オブジェクト向けのアイデアmapコレクションのキーと値マッピング関係をオブジェクトにパッケージ化するのがMap.Entryです
を選択して、オブジェクトをSetコレクションに格納します.Map.Entryはオブジェクトです.このオブジェクトにはgetKeyがあり、getValueはキーと値を取得します.
public static void main(String[] args) {
		Map map = new HashMap();
		map.put(1, "aaaa");
		map.put(2, "bbbb");
		map.put(3, "cccc");
		System.out.println(map);
		//      : Map.Entry          
		// Set> entrySet()
		

		//    Map.Entry   Set   Map.Entry   key value  
		Set> es = map.entrySet();

		Iterator> it = es.iterator();

		while (it.hasNext()) {
			
			//        key value   Map.Entry  
			Map.Entry en = it.next();

			//   Map.Entry      key value  
			Integer key = en.getKey();
			String value = en.getValue();

			System.out.println("key=" + key + " value=" + value);
		}
	}

二、HashMap
下位層はハッシュテーブルデータ構造であり,スレッドは同期せずnullキー,null値を格納できる.キーの一意性を保証するにはhashCodeメソッドとequalsメソッドを上書きする必要があります.
ケース:Mapのキーとしてオブジェクトをカスタマイズします.
public class Demo3 {
	public static void main(String[] args) {
		HashMap hm = new HashMap();
		hm.put(new Person("jack", 20), "1001");
		hm.put(new Person("rose", 18), "1002");
		hm.put(new Person("lucy", 19), "1003");
		hm.put(new Person("hmm", 17), "1004");
		hm.put(new Person("ll", 25), "1005");
		System.out.println(hm);
		System.out.println(hm.put(new Person("rose", 18), "1006"));

		Set> entrySet = hm.entrySet();
		Iterator> it = entrySet.iterator();
		while (it.hasNext()) {
			Entry next = it.next();
			Person key = next.getKey();
			String value = next.getValue();
			System.out.println(key + " = " + value);
		}
	}
}

class Person {
	private String name;
	private int age;

	Person() {

	}

	public Person(String name, int age) {

		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public int hashCode() {

		return this.name.hashCode() + age * 37;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Person) {
			Person p = (Person) obj;
			return this.name.equals(p.name) && this.age == p.age;
		} else {
			return false;
		}
	}

	@Override
	public String toString() {

		return "Person@name:" + this.name + " age:" + this.age;
	}

}
}

三、TreeMap
TreeMapのソートで、TreeMapはセット内のキーをソートできます.キーのソート方法
方法一:要素自体が比較性を備えている
TreeSetと同様の原理では,キー位置に格納されたオブジェクトにComparableインタフェースを実装させ,comparareToメソッドを書き換えること,すなわち要素自体に比較性を持たせることが必要であり,この方式を要素の自然ソートと呼び,デフォルトソートと呼ぶ.
方式二:容器は比較性を備えている
要素自体が比較性を備えていない場合、または自身が備える比較性が必要でない場合.この場合、容器自体を備えることができる.クラス実装インタフェースComparatorを定義し、comparareメソッドを書き換え、そのインタフェースのサブクラスインスタンスオブジェクトをパラメータとしてTreeMapセットの構築方法に渡す必要があります.
注意:Comparable比較方式とComparator比較方式が同時に存在する場合、Comparatorの比較方式が主である.
注意:compareToまたはcompareメソッドを書き換える場合、比較の主な条件が等しい場合は副次的な条件を比較する必要があります.(仮に名前と年齢が同じ人が同じ人であったとしても、その人を年齢の大きさで並べ替えたい場合は、同じ人であればどのように対処すればよいのでしょうか?名前が違う可能性があると直接return 0はできません(年齢が同じ名前が違う人は違う人です).この場合は副次的な条件判断が必要です(名前を判断する必要があります),名前と年齢が同じでなければ0を返すことができない.
return 0により一意性を判断する.
public class Demo4 {
	public static void main(String[] args) {
		TreeMap tree = new TreeMap();
		tree.put("  ", 19);
		tree.put("  ", 20);
		tree.put("  ", 21);
		tree.put("  ", 22);
		tree.put("  ", 23);
		tree.put("  ", 24);
		System.out.println(tree);
		System.out.println("  ".compareTo("  "));//-2094
	}
}

カスタム要素のソート
public class Demo3 {
	public static void main(String[] args) {
		TreeMap hm = new TreeMap(
				new MyComparator());
		hm.put(new Person("jack", 20), "1001");
		hm.put(new Person("rose", 18), "1002");
		hm.put(new Person("lucy", 19), "1003");
		hm.put(new Person("hmm", 17), "1004");
		hm.put(new Person("ll", 25), "1005");
		System.out.println(hm);
		System.out.println(hm.put(new Person("rose", 18), "1006"));

		Set> entrySet = hm.entrySet();
		Iterator> it = entrySet.iterator();
		while (it.hasNext()) {
			Entry next = it.next();
			Person key = next.getKey();
			String value = next.getValue();
			System.out.println(key + " = " + value);
		}
	}
}

class MyComparator implements Comparator {

	@Override
	public int compare(Person p1, Person p2) {
		if (p1.getAge() > p2.getAge()) {
			return -1;
		} else if (p1.getAge() < p2.getAge()) {
			return 1;
		}
		return p1.getName().compareTo(p2.getName());
	}

}

class Person implements Comparable {
	private String name;
	private int age;

	Person() {

	}

	public Person(String name, int age) {

		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public int hashCode() {

		return this.name.hashCode() + age * 37;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Person) {
			Person p = (Person) obj;
			return this.name.equals(p.name) && this.age == p.age;
		} else {
			return false;
		}
	}

	@Override
	public String toString() {

		return "Person@name:" + this.name + " age:" + this.age;
	}

	@Override
	public int compareTo(Person p) {

		if (this.age > p.age) {
			return 1;
		} else if (this.age < p.age) {
			return -1;
		}
		return this.name.compareTo(p.name);
	}

}

 
注意:Setの要素は繰り返してはいけなくて、Mapのキーは繰り返してはいけなくて、もし繰り返しの要素を保存するならばどのように処理します
Set要素重複要素はaddメソッドに格納できずfalseを返す
Mapの繰り返し健は古いキーを上書きし、古い値を返します.