hashcode的實例說明

package com.franky.hashcode;

import java.util.Collection;
import java.util.HashSet;

/**
 * @描述  關於hashCode的說明實例
 * @作者 franky
 * @日期 2014-12-30 下午9:37:42
 * 
 */
public class HashCodeTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Collection<Point> points = new HashSet<Point>();
		Point p1 = new Point(3, 3);
		Point p2 = new Point(5, 5);
		Point p3 = new Point(3, 3);
		/**
		 * hashcode是通過類的某些屬性計算得來的,在hashset集合中,hashcode用來計
		 * 算某個對象在集合中的存儲位置的,通常是用這個hashcode對某個數取模運算,這樣得
		 * 該對象應該存儲在hashset集合中的具體位置,在查找該對象時候,仍然通過hashcode
		 * 進行位置計算,因此無須遍歷整個集合即可查到該對象的位置,搜索速度快。
		 */
		
		/**
		 * 如果Point類不覆蓋hashCode()和equals(Object obj)這兩個方法,
		 * 那麼p3對象是可以存入HashSet集合的,覆蓋這兩個方法後由於字段參與hashcode
		 * 的計算,所以計算的hasecode值是相等的,繼而調用equals()方法進行對象的內容
		 * 判斷,如果判斷爲true,那麼代表這兩個對象是同一個,繼而HashSet集合不進行存儲
		 * ,另外如果不是hash表結構的集合,就不會應用hashcode進行位置計算的
		 * 
		 */
		points.add(p1);
		points.add(p2);
		points.add(p3);
		points.add(p1);
		
		//覆蓋hashCode()和equals(Object obj)方法前,得到size爲3,覆蓋後爲2
		System.out.println(points.size());
		
		//在對象加入hashset集合後,如果參與計算hashcode的某個字段值發生變化,那麼集合
		//在移除該對象的引用時,將無法搜索到,如果多個對象字段的值發生變化,可能引起內存泄露
		p1.setX(5);
		//移除失敗
		boolean remove = points.remove(p1);
		System.out.println(remove);
		System.out.println(points.size());
	}

}

class Point{
	private int x;
	private int y;
	
	
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + x;
		result = prime * result + y;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Point other = (Point) obj;
		if (x != other.x)
			return false;
		if (y != other.y)
			return false;
		return true;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public Point(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章