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の関係です.例えば、ナンバープレートです. :家 夫:奥さん
二列集合
一般的な方法
追加:
このケースではHashMapを用いて,学生の名前と年齢のマッピング関係を確立した.重複するキーを追加しようとします.
削除:
取得:
判断:
Mapを巡る方法:
1つ目の方法:keySetの使用
MapをSetコレクション(keySet()に変換し、Setの各要素(Iterator)がMapコレクションのすべてのキーであることをSetの反復器で取り出し、getメソッドでキーに対応する値を取得します.
2つ目の方法: valuesですべての値を取得し、keyオブジェクトを取得できません.
3つ目の方法:Map.Entry
public static interface Map.Entry
Map.Entryオブジェクトが格納されているSetセットは、MapのentrySet()メソッドによって取得されます.
Set> entrySet()
オブジェクト向けのアイデアmapコレクションのキーと値マッピング関係をオブジェクトにパッケージ化するのがMap.Entryです
を選択して、オブジェクトをSetコレクションに格納します.Map.Entryはオブジェクトです.このオブジェクトにはgetKeyがあり、getValueはキーと値を取得します.
二、HashMap
下位層はハッシュテーブルデータ構造であり,スレッドは同期せずnullキー,null値を格納できる.キーの一意性を保証するにはhashCodeメソッドとequalsメソッドを上書きする必要があります.
ケース:Mapのキーとしてオブジェクトをカスタマイズします.
三、TreeMap
TreeMapのソートで、TreeMapはセット内のキーをソートできます.キーのソート方法
方法一:要素自体が比較性を備えている
TreeSetと同様の原理では,キー位置に格納されたオブジェクトにComparableインタフェースを実装させ,comparareToメソッドを書き換えること,すなわち要素自体に比較性を持たせることが必要であり,この方式を要素の自然ソートと呼び,デフォルトソートと呼ぶ.
方式二:容器は比較性を備えている
要素自体が比較性を備えていない場合、または自身が備える比較性が必要でない場合.この場合、容器自体を備えることができる.クラス実装インタフェースComparatorを定義し、comparareメソッドを書き換え、そのインタフェースのサブクラスインスタンスオブジェクトをパラメータとしてTreeMapセットの構築方法に渡す必要があります.
注意:Comparable比較方式とComparator比較方式が同時に存在する場合、Comparatorの比較方式が主である.
注意:compareToまたはcompareメソッドを書き換える場合、比較の主な条件が等しい場合は副次的な条件を比較する必要があります.(仮に名前と年齢が同じ人が同じ人であったとしても、その人を年齢の大きさで並べ替えたい場合は、同じ人であればどのように対処すればよいのでしょうか?名前が違う可能性があると直接return 0はできません(年齢が同じ名前が違う人は違う人です).この場合は副次的な条件判断が必要です(名前を判断する必要があります),名前と年齢が同じでなければ0を返すことができない.
return 0により一意性を判断する.
カスタム要素のソート
注意:Setの要素は繰り返してはいけなくて、Mapのキーは繰り返してはいけなくて、もし繰り返しの要素を保存するならばどのように処理します
Set要素重複要素はaddメソッドに格納できずfalseを返す
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の繰り返し健は古いキーを上書きし、古い値を返します.