自定义HashMap(玩一玩)

一、自定义Map接口

public interface Map<K,V> {
	
	V set(K k,V v);
	
	V get(K k);
	
	int size();
	
	void remove(K k);
}

二、自定义HashMap实现类

package com.summer.customer;

public class HashMap<K, V> implements Map<K, V> {

	private static final int DEFAULT_MAX_SIZE = 16;
	Entry[] entrySet = new Entry[DEFAULT_MAX_SIZE];
	private int size = 0;

	@Override
	public V set(K k, V v) {
		int index = hash(k);
		Entry entry = entrySet[index];
		if (entry == null) {
			entrySet[index] = new Entry(k, v, null);
			size++;
		} else {
			entrySet[index] = new Entry(k, v, entry);
		}
		return v;
	}

	@Override
	public V get(K k) {
		int index = hash(k);
		Entry entry = entrySet[index];
		if (entry == null)
			return null;
		if (entry.getK().equals(k)) {
			return (V) entry.getV();
		} else {
			if (entry.getNext() != null) {
				return (V) getEntry(k, entry.getNext()).getV();
			} else {
				return null;
			}
		}
	}

	private Entry getEntry(K k, Entry entry) {
		if (entry.getK().equals(k)) {
			return entry;
		} else {
			getEntry(k, entry.getNext());
		}
		return null;
	}

	@Override
	public int size() {
		return size;
	}

	@Override
	public void remove(K k) {
		int index = hash(k);
		Entry entry = entrySet[index];
		if (entry == null) {
			return;
		} else {
			if (entry.getK().equals(k)) {
				entrySet[index] = null;
			} else {
				removeEntry(k, entry.getNext());
			}
			size--;
		}
	}

	private void removeEntry(K k, Entry entry) {
		if (k.equals(entry.getK())) {
			entry = null;
		} else {
			removeEntry(k, entry.getNext());
		}
	}

	/**
	 * <p>通过hash算法,计算出key的下标位置
	 * 
	 * @param k
	 * @return int
	 */
	private int hash(K k) {
		int hashCode = k.hashCode();
		int mod = hashCode % DEFAULT_MAX_SIZE;
		return mod >= 0 ? mod : Math.abs(mod);
	}
}

class Entry<K, V> {

	private K k;
	private V v;
	private Entry<K, V> next;

	public Entry(K k, V v, Entry<K, V> next) {
		this.k = k;
		this.v = v;
		this.next = next;
	}

	public K getK() {
		return k;
	}

	public void setK(K k) {
		this.k = k;
	}

	public V getV() {
		return v;
	}

	public void setV(V v) {
		this.v = v;
	}

	public Entry<K, V> getNext() {
		return next;
	}

	public void setNext(Entry<K, V> next) {
		this.next = next;
	}
}

三、测试

public class HashMapTest {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		map.set("Aa", "allen");
		map.set("BB", "tom");
		map.set("ABCDEa123abc", "jone");
		map.set("ABCDFB123abc", "bob");
		map.set("dick", "dick");
		map.remove("jone");
		// hash冲突测试
		System.out.println("Aa".hashCode() == "BB".hashCode());
		System.out.println("ABCDEa123abc".hashCode() == "ABCDFB123abc".hashCode());
		System.out.println(map.get("Aa") + "-" + map.get("BB") + "-" + map.get("ABCDEa123abc") + "-"
				+ map.get("ABCDFB123abc") + "-" + map.get("dick"));
		System.out.println(map.size());
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值