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的源码。
最后结果:
{(1,) =1, (1,2,) =2, (2,) =2, (3,) =2, (4,) =1, (1,3,) =1, (5,) =2, (3,4,) =2}
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;
}
}