-
什么是hash
它是把一个任意长度的二进制值通过一个映射关系转化成一个固定长度的二进制值1.1、任意长度的二进制值
1.2、一一映射关系(哈希算法)
1.3、固定的二进制值(哈希值)
定义中三个关键元素的理解以及三者之间的相关联系。
固定长度的二进制值相当于一个任意长度的二进制值的摘要
固定长度的二进制值相当于一个关键字(有且仅有一个,一一对应)
key-----value; hash 只是确定了一个key和value的映射关系 -
什么是hash表
特点:它的存取效率特别高,取数据的时间复杂度为1;
hash: 通过一个key的输入,来获取数组中与之对应的唯一映射value
根据hash函数找到数组中的这个value的下标; -
哈希函数是什么
根据key值找存储位置的下标。有哪些方法可以找到下标‘
3.1 除留取余数法(取模)
int index = key%m
m的取值规则:取比数组长度小的最大质数 -
hash表处理冲突
4.1 线性探测法,步长为1;说通俗点就是挨个去找一个空位置,把值放进去。
4.2 链表形式。在位置冲突时,把当前位置的值与新值形成链表,去存储。如下图所示
-
以上就是hashmap的简单原理基础,附上简单实例一看便知
5.1 map的接口类
public interface PMap<K,V> {
V put(K key,V value);
V get(K key);
int size();
interface Entry<K,V>{
K getKey();
V getValue();
}
**5.2 map的实现类**
package practicemap;
public class PHashMap<K,V> implements PMap<K,V> {
private static Integer defaultLength = 16;
private static Double defaultLoad = 0.75;
private Entry<K,V>[] table = null;
//記錄數組的長度
private Integer size = 0;
public PHashMap(int defaultLength, double defaultLoad) {
this.defaultLength = defaultLength;
this.defaultLoad = defaultLoad;
this.table = new Entry[defaultLength];
}
public PHashMap(){
this(defaultLength,defaultLoad);
}
private int getIndex(K key){
//除留餘數法
int m = this.defaultLength-1;
return key.hashCode()%m;
}
@Override
public V put(K key, V value) {
//1、根據key取得數組中的下標
int index = getIndex(key);
Entry<K, V> kvEntry = table[index];
if (kvEntry == null) {
table[index] = new Entry<>(key,value,null,index);
size++;
}else {
Entry newEntry = new Entry(key,value,kvEntry,index);
table[index] = newEntry;
}
return table[index].getValue();
}
@Override
public V get(K key) {
//1、根據key取得數組中的下標
int index = getIndex(key);
return table[index]==null? null:table[index].getValue();
}
@Override
public int size() {
return size;
}
class Entry<K,V> implements PMap.Entry<K,V>{
K key;
V value;
Entry<K,V> next;
int index;
public Entry(K key, V value, Entry<K, V> next, int index) {
this.key = key;
this.value = value;
this.next = next;
this.index = index;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
}
}
5.3 map的简单测试类
public class PHashMapTest {
public static void main(String[] args) {
PHashMap map = new PHashMap();
map.put("watet","haodoua");
map.put("star","haozhuanga");
System.out.println(map.size());
System.out.println(map.get("star"));
}
}