Map集合:該集合儲存鍵值對。一對一對往裡存,而且要保證鍵的唯一性
1. 新增:
put(k key,v value)
putAll(Map<? extends k,?extends v>m) 從指定對映中將所有對映關係複製到此對映中(可選操作)。
2. 刪除
clear()
remove(Object key)
3. 判斷
containsValue(Object value)
containKey(Object key)
isEmpty()
4.獲取
get(Object key)
size()
value() 從指定對映中將所有對映關係複製到此對映中(可選操作)。
Map
|---Hashtable
此類實現一個雜湊表,該雜湊表將對映到相應的值。不可以存入null值和null鍵。jdk1.0,效率高
為了成功地在雜湊表中儲存和獲取物件,用作鍵的物件必須實現hashCode方法和equals方法.
從Java 2 平臺 v1.2起,此類就被改進以實現Map
介面,使它成為 Java Collections Framework
中的一個成員。不像新的 collection 實現,Hashtable
是同步的,底層是雜湊表資料結構。
|---HashMap 底層表示雜湊表資料結構,允許使用null值和null值,該集合是不同步的。
|---TreeMap :底層是二叉樹結構。執行緒不同步。可以用於給map集合中的鍵進行排序。
和set比較:Set底層就是使用了Map集合。
- <span style="font-size:18px;">import java.io.ObjectOutputStream.PutField;
- import java.util.Collection;
- import java.util.HashMap;
- import java.util.Map;
- public class MapTest {
- public static void main(String[] args){
- Map<String, String> map=new HashMap<String, String>();
- //新增元素,如果出現相同的鍵,那麼後新增的值會覆蓋原有鍵對應值,並put方法會返回被覆蓋的值。
- System.out.println("map:"+map.put("01", "zhang"));
- System.out.println("map:"+map.put("01", "wsufn"));
- map.put("02", "li");
- map.put("03", "sun");
- map.put(null, "hehe");
- map.put(null, null);//
- map.put(null,"woish");
- map.put("04", null);
- map.put("05", null);//只允許存在一個null鍵,可以存在一個或多個null值
- System.out.println(map.containsKey("01"));
- System.out.println("get:"+map.get("03"));
- //可以通過get方法的返回值來判斷一個鍵是否存在
- System.out.println(map);
- Collection<String> coll=map.values();
- // Collection<V> values() 返回此對映所包含的值的 Collection 檢視。
- System.out.println(coll);
- }
- }</span>
map集合的兩種取出方式:
一、Set<k> keySet:將map中所有的鍵存入到Set集合。因為set具備迭代器。
所有可以迭代方式取出所有的鍵,在根據get方法。獲取每一個鍵對應的值。
- <span style="font-size:18px;"> Map集合的取出原理:將map集合轉成set集合。再通過迭代器取出。
- public class MapTest {
- public static void main(String[] args){
- Map<String, String> map=new HashMap<String, String>();
- map.put("02", "li");
- map.put("03", "sun");
- Set<String> keyset= map.keySet();
- // Collection<V> values() 返回此對映所包含的值的 Collection 檢視。
- //有了Set集合,就可以獲取迭代器
- Iterator<String> it=keyset.iterator();
- while (it.hasNext()) {
- String str =(String)it.next();
- String value=map.get(str);//得到key對應的值
- System.out.println("key:"+str);//得到值,而沒有得到鍵
- }
- }
- }</span>
二、Set<Map.Entry<k,v>> entrySet: 將map集合中的對映關係取出,存入到集合中
- public class MapTest {
- public static void main(String[] args){
- Map<String, String> map=new HashMap<String, String>();
- map.put("02", "li");
- map.put("03", "sun");
- Set<Map.Entry<String, String>> entry=map.entrySet();
- Iterator<Map.Entry<String,String>> it=entry.iterator();
- while (it.hasNext()) {
- Map.Entry<String, String> me=it.next();
- String key= me.getKey();
- String value=me.getValue();
- System.out.println("key:"+key+",value:"+value);
- }
- }
- }
註明:Map.Entry()其實Entry也是一個介面,它是Map介面中的一個內部介面。
練習:
因為資料是以鍵值對形式存在的。
所以要使用可以排序的Map集合。TreeMap。
- <span style="font-size:18px;">import java.util.*;
- class A implements Comparator<Student>
- {
- public int compare(Student s1,Student s2)
- {
- int num = s1.getName().compareTo(s2.getName());
- if(num==0)
- return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
- return num;
- }
- }
- class MapTest
- {
- public static void main(String[] args)
- {
- TreeMap<Student,String> tm = new TreeMap<Student,String>(new StuNameComparator());
- map.put("02", "li");
- map.put("03", "sun");
- // 第一種方法:keySet
- Set<Student> keySet=tm.keySet();
- Iterator<String > it=keyset.iterator();
- while(it.hasNext()){
- Student stu=it.next();
- String addr=tm.get(stu);
- System.out.println(stu+".."+addr);
- }
- // 第二種方法: entrySet:
- Set<Map.Entry<Student,String>> entrySet = tm.entrySet();
- Iterator<Map.Entry<Student,String>> it = entrySet.iterator();
- while(it.hasNext())
- {
- Map.Entry<Student,String> me = it.next();
- Student stu = me.getKey();
- String addr = me.getValue();
- System.out.println(stu+":::"+addr);
- }
- }
- }</span>
練習:
"sdfgzxcvasdfxcvdf"獲取該字串中的字母出現的次數。
希望列印結果:a(1)c(2).....
通過結果發現,每一個字母都有對應的次數。說明字母和次數之間都有對映關係。
注意,當發現有對映關係時,可以選擇map集合。因為map集合中存放就是對映關係。
什麼使用map集合呢?
當資料之間存在這對映關係時,就要先想map集合。
思路:
1,將字串轉換成字元陣列。因為要對每一個字母進行操作。
2,定義一個map集合,因為列印結果的字母有順序,所以使用treemap集合。
3,遍歷字元陣列。
將每一個字母作為鍵去查map集合。
如果返回null,將該字母和1存入到map集合中。
如果返回不是null,說明該字母在map集合已經存在並有對應次數。
那麼就獲取該次數並進行自增。,然後將該字母和自增後的次數存入到map集合中。覆蓋呼叫原理鍵所對應的值。
4,將map集合中的資料變成指定的字串形式返回。
- <span style="font-size:18px;">class MapTest
- {
- public static void main(String[] args)
- {
- String s= charCount("wefsdfefdc,sedffe-fsd");
- System.out.println(s);
- }
- public static String charCount(String str)
- {
- char[] chs = str.toCharArray();
- TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
- int count = 0;
- for(int x=0; x<chs.length; x++)
- {
- if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
- continue;
- Integer value = tm.get(chs[x]);
- if(value!=null)
- count = value;
- count++;
- tm.put(chs[x],count);//直接往集合中儲存字元和數字,因為自動裝箱。
- count = 0;
- /*
- if(value==null)
- {
- tm.put(chs[x],1);
- }
- else
- {
- value = value + 1;
- tm.put(chs[x],value);
- }
- */
- }
- StringBuilder sb = new StringBuilder();
- Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
- Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();
- while(it.hasNext())
- {
- Map.Entry<Character,Integer> me = it.next();
- Character ch = me.getKey();
- Integer value = me.getValue();
- sb.append(ch+"("+value+")");
- }
- return sb.toString();
- }
- }</span>