首先的一件事情是,咱应该知道是一开始map是一个数组。数组的数据不够放的时候,它会成为一个链表,然后链表太长的时候会转换成为一个二叉树。大概就知道这些吧。接下来就愉快的写代码吧。
import java.io.Serializable;
import java.util.Set;
/*
* @author zhangxiaomin
* @email 1396729865@qq.com
*/
// 数组+链表+红黑树
public class CustomHashMap<K,V> implements Serializable{
private static final long serialVersionUID=1L;
private static int initialCapacity = 16;
private static float loadFactor = 0.75f;
private static Node[] nodes = new Node[initialCapacity];
private volatile int size = 0;
public int size(){return this.size;}
@Override public int hashCode() {return super.hashCode();}
@Override public boolean equals(Object obj) {return super.equals(obj);}
public static class Node<K,V>{
final K key = null;
V value;
public Node(K key,V value){}
@Override public String toString() {return super.toString();}
@Override public boolean equals(Object obj) {return super.equals(obj);}
}
}
接下来,写一个构造器。
private static Node[] nodes = new Node[initialCapacity];
这行代码是几个意思,加载类的时候创建一个静态的node数组。我的天呐。这怕是石乐志吧。去掉这行代码。
// 数组+链表+红黑树
public class CustomHashMap<K,V> implements Serializable{
private static final long serialVersionUID=1L;
private static final int DEFAULT_INITIALCAPACITY = 16;
private static final float DEFAULT_LOADFACTOR = 0.75f;
private volatile int size = 0;
public int size(){return this.size;}
public Node[] nodes = {};
@Override public int hashCode() {return super.hashCode();}
@Override public boolean equals(Object obj) {return super.equals(obj);}
public static class Node<K,V>{
final K key = null;
V value;
public Node(K key,V value){}
@Override public String toString() {return super.toString();}
@Override public boolean equals(Object obj) {return super.equals(obj);}
}
public CustomHashMap(int initialCapacity){
this.nodes = new Node[initialCapacity];
}
public CustomHashMap(){
this(DEFAULT_INITIALCAPACITY);
}
}
继续往下写,毋庸置疑我需要写个get和put方法了。
public void put(K key,V v){
}
public V get(K key){
return null;
}
那么现在就需要想一想了,我这个元素是怎么给put进去的呢?我现在的数据结构是一个数组。我是准备并排以一个地放在数组里边呢?还是有别的法子呢?发挥咱的想象力。
- 第一点,就目前而言咱家写了一个数组
- 第二点,咱家写了一个通过key去获取元素的get方法。
通过数组获取元素只有一种方法嘛,就是下标呗,那么我现在明确一下,我需要做的事情是建立key和数组下标的关系。
public class Test{
public static void main(String[] args) {
CustomHashMap.Node<String,Object> node = new CustomHashMap.Node<>("hello","world");
System.out.println(node);
System.out.println("hello world");
}
}