hashmap簡單理解

hashmap

1. 什麼是 HashMap?

HashMap 是基於哈希表Map 接口是實現的。

此實現提供所有可選操作,並允許使用 null 做爲值(key)和鍵(value)。

HashMap 不保證映射的順序,特別是它不保證該順序恆久不變。此實現假定哈希函數將元素適當的分佈在各個桶之間,可作爲基本操作(get 和 put)提供穩定的性能。

在jdk1.7中的HashMap是基於數組+鏈表實現的,在jdk1.8中的HashMap是由數組+鏈表+紅黑樹實現的。

2. HashMap的簡單使用

哈希映射是java中的一種數據結構,它使用對象來檢索另一個對象,第一個對象是鍵,第二個對象是值,它們是作爲java.util包中的HashMap類來實現的

1.new初始化

1.可以通過調用其無參的構造函數來創建哈希映射:

HashMap map = new HashMap();
  1. 使用泛型來指明鍵和值的類,它們放在"<“和”>"字符內,而且類名使用逗號分隔,如下所示
HashMap<String, Integer> map = new HashMap<>();

2. put存儲(寫)

put(Object,Object)

通過調用帶有兩個參數(鍵和值)的put(Object,Object)方法,將對象存儲到哈希映射中

map.put("Tom", 18);

這將一個鍵爲Tom,值爲18的條目存儲到哈希映射中

3.get查詢(取)

get(Object)

通過調用get(Object)方法,同時將鍵作爲其唯一的參數,可以從映射中檢索對象

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

map.put("Tom", 18);

int age = map.get("Tom");

System.out.println(age);

getOrDefault(Object,Object)

如果沒有發現匹配該鍵值,get()方法將返回一個null,處理這一潛在問題的另外一種方式是調用getOrDefault(Object,Object),如果作爲第一個參數的鍵沒有被找到,則默認範圍第二個參數,如下面的語句所示

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

map.put("Tom", 18);

int number = map.getOrDefault("Tom", -1);

System.out.println(number);

remove(Object key)

4. remove刪除

通過調用remove(object)方法刪除屬性值,只要傳入對應的key即可

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

map.put("Tom",18);

map.put("lisa",17);

System.out.println("調用remove方法之前 "+map);
//調用remove方法之前 {Tom=18, lisa=17}

map.remove("lisa");

System.out.println("調用remove方法之後 "+map);
//調用remove方法之後 {Tom=18}

5.foreach遍歷

foreach()

下面用for循環語句使用條目集合和條目來訪問map哈希映射中的所有鍵和所有值:

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

map.put("Tom", 18);

for (Map.Entry<String, Integer> entry : map.entrySet()) {

String key = entry.getKey();

Integer value = entry.getValue();

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

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

}

四種遍歷的方法 https://blog.csdn.net/yaomingyang/article/details/78748130

6.containsKey 存在

containsKey(key)與containsValue(value)

通過containsKey(key)與containsValue(value)可以判斷是否有鍵值,返回的是true或false的布爾值

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

map.put("Tom", 18);

System.out.println(map.containsKey("Tom"));

System.out.println(map.containsValue(2));

輸出結果爲:

true

false

7. isEmpty 空 判斷

isEmpty()

該方法用於判斷是否有哈希值,返回的是一個布爾值

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

map.put("Tom",18);

System.out.println(map.isEmpty());

3.簡單實現方法

public interface Map < K, V >
    {
        V put(K k, V v);
        V get(K k);
        int size();
        interface Entry < K, V >
            {
                K getKey();
                V getValue();
            }

    }

public class HashMap < K, V > implements Map < K, V >
{
    Entry < K, V > table[] = null;
    int size = 0;

    //構造方法
    public HashMap()
        {
            table = new Entry[16];
        }

        /****     
         *  1、hash》hashcode》取模
         *  2、拿到下標值 對應Entry數組去找到當前下標值
         *  3、如果爲空 直接存儲》數組
         *  4、如果不爲空 用鏈表
         *   @param k     * @param v     * @return
         *    */
    
    @Override 
    public V put(K k, V v)
    {
        int index = hash(k);

        Entry < K, V > entry = table[index];

        if(null == entry)
        {
            table[index] = new Entry < > (k, v, index, null);
            size++;
        }
        else
        {
            table[index] = new Entry < > (k, v, index, entry);
        }
        return null;
    }

    private int hash(K k)
        {
            int i = k.hashCode() % 16;
            //return i>=0?i:-i;        
            return Math.abs(i);
        }
        /***     
         * 1、k 去hash
         * 2、數組下標
         * * 3、當前下標 和我查詢的下標值是否相等、
         * * 4、相等》直接放回 說明查詢到
         * * 5、不相等》判斷當前next是否爲空
         * * 6、爲空直接返回null 相等不爲空 直接返回
         *  * @param k
         *  * @return     */
    
    @Override
    public V get(K k)
    {
        int index = hash(k);
        Entry < K, V > entry = table[index];
        if(null == entry)
        {
            return null;
        }
        return findValue(k, entry);
    }

    private V findValue(K k, Entry < K, V > entry)
    {
        if(k == entry.getKey() || k.equals(entry.getKey()))
        {
            return entry.getValue();
        }
        else
        {
            if(entry.next != null)
            {
                return findValue(k, entry.next);
            }
        }
        return null;
    }

    @Override

    public int size()
    {
        return size;
    }

    class Entry < K, V > implements Map.Entry < K, V >
    {
        K k;
        V v;
        int hash;
        Entry < K, V > next;
        public Entry(K k, V v, int hash, Entry < K, V > next)
        {
            this.k = k;
            this.v = v;
            this.hash = hash;
            this.next = next;
        }
        @Override
        public K getKey()
        {
            return k;
        }
        
        @Override
        public V getValue()
        {
            return v;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章