Java编程思想读书笔记-4(第9章-2HashMap的工作原理及其实现)

2014-11-23 23:19:13 · 作者: · 浏览: 0

4. 自己实现一个简单的HashMap及其原理


4.1 在put()方法中:
1) 首先通过key得出要插入的key-value pair的hash code,并这个hash code作为索引在数组bucket中找出key所对应的元素。
2) 把要插入的key-value pair封装成实现了Map.Entry接口的类的一个对象。
3) 在操作1)所找出的数组元素(也是一个LinkedList)中查看是否有与要插入的key-value pair的key相同的元素,如果有,则对之进行更新;如果无,则把要插入的key-value pair数组元素中。
4.2 在get()方法中
1) 首先通过key得出要查找的key-value pair的hash code,并这个hash code作为索引在数组bucket中找出key所对应的元素。
2) 把要查找的key-value pair的key封装成实现了Map.Entry接口的类的一个对象。
3) 在操作1)所找出的数组元素(也是一个LinkedList)中查看是否有与要插入的key-value pair的key相同的元素,如果有,则返回key所对应的value;如果无,则返回一个null。
4.3 一个实例
  1. import java.util.*;
  2. /**
  3. * MPair类实现了Map.Entry
  4. */
  5. class MPair
  6. implements Map.Entry, Comparable{
  7. Object key, value;
  8. MPair(Object k, Object v){
  9. key = k;
  10. value = v;
  11. }
  12. public Object getKey() { return key; }
  13. public Object getValue() { return value; }
  14. public Object setValue(Object v){
  15. Object result = value;
  16. value = v;
  17. return result;
  18. }
  19. /**
  20. * 当比较两个MPair对象时,比较的是它们的key值
  21. */
  22. public boolean equals(Object o){
  23. return key.equals(((MPair)o).key);
  24. }
  25. public int compareTo(Object rv){
  26. return (((Comparable)key).compareTo(((MPair)rv).key));
  27. }
  28. }
  29. class SimpleHashMap extends AbstractMap{
  30. private final static int SZ = 997;
  31. private LinkedList[] bucket = new LinkedList[SZ];
  32. /**
  33. * 把key和value封装成Map.Entry的实现类后插入到array中
  34. */
  35. public Object put(Object key, Object value){
  36. Object result = null;
  37. //通过key得到要插入的key-value pair的hash code
  38. int index = key.hashCode() % SZ;
  39. if(index < 0) index = - index;
  40. if(bucket[index] == null)
  41. bucket[index] = new LinkedList();
  42. &nb