1 public class HashMap implements Map {
12 public HashMap(int initialCapacity) {
13 init(initialCapacity, 0.75f);
16 public HashMap(int initialCapacity, float loadFactor) {
17 init(initialCapacity, loadFactor);
20 private void init(int initialCapacity, float loadFactor) {
21 table=new HashEntry[computeCapacity(initialCapacity)];
22 this.loadFactor=loadFactor;
24 this.threshold=(int)(loadFactor*table.length);
27 private static int computeCapacity(int capacity) {
34 private static int hash(Object o, int length) {
35 int orig=o.hashCode();
36 orig=orig^(orig>>>22)^(orig>>>10);
37 orig=orig^(orig>>>8)^(orig>>4);
38 return orig&(length-1);
42 int newCapacity=table.length<<1;
43 HashEntry[] oldtable=table;
44 this.table=new HashEntry[newCapacity];
45 this.threshold=(int) (newCapacity*loadFactor);
47 for(int i=0; i<oldtable.length; i++) {
48 HashEntry e=oldtable[i];
50 HashEntry next=e.next;
51 int bin=hash(e.key, newCapacity);
60 for(int i=0;i<table.length;i++)
65 public boolean isEmpty() {
73 /* 0=keys, 1=values */
74 public Iterator iterator(int type) {
75 return (Iterator)(new HashMapIterator(this, type));
78 Object remove(Object key) {
79 int bin=hash(key, table.length);
80 HashEntry ptr=table[bin];
82 if (ptr.key.equals(key)) {
87 while(ptr.next!=null) {
88 if (ptr.next.key.equals(key)) {
89 Object oldvalue=ptr.value;
90 ptr.next=ptr.next.next;
100 Object get(Object key) {
101 int bin=hash(key, table.length);
102 HashEntry ptr=table[bin];
104 if (ptr.key.equals(key)) {
112 boolean containsKey(Object key) {
113 int bin=hash(key, table.length);
114 HashEntry ptr=table[bin];
116 if (ptr.key.equals(key)) {
124 Object put(Object key, Object value) {
126 if (numItems>threshold) {
130 int bin=hash(key, table.length);
131 HashEntry ptr=table[bin];
133 if (ptr.key.equals(key)) {
134 Object oldvalue=ptr.value;
140 HashEntry he=new HashEntry();
148 public Collection values()
151 // We don't bother overriding many of the optional methods, as doing so
152 // wouldn't provide any significant performance advantage.
153 values = new AbstractCollection()
157 public AbstractCollection(HashMap m) {
166 public Iterator iterator()
168 // Cannot create the iterator directly, because of LinkedHashMap.
169 return HashMapIterator(map, 1);