<span style="font-family: Arial, Helvetica, sans-serif;">import java.util.HashMap;</span>
import java.util.Map;
public final class PhoneNumber {
private final short areaCode;
private final short prefix;
private final short lineNumber;
public PhoneNumber(int areaCode, int prefix, int lineNumber) {
super();
this.areaCode = (short)areaCode;
this.prefix = (short)prefix;
this.lineNumber = (short)lineNumber;
}
/*override equlas方法后,也需要override hashCode方法,否则会出现两个相同的实例产生的hashCode值不一样,
* 从而在集合中无法找到对应的实例,如下*/
/* @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + areaCode;
result = prime * result + lineNumber;
result = prime * result + prefix;
return result;
}
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PhoneNumber other = (PhoneNumber) obj;
if (areaCode != other.areaCode)
return false;
if (lineNumber != other.lineNumber)
return false;
if (prefix != other.prefix)
return false;
return true;
}
public static void main(String[] args) {
Map<PhoneNumber,String> m = new HashMap<PhoneNumber,String>();
m.put(new PhoneNumber(707, 867, 5309), "Jenney");
System.out.println(m.get(new PhoneNumber(707, 867, 5309)));
}
}
以下是转自http://blog.csdn.net/afgasdg/article/details/6889383
总结:
1、equals方法用于比较对象的内容是否相等(覆盖以后)
2、hashcode方法只有在集合中用到
3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。
4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。
5、将元素放入集合的流程图:
JDK中的map没法实现多个key值重复的情况,如下代码
6、HashSet中add方法源代码:
- public boolean add(E e) {
- return map.put(e, PRESENT)==null; //调用map中的put函数
- }
- <pre name="code" class="java"> public V put(K key, V value) {
- if (key == null)
- return putForNullKey(value);
- int hash = hash(key.hashCode());
- int i = indexFor(hash, table.length);
- for (Entry<K,V> e = table[i]; e != null; e = e.next) {
- Object k;
- if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
- V oldValue = e.value;
- e.value = value;
- e.recordAccess(this);
- return oldValue; //若key值已存在,则返回key
- }
- }
- modCount++;
- addEntry(hash, key, value, i); //key不存在才加入
- return null;
- }</pre>
- <pre></pre>
- <pre></pre>