/**
* @className: Selfmap
* @description: TODO 类描述
* @author: whz
* @date: 2022/1/16
**/
public class ThirdHashMap<K,V> {
class Node<K,V>{
private K key;
private V value;
private Node<K,V> next;
public Node(K key, V value) {
this.key = key;
this.value = value;
}
public Node(K key, V value, Node<K, V> next) {
this.key = key;
this.value = value;
this.next = next;
}
}
final int DEFAULT_CAPACITY=16;
final float LOAD_FACTOR=0.75f;
private int size;//大小
Node<K,V>[] buckets;
public ThirdHashMap(){
buckets=new Node[DEFAULT_CAPACITY];
size=0;
}
public ThirdHashMap(int capacity){
buckets=new Node[capacity];
size=0;
}
private int getIndex(K key,int length){
int hashCode=key.hashCode();
int index=hashCode%length;
return Math.abs(index);
}
public void put(K key,V value){
if(size>=buckets.length*LOAD_FACTOR) resize();
putVal(key,value,buckets);
}
private void putVal(K key,V value,Node<K,V>[] table ){
int index=getIndex(key,table.length );
Node node=table[index];
if(node==null){
table[index]=new Node<>(key,value);
size++;
return;
}
while (node!=null){
if((node.key.hashCode()==key.hashCode())
&&(node.key==key||node.key.equals(key))){
node.value=value;
return;
}
node=node.next;
}
Node newNode=new Node(key,value,table[index]);
table[index]=newNode;
size++;
}
private void resize(){
Node<K,V>[] newBucket=new Node[buckets.length*2];
rehash(newBucket);
buckets=newBucket;
}
private void rehash(Node<K,V>[] newBuckets){
size=0;
for (int i = 0; i < buckets.length; i++) {
if(buckets[i]==null){
continue;
}
Node<K,V> node=buckets[i];
while (node!=null){
putVal(node.key,node.value ,newBuckets );
node=node.next;
}
}
}
public V get(K key){
int index=getIndex(key,buckets.length );
if(buckets[index]==null) return null;
Node<K,V> node=buckets[index];
while (node!=null){
if((node.key.hashCode()==key.hashCode())&&(node.key==key||node.key.equals(key))){
return node.value;
}
node=node.next;
}
return null;
}
public int size(){
return size;
}
}
class test{
public static void main(String[] args) {
ThirdHashMap map = new ThirdHashMap();
for (int i = 0; i < 100; i++) {
map.put("刘华强" + i, "你这瓜保熟吗?" + i);
}
System.out.println(map.size());
for (int i = 0; i < 100; i++) {
System.out.println(map.get("刘华强" + i));
}
}
}
手写hashmap(数组加链表)
最新推荐文章于 2023-03-02 21:54:04 发布