Map集合
Map集合是雙列集合褐鸥, 是一種一一對(duì)應(yīng)關(guān)系,就是映射悠反,Java提供 java,util.Map接口供我們使用靶瘸。
Map集合常用子類
我們最常用的是HashMap和LinkedHashMap
- HashMap<K, V> :存儲(chǔ)數(shù)據(jù)采用的哈希表結(jié)構(gòu), 元素存儲(chǔ)的順序不能保證一致宇攻, 由于要保證鍵的唯一惫叛、不重復(fù),需要重寫(xiě)鍵的hashCode()方法逞刷、equals方法()嘉涌。
Map接口常用方法
- public V put(K key, V value); 把指定的鍵和值添加到集合中
- public V get(Object key); 根據(jù)鍵獲取對(duì)應(yīng)的值
- public V remove(Object key); 根據(jù)鍵刪除對(duì)應(yīng)的值,返回被刪除元素的值
- public boolean containsKey(Object key)夸浅;判斷集合中是否包含指定的鍵
public class Demo {
public static void main(String[] args) {
// 創(chuàng)建map對(duì)象
HashMap<String, String> map = new HashMap<>();
map.put("呂布", "貂蟬");
map.put("孫策", "大喬");
map.put("周瑜", "二喬");
map.put("劉備", "甘夫人");
// 如果put時(shí)間存在仑最,那么會(huì)覆蓋之前的值
map.put("劉備", "孫尚香");
System.out.println(map);
// 訪問(wèn)
String s = map.get("劉備");
String s2 = map.get("呂布");
System.out.println(s);
System.out.println(s2);
// 刪除
String remove = map.remove("孫策");
System.out.println(remove);
System.out.println(map.containsKey("劉備")); // true
System.out.println(map.containsKey("孫策")); // false
}
}
- public Set<K> keySet() ;獲取所有鍵帆喇,存儲(chǔ)到set集合中
public class Demo2 {
public static void main(String[] args) {
// 創(chuàng)建map對(duì)象
HashMap<String, String> map = new HashMap<>();
map.put("呂布", "貂蟬");
map.put("孫策", "大喬");
map.put("周瑜", "二喬");
map.put("劉備", "甘夫人");
// 獲取所有的鍵
Set<String> keys = map.keySet();
// 遍歷所有的鍵
for(String key : keys){
String val = map.get(key);
System.out.println(key + "和" + val + "是一對(duì)");
}
}
}
Entry鍵值對(duì)象
Map中兩種對(duì)象警医, 一種key,一種是value坯钦,這一對(duì)對(duì)象又稱做Map中的一個(gè)Entry項(xiàng)
Entry將鍵值對(duì)的對(duì)應(yīng)關(guān)系封裝成了對(duì)象预皇, 這樣遍歷Map時(shí), 這樣我們可以從每一個(gè)鍵值對(duì)(Entry)對(duì)象中獲取對(duì)應(yīng)的鍵與對(duì)應(yīng)的值。
- public Set<Map.Entry<K,V>> entrySet()婉刀;獲取所有的鍵值對(duì)的set集合
- K getKey(); 獲取Entry對(duì)象中的鍵
- V getValue();獲取Entry對(duì)象中的值
public class Demo3 {
public static void main(String[] args) {
// 創(chuàng)建map對(duì)象
HashMap<String, String> map = new HashMap<>();
map.put("呂布", "貂蟬");
map.put("孫策", "大喬");
map.put("周瑜", "二喬");
map.put("劉備", "甘夫人");
// 獲取所有的entry對(duì)象
Set<Map.Entry<String, String>> entrySet = map.entrySet();
// 遍歷每一個(gè)entry對(duì)象
for(Map.Entry<String, String> entry : entrySet){
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"="+value);
}
}
}
HashMap存儲(chǔ)自定義類型鍵值
需求:學(xué)生對(duì)象作為鍵吟温,家庭地址作為值,存入map集合中
這里學(xué)生姓名相同并且年齡相同視為同一個(gè)學(xué)生突颊。
public class Student {
private String name;
private int age;
public Student() {
}
public Student(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 String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
測(cè)試
public class TestStudent {
public static void main(String[] args) {
// 創(chuàng)建map
HashMap<Student, String> map = new HashMap<>();
// 添加元素
map.put(new Student("劉能", 34), "錦州");
map.put(new Student("趙四", 23), "葫蘆島");
map.put(new Student("宋小寶", 45), "大連");
map.put(new Student("王天來(lái)", 25), "營(yíng)口");
map.put(new Student("王天來(lái)", 25), "營(yíng)口");
// 遍歷
for (Student key:map.keySet()){
String val = map.get(key);
System.out.println(key + "....."+val);
}
}
}
- 當(dāng)HashMap中存放自定義對(duì)象是鲁豪, 如果自定義對(duì)象作為key存在潘悼, 要保證對(duì)象唯一,必須重寫(xiě)對(duì)象的equals方法和hasCode()方法