java.util.HashMap源码初探 (二)

2014-11-24 11:54:47 · 作者: · 浏览: 46
(4);
Value v1 = new Value(1);
Value v4 = new Value(4);

map.put(k1, v1);
map.put(k4, v4); // 这里会替换掉v1

// assertEquals(v1, map.get(k1));
assertEquals(v4, map.get(k1));
assertEquals(v4, map.get(k4));
}
}

class Key {
public int m;

public Key(int m) {
this.m = m;
}

@Override
public int hashCode() {
return m%3;
}
}

class Value {
public int m;

public Value(int m) {
this.m = m;
}
}

class Key2 {
public int m;

public Key2(int m) {
this.m = m;
}

@Override
public int hashCode() {
return m%3;
}

@Override
public boolean equals(Object obj) {
if(obj == null || !(obj instanceof Key2)) return false;

Key2 other = (Key2)obj;

return this.hashCode() == other.hashCode();
}
}

package test.junit;

import java.util.HashMap;

import junit.framework.TestCase;

/**
* HashMap中判断两个Key是否相同:先判断hashCode,在判断是否equals
* e.hash == hash && ((k = e.key) == key || key.equals(k))
* @author xuefeng
*
*/
public class HashMapTest extends TestCase {

/**
* v1和v4的hashCode相同,但是equals不符合,所以v1和v4会组成一个链表。
*/
public void testKey1() {
HashMap map = new HashMap();
Key k1 = new Key(1);
Key k4 = new Key(4);
Value v1 = new Value(1);
Value v4 = new Value(4);

map.put(k1, v1);
map.put(k4, v4);

assertEquals(v1, map.get(k1));
assertEquals(v4, map.get(k4));
}

/**
* v1和v4的hashCode相同,而且equals也符合,所以v1会被v4替换掉,k1和k4指向同一个v4。
*/
public void testKey2() {
HashMap map = new HashMap();
Key2 k1 = new Key2(1);
Key2 k4 = new Key2(4);
Value v1 = new Value(1);
Value v4 = new Value(4);

map.put(k1, v1);
map.put(k4, v4); // 这里会替换掉v1

// assertEquals(v1, map.get(k1));
assertEquals(v4, map.get(k1));
assertEquals(v4, map.get(k4));
}
}

class Key {
public int m;

public Key(int m) {
this.m = m;
}

@Override
public int hashCode() {
return m%3;
}
}

class Value {
public int m;

public Value(int m) {
this.m = m;
}
}

class Key2 {
public int m;

public Key2(int m) {
this.m = m;
}

@Override
public int hashCode() {
return m%3;
}

@Override
public boolean equals(Object obj) {
if(obj == null || !(obj instanceof Key2)) return false;

Key2 other = (Key2)obj;

return this.hashCode() == other.hashCode();
}
}