override equals后也要override hashcode方法,否则hashmap,hashset,hashtable这三个集合中的操作会出问题。 (其他情况下,不重写hashcode没)

<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方法源代码:

[java]  view plain copy
  1. public boolean add(E e) {  
  2.     return map.put(e, PRESENT)==null;  //调用map中的put函数
  3.     }  
map.put源代码:
[java]  view plain copy
  1. <pre name="code" class="java"public V put(K key, V value) {  
  2.         if (key == null)  
  3.             return putForNullKey(value);  
  4.         int hash = hash(key.hashCode());  
  5.         int i = indexFor(hash, table.length);  
  6.         for (Entry<K,V> e = table[i]; e != null; e = e.next) {  
  7.             Object k;  
  8.             if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {  
  9.                 V oldValue = e.value;  
  10.                 e.value = value;  
  11.                 e.recordAccess(this);  
  12.                 return oldValue;  //若key值已存在,则返回key
  13.             }  
  14.         }  
  15.   
  16.         modCount++;  
  17.         addEntry(hash, key, value, i);  //key不存在才加入
  18.         return null;  
  19.     }</pre>  
  20. <pre></pre>  
  21. <pre></pre>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值