天天看點

Map總結

Map:一次添加一對元素。Collection 一次添加一個元素。

        Map也稱為雙列集合,Collection集合稱為單列集合。

        其實map集合中存儲的就是鍵值對。

        map集合中必須保證鍵的唯一性

常用方法:

1,添加。

        value put(key,value):傳回前一個和key關聯的值,如果沒有傳回null.

2,删除。

        void  clear():清空map集合。

        value remove(key):根據指定的key翻出這個鍵值對。

3,判斷。

        boolean containsKey(key):

        boolean containsValue(value):

        boolean isEmpty();

4,擷取。

        value get(key):通過鍵擷取值,如果沒有該鍵傳回null。

                                           當然可以通過傳回null,來判斷是否包含指定鍵。

        int size(): 擷取鍵值對的個數。

例:

        public static void main(String[] args) {

                 Map<Integer,String> map = new HashMap<Integer,String>();

method(map);

                 method_2(map);

        }

        public static void method_2(Map<Integer,String> map){

                 map.put(8,"zhaoliu");

                 map.put(2,"zhaoliu");

                 map.put(7,"xiaoqiang");

                 map.put(6,"wangcai");

                 Collection<String> values = map.values();

                 Iterator<String> it2 = values.iterator();

                 while(it2.hasNext()){

                         System.out.println(it2.next());

                 }

                 /*

                  * 第一種周遊Map集合

                  * 通過Map轉成set就可以疊代。

                  * 找到了另一個方法。entrySet。

                  * 該方法将鍵和值的映射關系作為對象存儲到了Set集合中,而這個映射關系的類型就是Map.Entry類型(結婚證)

                  */

                 Set<Map.Entry<Integer, String>> entrySet = map.entrySet();

                 Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();

                 while(it.hasNext()){

                         Map.Entry<Integer, String> me = it.next();

                         Integer key = me.getKey();

                         String value = me.getValue();

                         System.out.println(key+"::::"+value);

                 //第二種周遊Map集合的方法

                 //取出map中的所有元素。

                 //原理,通過keySet方法擷取map中所有的鍵所在的Set集合,在通過Set的疊代器擷取到每一個鍵,

                 //在對每一個鍵通過map集合的get方法擷取其對應的值即可。

                 Set<Integer> keySet = map.keySet();

                 Iterator<Integer> it = keySet.iterator();

                         Integer key = it.next();

                         String value = map.get(key);

                         System.out.println(key+":"+value);

public static void method(Map<Integer,String> map){//學号和姓名

                 // 添加元素。

                 System.out.println(map.put(8, "wangcai"));//null

                 System.out.println(map.put(8, "xiaoqiang"));//wangcai 存相同鍵,值會覆寫。

                 map.put(2,"zhangsan");

                 map.put(7,"zhaoliu");

                 //删除。

                 System.out.println("remove:"+map.remove(2));

                 //判斷。

                 System.out.println("containskey:"+map.containsKey(7));

                 //擷取。

                 System.out.println("get:"+map.get(6));

                 System.out.println(map);

                 Outer.Inner.show();

Map常用的子類:

        |--Hashtable :内部結構是哈希表,是同步的。不允許null作為鍵,null作為值。

                 |--Properties:用來存儲鍵值對型的配置檔案的資訊,可以和IO技術相結合。

        |--HashMap : 内部結構是哈希表,不是同步的。允許null作為鍵,null作為值。

        |--TreeMap : 内部結構是二叉樹,不是同步的。可以對Map集合中的鍵進行排序。

例1、:HashMap應用舉例:

public  class Person {

        public int hashCode() {

                 final int prime = 31;

                 int result = 1;

                 result = prime * result + age;

                 result = prime * result + ((name == null) ? 0 : name.hashCode());

                 return result;

注:舉例中的Person對象有存在重複的,但是Person如果沒有實作hashCode()和equals(Object obj)這兩個方法,就無法比較出對象的hash值相等,是以會在結果中看到兩個相同的結果,如果實作這兩個方法就可以比較對象是否相等,如果相等則覆寫原來的對象的值。實作這兩個對象的方法:Source->Generate hashCode() and equals() 然後在選擇要比較的屬性

        public boolean equals(Object obj) {

                 if (this == obj)

                         return true;

                 if (obj == null)

                         return false;

                 if (getClass() != obj.getClass())

                 Person other = (Person) obj;

                 if (age != other.age)

                 if (name == null) {

                         if (other.name != null)

                                  return false;

                 } else if (!name.equals(other.name))

                 return true;

        private String name;

        private int age;

        public Person() {

                 super();

        public  String  getName() {

                 return name;

        public int getAge() {

                 return age;

        public Person(String name, int age) {

                 this.name = name;

                 this.age = age;

}

import java.util.HashMap;

import java.util.Iterator;

public class ThreadDemo {

                 HashMap<Person, String> hMap = new HashMap<Person, String>();

                 hMap.put(new Person("lisi", 23), "北京");

                 hMap.put(new Person("zhaolliu", 45), "上海");

                 hMap.put(new Person("xiaoqiang", 56), "北京");

                 hMap.put(new Person("wangcai", 21), "大連");

                 Iterator<Person> it = hMap.keySet().iterator();

                 while (it.hasNext()) {

                         Person key = it.next();

                         String value = hMap.get(key);

                         System.out.println(key.getName() + ":" + key.getAge() + "---"

                                           + value);

例2、TreeMap使用。

package aaa;

public class Student extends Person {

        public Student() {

        public Student(String name, int age) {

                 super(name, age);

import java.util.TreeMap;

                 TreeMap<Student, String> hMap = new TreeMap<Student, String>(new ComparetorByName());

                 hMap.put(new Student("lisi", 23), "北京");

                 hMap.put(new Student("zhaolliu", 45), "上海");

                 hMap.put(new Student("xiaoqiang", 56), "北京");

                 hMap.put(new Student("wangcai", 21), "大連");

                 hMap.put(new Student("lisi", 23), "東京");

                 Iterator<Student> it = hMap.keySet().iterator();

輸出結果:

lisi:23---東京

wangcai:21---大連

xiaoqiang:56---北京

zhaolliu:45---上海

例3、LinkedHashMap使用舉例

import java.util.LinkedHashMap;

import java.util.Map;

import java.util.Set;

        LinkedHashMap<Integer, String> linkedHashMap=new LinkedHashMap<>();

        linkedHashMap.put(2, "sd");

        linkedHashMap.put(3, "qwdsa");

        linkedHashMap.put(1, "dfsd");

        linkedHashMap.put(9, "sewq");

        Iterator<Map.Entry<Integer, String>> iterator=linkedHashMap.entrySet().iterator();

        while (iterator.hasNext()) {

                 Map.Entry<Integer, String> mEntry=iterator.next();

                 Integer keyInteger=mEntry.getKey();

                 String valueString=mEntry.getValue();

                                  System.out.println(keyInteger+":"+valueString);

2:sd

3:qwdsa

1:dfsd

9:sewq

結果是有序的

練習:"fdgavcbsacdfs" 擷取該字元串中,每一個字母出現的次數。

/*

* 練習:

* "fdgavcbsacdfs" 擷取該字元串中,每一個字母出現的次數。

* 要求列印結果是:a(2)b(1)...;

* 思路:

* 對于結果的分析發現,字母和次數之間存在着映射的關系。而且這種關系很多。

* 很多就需要存儲,能存儲映射關系的容器有數組和Map集合。

* 關系一方式有序編号嗎?沒有!

* 那就是使用Map集合。 又發現可以保證唯一性的一方具備着順序如 a b c ...

* 是以可以使用TreeMap集合。

* 這個集合最終應該存儲的是字母和次數的對應關系。

* 1,因為操作的是字元串中的字母,是以先将字元串變成字元數組。

* 2,周遊字元數組,用每一個字母作為鍵去查Map集合這個表。

* 如果該字母鍵不存在,就将該字母作為鍵 1作為值存儲到map集合中。

* 如果該字母鍵存在,就将該字母鍵對應值取出并+1,在将該字母和+1後的值存儲到map集合中,

* 鍵相同值會覆寫。這樣就記錄住了該字母的次數.

* 3,周遊結束,map集合就記錄所有字母的出現的次數。oy.

*/

        /**

         * @param args

         */

                 String str = "fdg+avAdc  bs5dDa9c-dfs";

                 String s = getCharCount(str);

                 System.out.println(s);

        public static String getCharCount(String str) {

                 //将字元串變成字元數組

                 char[] chs = str.toCharArray();

                 //定義map集合表。

                 Map<Character,Integer> map = new TreeMap<Character,Integer>();

                 for (int i = 0; i < chs.length; i++) {

                         if(!(chs[i]>='a' && chs[i]<='z' || chs[i]>='A' && chs[i]<='Z'))

                                  continue;

                         //将數組中的字母作為鍵去查map表。                      

                         Integer value = map.get(chs[i]);

                         map.put(chs[i], value==null?1:value+1);                        

                 return mapToString(map);

        private static String mapToString(Map<Character, Integer> map) {

                 StringBuilder sb = new StringBuilder();

                 Iterator<Character> it = map.keySet().iterator();

                         Character key = it.next();

                         Integer value = map.get(key);

                         sb.append(key+"("+value+")");

                 return sb.toString();