Map集合
Map集合是雙列集合膜楷, 是一種一一對應(yīng)關(guān)系棺滞,就是映射蝌戒,Java提供 java,util.Map接口供我們使用设凹。
Map集合常用子類
我們最常用的是HashMap和LinkedHashMap
- HashMap<K, V> :存儲數(shù)據(jù)采用的哈希表結(jié)構(gòu)贸街, 元素存儲的順序不能保證一致庵寞, 由于要保證鍵的唯一、不重復(fù)匾浪,需要重寫鍵的hashCode()方法皇帮、equals方法()。
Map接口常用方法
- public V put(K key, V value); 把指定的鍵和值添加到集合中
- public V get(Object key); 根據(jù)鍵獲取對應(yīng)的值
- public V remove(Object key); 根據(jù)鍵刪除對應(yīng)的值蛋辈,返回被刪除元素的值
- public boolean containsKey(Object key)属拾;判斷集合中是否包含指定的鍵
public class Demo {
public static void main(String[] args) {
// 創(chuàng)建map對象
HashMap<String, String> map = new HashMap<>();
map.put("呂布", "貂蟬");
map.put("孫策", "大喬");
map.put("周瑜", "二喬");
map.put("劉備", "甘夫人");
// 如果put時(shí)間存在,那么會覆蓋之前的值
map.put("劉備", "孫尚香");
System.out.println(map);
// 訪問
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() 冷溶;獲取所有鍵渐白,存儲到set集合中
public class Demo2 {
public static void main(String[] args) {
// 創(chuàng)建map對象
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 + "是一對");
}
}
}
Entry鍵值對象
Map中兩種對象, 一種key逞频,一種是value纯衍,這一對對象又稱做Map中的一個(gè)Entry項(xiàng)
Entry將鍵值對的對應(yīng)關(guān)系封裝成了對象, 這樣遍歷Map時(shí), 這樣我們可以從每一個(gè)鍵值對(Entry)對象中獲取對應(yīng)的鍵與對應(yīng)的值苗胀。
- public Set<Map.Entry<K,V>> entrySet()襟诸;獲取所有的鍵值對的set集合
- K getKey(); 獲取Entry對象中的鍵
- V getValue();獲取Entry對象中的值
public class Demo3 {
public static void main(String[] args) {
// 創(chuàng)建map對象
HashMap<String, String> map = new HashMap<>();
map.put("呂布", "貂蟬");
map.put("孫策", "大喬");
map.put("周瑜", "二喬");
map.put("劉備", "甘夫人");
// 獲取所有的entry對象
Set<Map.Entry<String, String>> entrySet = map.entrySet();
// 遍歷每一個(gè)entry對象
for(Map.Entry<String, String> entry : entrySet){
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"="+value);
}
}
}
HashMap存儲自定義類型鍵值
需求:學(xué)生對象作為鍵,家庭地址作為值基协,存入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);
}
}
測試
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("王天來", 25), "營口");
map.put(new Student("王天來", 25), "營口");
// 遍歷
for (Student key:map.keySet()){
String val = map.get(key);
System.out.println(key + "....."+val);
}
}
}
- 當(dāng)HashMap中存放自定義對象是, 如果自定義對象作為key存在澜驮, 要保證對象唯一陷揪,必須重寫對象的equals方法和hasCode()方法。