一、Map的快速开始
Map map=new HashMap();
//map的添加数据
map.put("name","小明")
map.put("age","28")
//从map中获取数据
map.get("name")
二、Map的技术实现
HashMap的底层实现是:数组+链表+红黑树(jdk8以后加入红黑树)
数组的概念:采用一段连续的存储单元来存储数据
数组的特点是:查询快,插入慢
链表的概念:链表是一种物理存储单元上非连续、非顺序的数据结构
链表的特点:插入快,查询慢
手动实现简易版0HashMap
map接口
package cn.shiyujun.hashMap;
public interface Map<K,V> {
V put(K k,V v);
V get(K k);
int size();
interface Entry<K,V>{
K getKey();
V getValues();
}
}
HashMap的实现
package cn.*.hashMap;
public class HashMap<K,V> implements Map<K,V> {
private Entry<K,V>[] table=null;
int size=0;
public HashMap() {
//定义数组长度为16
table=new Entry[16];
}
@Override
public V put(K k, V v) {
//获取k的hash值
int index=hash(k);
//获取该索引下的值判断是否存在
Entry<K, V> entry = table[index];
if(null==entry){
//entry为null说明该索引没有对应的值是第一次添加值所以next为null
table[index]=new Entry<K,V>(k,v,index,null);
size++;
}else{
//entry不为null说明该索引已经存在值根据链表的规则原值移一位,next赋值为当前值
table[index]=new Entry<K,V>(k,v,index,entry);
}
return table[index].getValues();
}
private int hash(K k) {
int index = k.hashCode() % 15;
//可能存在负数需要转称正
return Math.abs(index);
}
@Override
public V get(K k) {
if(size==0){
return null;
}
//计算hash值
int index = hash(k);
Entry<K, V> entry = getEntry(k, index);
return entry==null?null:entry.getValues();
}
private Entry<K, V> getEntry(K k, int index) {
for (Entry<K, V> e = table[index]; e!=null; e=e.next){
if(null!=e&&e.hash==index&&(k==e.getKey()||e.getKey().equals(k))){
return e;
}
}
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 getValues() {
return v;
}
}
}
引入红黑树
链表的特点是:查询速度慢
红黑树特点:查询快,插入慢
阈值为:7