1. 程式人生 > >Java當中的集合框架Map

Java當中的集合框架Map

標題圖

簡書作者:達叔小生

Java當中的集合框架Map

01

Map提供了三個集合檢視:

  1. 鍵集
  2. 值集
  3. 鍵-值 對映集
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集合中的特點:

  1. 內部儲存的模式是以鍵-值對的形式
  2. 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

集合框架Map.png

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 集合類

最常用的集合類就是ListMapList的實現類包括ArrayListVector,可以變大小的列表,適合構建,儲存,和操作任何型別物件元素的列表。

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 點贊