1. 程式人生 > >java集合(二)

java集合(二)

oar 哈希 object 元素 打印 工具 cti 映射 所有

java為數據結構中的映射定義了一個接口java.util.Map,而HashMap Hashtable和TreeMap就是它的實現類。Map是將鍵映射到值的對象,一個映射不能包含重復的鍵;每個鍵最多只能映射一個一個值。

Hashmap 是一個最常用的Map,它根據鍵的HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為Null;HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數據的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力.

Hashtable 與 HashMap類似,但是主要有6點不同。

1.HashTable的方法是同步的,HashMap未經同步,所以在多線程場合要手動同步HashMap這個區別就像Vector和ArrayList一樣。

2.HashTable不允許null值,key和value都不可以,HashMap允許null值,key和value都可以。HashMap允許key值只能由一個null值,因為hashmap如果key值相同,新的key, value將替代舊的。

3.HashTable有一個contains(Object value)功能和containsValue(Object value)功能一樣。 HashMap包含了containsvalue和containsKey 方法,不包含有contains。

4.HashTable使用Enumeration,HashMap使用Iterator。

5.HashTable中hash數組默認大小是11,增加的方式是 old*2+1。HashMap中hash數組的默認大小是16,而且一定是2的指數。

6.哈希值的使用不同,HashTable直接使用對象的hashCode。

TreeMap能夠把它保存的記錄根據鍵排序,默認是按升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的。

TreeMap tmp=new TreeMap();

Iterator iterator_2 
= tmp.keySet().iterator(); while (iterator_2.hasNext()) { Object key = iterator_2.next(); System.out.println(“tmp.get(key) is :”+tmp.get(key));
}

Map集合中HashSet

package HashMap類的常用方法;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
//1.繼承關系        Map接口定義了鍵映射到值的規則,而AbstractMap類提供 Map 接口的骨幹實現。
/*        public class HashMap<K,V>
        extends AbstractMap<K,V>
        implements Map<K,V>, Cloneable, Serializable        
*/
//2.構造函數  涉及到底層原理,暫時不做解釋
/*        HashMap():構造一個具有默認初始容量 (16) 和默認加載因子 (0.75) 的空 HashMap。
        HashMap(int initialCapacity):構造一個帶指定初始容量和默認加載因子 (0.75) 的空 HashMap。
        HashMap(int initialCapacity, float loadFactor):構造一個帶指定初始容量和加載因子的空 HashMap。
*/
//3.實現了Map接口的常用方法
/*      1. Set entrySet()  (返回當前Map中所有的entry對象(Entry對象就包裝了key,values),使用Set存儲起來。)
       2. Set keySet()    返回Map當中所有的key,存儲到一個Set集合當中。
      3. Collection values()    返回所有的values,存儲到一個Collection。什麽返回Collection?
                                因為values 有重復,如果返回Set,就不能含有重復的元素.

      4. Object get(Object key)  通過key查找對應的值。
 */
//舉例:
        Map map = new HashMap();
        map.put(1, "我好");
        map.put(2, "你好");
        map.put(3, "大家好");
        map.put(4, "啦啦啦");
        map.put(5, "麽麽噠");
/*        
        Set set  = map.entrySet();
        System.out.println(set);    // [1=我好, 2=你好, 3=大家好, 4=啦啦啦, 5=麽麽噠]
        
        Set keys = map.keySet();
        System.out.println(keys);  // [1, 2, 3, 4, 5]
        
        Collection col = map.values();
        System.out.println(col);   // [我好, 你好, 大家好, 啦啦啦, 麽麽噠]
        
        Object obj= map.get(5);
        System.out.println(obj);   //麽麽噠
*/        
//5.Map的遍歷方式
/*        前言:  1. 不能使用普通for循環遍歷Map元素,因為沒有索引。
               2. 使用增強for行不行? 不能,沒有實現Iterable接口,foreach就是通過Iterable接口在序列中進行移動。
               3. Map裏面並沒有獲得叠代器的方法;所有不能使用叠代器
      方式一:
          先通過keySet()方法取到所有key
        然後遍歷keySet,依次通過Object get(Object key)方法,來查找value。
*/
        Set keys = map.keySet();
        for (Object object : keys) {
            System.out.print(object+":"+map.get(object));// "1:我好2:你好3:大家好4:啦啦啦5:麽麽噠"
        }
/*  方式二:
         先得到所有的Entry對象,遍歷Entry對象的集合,然後依次從Entry對象中調用方法:getKey(),getValue() 
 */
        Set set  = map.entrySet();
        for (Object object : set) {
            Entry obj = (Entry)object;  //需要把Object強制轉成 Entry類型
            System.out.print(obj.getKey()+":"+obj.getValue());// "1:我好2:你好3:大家好4:啦啦啦5:麽麽噠"
        }
//6.使用Map集合解決:打印 字符串中 出現最多字符的  次數
/*    實例:Map使用示例: 有如下字符串,String str = “aaaabbbyyyccc”;
         *    1.統計出str中每一個字符的個數   比如 a - 4    b - 3
         *    2.找出並打印,次數最多的字符和次數
*/
/*
     public class Test {
    public static void main(String[] args) {
        String str = "aaaabbbyyyccc";
        Map map = getChar(str);
        System.out.println(map);
        System.out.println(getCharAndValue(map));
    }
//統計每個字符出現的次數,並存儲到map集合中
    public static Map getChar(String str){
        Map map = null;
        if(str!=null&&str.length()>0){
            map = new HashMap();
            for(char ch:str.toCharArray()){
                if(map.containsKey(ch)){
                    map.put(ch, (int)map.get(ch)+1);
                }else{
                    map.put(ch, 1);
                }
            }
        }
        return map;
    }
// 打印次數最多的字符和次數 。    
    public static String getCharAndValue(Map map){
        if(map!=null&&map.size()!=0){
            Collection values = map.values();
            
        //方法一: 直接調用Collections裏面的max方法    
            int max = (int)Collections.max(values);
            
        //方法二:用Collection中的toArray方法,把Collection轉換成數組,然後調用Arrays中的工具方法sort求出
        //    Object[] arr = values.toArray();
        //    Arrays.sort(arr);
        //    int max = (int)arr[arr.length-1];
            
            String str = "";
            Set set = map.keySet();
            for(Object obj : set){
                if(map.get(obj).equals(max)){
                    str = obj + ":"+max;
                }
            }
            return str;
        }
        return null;
    }
}
*/              
    }
}

java集合(二)