Java當中的集合框架Map
簡書作者:達叔小生
Java當中的集合框架Map
01
Map
提供了三個集合檢視:
- 鍵集
- 值集
- 鍵-值 對映集
public String getWeek(int num){
if(num<0 || num>7){
throw new NoWeekException(num+"沒有對應的星期");
String[] weeks = {"","星期一"...."星期日"};
return weeks[num];
}
}
Sunday
(星期天)、Monday
(星期一)、Tuesday
(星期二)、Wednesday
Thursday
(星期四)、Friday
(星期五)、Saturday
(星期六)
java.util
介面 Map<K,V>
引數:
K為此對映的鍵
V為此對映的值
知道的子介面:
Bindings,ConcurrentMap<K,V>,ConcurrentNavigableMap<K,V>,LogicalMessageContext,MessageContext,NavigableMap<K,V>,SOAPMessageContext,SorteMap<K,V>
知道的實現類:
AbstractMap,Attributes,AuthProvider,ConcurrentHashMap,ConcurrentSkipListMap,EnumMap,HashMap,Hashtable,IdentityHashMap,LinkedHashMap,PrinterStateReasons,Properties,Provider,RenderingHints,SimpleBindings,TabularDataSupport,TreeMap,UIDefaults,WeakHashMap
實現的介面:
public interface Map<K,V>
在對映中不能有重複的鍵,每個鍵只能對映在一個值上
在Map
集合中的特點:
- 內部儲存的模式是以鍵-值對的形式
Map
中的鍵要具有唯一性
巢狀類(內部的):
方法 | 說明 |
---|---|
Map.Entry<K,V> | static interface ,靜態 介面,對映模式鍵-值對 |
Map方法:
方法 | 說明 |
---|---|
clear() |
型別為void ,在對映中移除所有的對映關係 |
containsKey(Object key) |
返回boolean 型別,如果對映中包含指定的鍵的對映關係,返回為true ,反之為false |
containsValue(Object value) |
返回boolean 型別,如果對映中一個或多個鍵對映到指定的值上,返回為true ,反之為false |
entrySet() |
返回型別為Set<Map.Entry<K,V>> 返回此對映中包含的對映關係 |
equals(Object o) |
返回型別為boolean ,比較指定物件與對映是否相等 |
get(Object key) |
返回值,返回指定鍵所對映的值,如果此對映不包含該鍵的對映關係,返回為null ,代表沒有 |
hasCode() |
返回為Int 型別,返回此對映的雜湊碼值 |
isEmpty() |
返回型別為boolean ,如果此對映沒有鍵-值的對映關係,返回為true ,反之為false |
keySet() |
返回型別為Set<E> ,返回此對映中包含的所有鍵的Set 檢視 |
put(K key, V value) |
將對應的鍵與值,建立對映關係,新增對映關係的方法 |
putAll(Map<? extends K, ? extends V> m) |
返回型別為void ,從指定的對映關係中將所有的對映關係複製到此對映中 |
remove(Object key) |
如果存在這個鍵的對映關係就將其移除 |
size() |
返回型別為Int 型別,返回此對映關係中的鍵-值對映關係的數目 |
values() |
返回型別為Collection<V> ,返回此對映中包含的值的Collection 檢視 |
put
V put (E key, V value)
將對應的鍵與值,建立對映關係,新增對映關係的方法,如果之前就有這個對映關係,就會將指定的值替換掉舊的值。
引數:
key
- 為指定的關聯的鍵
value
- 為指定的關聯的值
會丟擲的錯誤:
UnsupportedOperationException:不支援put操作
ClassCastException:不允許用對映關係
NullPointerException:將指定的鍵或者值為null,而此對映卻不允許儲存
IllegalArgumentException:指定的鍵或者值不允許儲存到對映中
一般用的實現類:
HashMap
java.util
類 HashMap<K,V>
java.lang.Object
-> java.util.AbstractMap<K,V>
-> java.util.HashMap<K,V>
引數:
K-為所對應的鍵
V-為所對應的值
已實現的介面:
Serializable,Cloneable,Map<K,V>
已知的子類:
LinkedHashMap,PrinterStateReasons
所以:
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
02
Map
例子:
import java.util.HashMap;
public class MapDemo {
public static void main(String[] args){
// 建立map
Map<String,String> map = new HashMap<String,String>();
// 新增元素
map.put("星期一", "Monday");
mpa.put( ...// 自行新增 );
map.put("星期日", "Sunday");
// 新增元素時,如果鍵相同,值會覆蓋
map.put("星期日", "SundayDemo"); // 值被覆蓋
// 獲取值
String value = map.get("星期日"); // 鍵存在,返回值,反之返回null,為空
// 刪除元素
String s = map.remove("星期日"); // 刪除對應的鍵值對關係,這樣在Map集合中就少了這一對鍵值對
}
}
如何獲取所有的鍵
Map<String,String> map = new HashMap<String,String>();
map.put("星期一", "Monday");
map.put("星期日", "Sunday");
使用keySet
Set<String> keySet = map.keySet();
for(Iterator<String> it = keySet.iterator(); it.hasNext(); ){
String key = it.next();
String value = map.get(key);
System.out.println(key + " : " + value);
}
可以使用foreach
迴圈
for(String key : keySet){
System.out.println(key + " = " + map.get(key));
}
entrySet
Set<Map.Entry<K,V>> entrySet()
作用為返回此對映中包含的對映關係Set
的檢視,將map
集合中對映關係儲存到set
集合中。
對映關係:指鍵和值對應的關係,資料型別Map.Entry
(內部的)關係的型別
Set<Map.Entry<String,String>> entrySet = map.entrySet();
Iterator< Map.Entry<String,String> > it = entrySet.iterator();
while(it.hasNext(K,V)){
Map.Entry<String,String> m = it.next();
// 獲取鍵
String key = m.getKey();
// 獲取值
String value = m.getValue();
System.out.println(key + " : " + value);
}
Map.Entry<K,V>
java.util
介面 Map.Entry<K,V>
介面實現類:
AbstractMap.SimpleEntry , AbstractMap.SimpleImmutableEntry
介面:
public static interface Map.Entry<K,V>
// 為對映項 - 鍵-值 對
Map.Entry<K,V>
方法
方法:
方法 | 說明 |
---|---|
equals(Object o) |
返回型別為boolean ,比較指定物件與此項的相等性 |
getKey() |
返回為此項對應的鍵 |
getValue() |
返回為此項對應的值 |
hashCode() |
返回型別為int ,返回為此項的雜湊碼值 |
setValue(V value) |
用指定的值去換此項對應的值 |
for(Map.Entry<String,String> m : map.entrySet()){
String key = m.getKey();
String value = m.getValue();
System.out.println(key + " : " + value);
}
interface Map{
public static interface Entry();
}
values()
返回型別為Collection<V>
,返回此對映中包含的值的Collection
檢視
Collection<String> values = map.values();
for(String value : values){
System.out.println("value:"+value);
}
總結:
Map -> entrySet() getKey() getValue() -> keySet() get(key) -> values()
03
Hashmap
public class HashMapDemo {
public static void main(String[] args){
Map<Student,String> map = new HashMap<Student,String>();
// 新增元素
map.put(new Student("da",12), "1");
map.put(new Student("shu",13), "2");
map.put(new Student("dashu",14), "3");
// 取出資料
// Set<Student> keySet = map.keySet();
// for(Student key : keySet){}
for(Student key : map.keySet() ){
String value = map.get(key);
System.out.println(key.toString() + " : " + value);
}
}
}
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student(){
super();
}
public Student(String name, int age){
super();
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 int hasCode() {
final int prime = 31;
int result = 1;
result = prime + result + age;
result = prime + result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass() )
return false;
Student other = (Student) obj;
if(age != other.age)
return false;
if(name == null){
if(other.name != null)
return false;
}else if(!name.equals(other.name))
return false;
return true;
}
@Override
public int compareTo(Student o){
int temp = this.age - o.age;
return temp == 0? this.name.compareTo(o.name) : temp;
}
}
TreeMap
public class TreeMapDemo{
public static void main(String[] args){
Map<Student, String> map = new TreeMap<Student, String>(new ComparatorByName());
// 新增元素
map.put(new Student("da",12), "1");
map.put(new Student("shu",13), "2");
map.put(new Student("dashu",14), "3");
// 取出資料
for(Map.Entry<String,String> m : map.entrySet()){
Student key = m.getKey();
String value = m.getValue();
System.out.println(key + " : " + value);
}
}
}
public class ComparatorByName implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2){
int temp = o1.getName().compareTo(o2.getName());
return temp == 0 ? o1.getAge() - o2.getAge() : temp;
}
}
04
例項:
public class CollectionsDemo {
public static void main(String[] args) {
Map m = new HashMap();
m.put("da", "8");
m.put("shu", "9");
m.put("dashu", "10");
m.put("dashucoding", "12");
System.out.println(m);
}
}
Java Map
集合類
最常用的集合類就是List
和Map
,List
的實現類包括ArrayList
和Vector
,可以變大小的列表,適合構建,儲存,和操作任何型別物件元素的列表。
Map
是比較通用的,Map
集合類是用於儲存元素對的,為鍵-值對,每個鍵對映到一個值,從理解上可以將List
看作數值鍵的Map
,但兩者沒有什麼關係。
所有鍵值對 —
entrySet()
所有鍵 —keySet()
值 —values()
Iterator keyValues = map.entrySet().iterator();
Iterator keys = map.keySet().iterator();
Iterator values = map.values().iterator();
entrySet()
:返回 Map
中所包含 對映 的 Set
檢視。
keySet()
:返回 Map
中所包含 鍵 的 Set
檢視。
values()
:返回 Map
中所包含 值 的 Collection
檢視。
往後餘生,唯獨有你
簡書作者:達叔小生
90後帥氣小夥,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書部落格: https://www.jianshu.com/u/c785ece603d1
結語
- 下面我將繼續對 其他知識 深入講解 ,有興趣可以繼續關注
- 小禮物走一走 or 點贊