hashmap中的自定义类

使用hashmap,其中的key是自定义类。结果发现key相同的情况下,hashmap当成不同的key处理。
因为hashmap查找key时,先比较hashcode,然后用equal比较内容,只要不相同,就当成不同的key。
如:{(5,) =1, (2,) =1, (1,2,) =1, (1,3,) =1, (3,) =1, (2,) =1, (3,4,) =1, (5,) =1, (1,) =1, (3,) =1, (1,2,) =1, (4,) =1, (3,4,) =1}
所以要重写equal和hashcode。
重写equal只要比较内容是否相同就行了。
如果没有重写hashcode,依然没有效果。因为java用对象的地址计算hashcode,只有hashcode相同(->地址相同?)才能调用equal。
重写hashcode最简单的处理方式是让所有对象返回相同值,这样hashmap就会调用equal方法,比较内容。
但是,写好hashcode,可以减少equal的调用次数。
只有在hashcode相同的情况下才会调用equal,而不同对象拥有相同hashcode的情况比较少见(或者没有?)。
写hashcode和equal,参考String的hashcode写法。可以学习jdk的源码。
最后结果:

package arm;

import java.util.ArrayList;
import java.util.Collections;

public class ItemSet {
	private ArrayList<String> itemSet;

	public ItemSet() {
		itemSet = new ArrayList<>();
	}

	public ItemSet(String[] is) {
		itemSet = new ArrayList<>();
		for (String i : is) {
			itemSet.add(i);
		}
		Collections.sort(itemSet);
	}

	public void add(String i) {
		itemSet.add(i);
		Collections.sort(itemSet);
	}

	public void sort() {
		Collections.sort(itemSet);
	}

	public int size() {
		return itemSet.size();
	}

	public ArrayList<String> toArrayList() {
		return itemSet;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj instanceof ItemSet) {
			ItemSet aobj = (ItemSet) obj;
			int n = aobj.size();
			if (n == this.size()) {
				ArrayList<String> arr = aobj.toArrayList();
				for (int i = 0; i < n; ++i) {
					if (!itemSet.get(i).equals(arr.get(i))) {
						return false;
					}
				}
				return true;
			}
		}
		return false;
	}

	@Override
	public int hashCode() {
		int ret = 0;
		for (String item : itemSet) {
			ret += item.hashCode() * 31;
		}
		return ret;
	}

	@Override
	public String toString() {
		String ret = "(";
		for (String item : itemSet) {
			ret += item + ",";
		}
		ret += ")";
		return ret;
	}
}
// 排序
// 没有验证唯一性

posted on 2015-09-08 23:46  一五一十  阅读(349)  评论(0)    收藏  举报

导航