java Map
Map 接口也是一個(gè)非常重要的集合接口, 用于存儲(chǔ)鍵/值對.
Map 中的元素都是成對出現(xiàn)的,鍵值對就想數(shù)組的索引與數(shù)組的內(nèi)容關(guān)系一樣, 將一個(gè)鍵映射到一個(gè)值的對象.
一個(gè)映射不能包含重復(fù)的鍵;每個(gè)鍵最多只能映射到一個(gè)值.
我們可以通過鍵去找到相應(yīng)的值.
key =>(映射) value
value 可以存儲(chǔ)任意類型的對象,我們可以根據(jù)key鍵快速查找value.
Map 中的鍵/值對以Entry類型的對象實(shí)例形式存在.
Map 方法:
| 方法 | 返回值 | 說明 |
|---|---|---|
| clear() | void | 從此映射中一處所用映射關(guān)系(可選操作) |
| containsKey(Object key) | boolean | 如果此映射包含指定鍵的映射關(guān)系,則返回 true |
| containsValue(Object value) | boolean | 如果此映射將一個(gè)或多個(gè)映射到指定值,則返回true |
| entrySet() | Set<Map.Entry<K,V>> | 返回此映射中包含的映射關(guān)系的Set視圖 |
| equals(Object o) | boolean | 比較指定的對象與此映射是否相等 |
| get(Object key) | V | 返回指定鍵所映射的值;如果此映射不包含該鍵的映射關(guān)系,則返回null |
| hashCode() | int | 返回此映射的哈希碼值 |
| isEmpty() | boolean | 如果此映射為包含鍵-值映射關(guān)系,則返回true |
| keySet() | Set<K> | 返回此映射中包含的鍵的Set視圖 |
| put(K key,Vvalue) | V | 將指定的值與此映射中的指定鍵關(guān)聯(lián)(可選操作) |
| putAll(Map<? extends K, ? extends V>m) | void | 從指定映射中將所有映射關(guān)系復(fù)制到此映射中(可選操作) |
| remove(Object key) | V | 如果存在一個(gè)鍵的映射關(guān)系,則將其從此映射中移除(可選操作) |
| size | int | 返回此映射中的鍵-值映射關(guān)系數(shù) |
| values() | Collection<V> | 返回此映射中包含的值的Collection 視圖 |
HashMap 是基于哈希表的Map接口的一個(gè)重要實(shí)現(xiàn)類. HashMap 中的Entry對象是無需排列的,key值和value值都可以為null,但是一個(gè)HashMap 只能有一個(gè)key值為null的映射(key值不可重復(fù))
示例代碼:
// Course.java
public class Course {
public String id;
public String name;
public Course(String id, String name){
this.id = id;
this.name = name;
}
}
// MapTest.java
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class MapTest {
/**
* 用來承裝課程類型對象
*/
public Map<String, Course> courses;
/**
* 在構(gòu)造器中初始化 courses 屬性
* @param args
*/
public MapTest() {
this.courses = new HashMap<String, Course>();
}
/**
* 測試添加:輸入課程 ID,判斷是否被占用
* 若未被占用,輸入課程名稱,創(chuàng)建新課程對象
* 并且添加到 courses 中
* @param args
*/
public void testPut() {
//創(chuàng)建一個(gè) Scanner 對象,用來獲取輸入的課程 ID 和名稱
Scanner console = new Scanner(System.in);
for(int i = 0; i < 3; i++) {
System.out.println("請輸入課程 ID:");
String ID = console.next();
//判斷該 ID 是否被占用
Course cr = courses.get(ID);
if(cr == null){
//提示輸入課程名稱
System.out.println("請輸入課程名稱:");
String name = console.next();
//創(chuàng)建新的課程對象
Course newCourse = new Course(ID,name);
//通過調(diào)用 courses 的 put 方法,添加 ID-課程映射
courses.put(ID, newCourse);
System.out.println("成功添加課程:" + courses.get(ID).name);
}
else {
System.out.println("該課程 ID 已被占用");
continue;
}
}
}
/**
* 測試 Map 的 keySet 方法
* @param args
*/
public void testKeySet() {
//通過 keySet 方法,返回 Map 中的所有鍵的 Set 集合
Set<String> keySet = courses.keySet();
//遍歷 keySet,取得每一個(gè)鍵,在調(diào)用 get 方法取得每個(gè)鍵對應(yīng)的 value
for(String crID: keySet) {
Course cr = courses.get(crID);
if(cr != null){
System.out.println("課程:" + cr.name);
}
}
}
/**
* 測試刪除 Map 中的映射
* @param args
*/
public void testRemove() {
//獲取從鍵盤輸入的待刪除課程 ID 字符串
Scanner console = new Scanner(System.in);
while(true){
//提示輸出待刪除的課程 ID
System.out.println("請輸入要?jiǎng)h除的課程 ID!");
String ID = console.next();
//判斷該 ID 是否對應(yīng)的課程對象
Course cr = courses.get(ID);
if(cr == null) {
//提示輸入的 ID 并不存在
System.out.println("該 ID 不存在!");
continue;
}
courses.remove(ID);
System.out.println("成功刪除課程" + cr.name);
break;
}
}
/**
* 通過 entrySet 方法來遍歷 Map
* @param args
*/
public void testEntrySet() {
//通過 entrySet 方法,返回 Map 中的所有鍵值對
Set<Entry<String,Course>> entrySet = courses.entrySet();
for(Entry<String,Course> entry: entrySet) {
System.out.println("取得鍵:" + entry.getKey());
System.out.println("對應(yīng)的值為:" + entry.getValue().name);
}
}
/**
* 利用 put 方法修改Map 中的已有映射
* @param args
*/
public void testModify(){
//提示輸入要修改的課程 ID
System.out.println("請輸入要修改的課程 ID:");
//創(chuàng)建一個(gè) Scanner 對象,去獲取從鍵盤上輸入的課程 ID 字符串
Scanner console = new Scanner(System.in);
while(true) {
//取得從鍵盤輸入的課程 ID
String crID = console.next();
//從 courses 中查找該課程 ID 對應(yīng)的對象
Course course = courses.get(crID);
if(course == null) {
System.out.println("該 ID 不存在!請重新輸入!");
continue;
}
//提示當(dāng)前對應(yīng)的課程對象的名稱
System.out.println("當(dāng)前該課程 ID,所對應(yīng)的課程為:" + course.name);
//提示輸入新的課程名稱,來修改已有的映射
System.out.println("請輸入新的課程名稱:");
String name = console.next();
Course newCourse = new Course(crID,name);
courses.put(crID, newCourse);
System.out.println("修改成功!");
break;
}
}
public static void main(String[] args) {
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
mt.testRemove();
mt.testModify();
mt.testEntrySet();
}
}
運(yùn)行結(jié)果:
$ javac Course.java MapTest.java
$ java MapTest
請輸入課程 ID:
1
請輸入課程名稱:
語文
成功添加課程:語文
請輸入課程 ID:
1
該課程 ID 已被占用
請輸入課程 ID:
2
請輸入課程名稱:
數(shù)學(xué)
成功添加課程:數(shù)學(xué)
課程:語文
課程:數(shù)學(xué)
請輸入要?jiǎng)h除的課程 ID!
1
成功刪除課程語文
請輸入要修改的課程 ID:
2
當(dāng)前該課程 ID,所對應(yīng)的課程為:數(shù)學(xué)
請輸入新的課程名稱:
英語
修改成功!
取得鍵:2
對應(yīng)的值為:英語