您的位置:首页 > 其它

用自定义的对象作为Map的key

2012-04-27 18:16 344 查看
用自定义的对象作为Map的key时,如果要让Map根据你自己定义的方式来判断它的key是否是唯一的,那么自定义的对象必须同时重写equals和hashCode方法。

Map判断key是否重复,就是通过equals和hashCode两个方法来判断的。

class MyList extends ArrayList {

@Override
public boolean equals(Object o) {   //只有当List中的所有字符串都相等时才返回true
List list = (List)o;
boolean flag = false;
for(int i = 0; i < list.size(); i ++) {
String str = (String)list.get(i);
flag = false;
for(int j = 0; j < this.size(); j ++) {
String str2 = (String)this.get(j);
if(str.equals(str2)) {
flag = true;
}
}
if(!flag) {
break;
}
}
return flag;
}
@Override
public int hashCode() {
int n = 0;
for(int i = 0; i < this.size(); i ++) {
String str = (String)this.get(i);
char val[] = str.toCharArray();//字符串是用字符数组表示的.
int len = str.length();//字符串长度
for (int j = 0; j < len; j++) {
n = 31*n + val[j++];
}
n = n + len;
}
return n;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
for(int i = 0; i < this.size(); i ++) {
String str = (String)this.get(i);
sb.append(str);
if(i != this.size() - 1) {
sb.append(", ");
} else {
sb.append("]");
}
}
return sb.toString();
}

}


public class TestMyList {
public static void main(String[] args) {
List l = new ArrayList();
l.add("jar001");
l.add("jar002");
l.add("jar003");

List l2 = new ArrayList();
l2.add("jar003");
l2.add("jar001");
l2.add("jar002");

System.out.println("l.equals(l2): " + l.equals(l2));  //输出false
System.out.println("l==l2: " + (l==l2));              //输出false

MyList list = new MyList();
list.add("jar001");
list.add("jar002");
list.add("jar003");

MyList list2 = new MyList();
list2.add("jar003");
list2.add("jar001");
list2.add("jar002");

System.out.println("list.equals(list2): " + list.equals(list2));  //输出true
System.out.println("list == list2: " + (list == list2));          //输出false

Map map = new HashMap();
map.put(list, "aaaaaaa");
map.put(list2, "bbbbbbb");

/*
map.get(list), 输出bbbbbbb, 而不是aaaaaaa,
原因是:list2与list的equals方法和hashCode方法相同,
Map就认为他两是同一个key,所以添加list2时,"bbbbbbb"就将"aaaaaaa"覆盖了
*/
System.out.println(map.get(list));  //输出bbbbbbb
System.out.println(map.get(list2)); //输出bbbbbbb
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: