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();
- 使用泛型來指明鍵和值的類,它們放在"<“和”>"字符內,而且類名使用逗號分隔,如下所示
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;
}
}
}