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

来源:互联网 发布:一个c语言的执行是从 编辑:程序博客网 时间:2024/05/20 04:09

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


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


class MyList extends ArrayList {@Overridepublic boolean equals(Object o) {   //只有当List中的所有字符串都相等时才返回trueList 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;}@Overridepublic 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));  //输出falseSystem.out.println("l==l2: " + (l==l2));              //输出falseMyList 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));  //输出trueSystem.out.println("list == list2: " + (list == list2));          //输出falseMap 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));  //输出bbbbbbbSystem.out.println(map.get(list2)); //输出bbbbbbb}}



 

原创粉丝点击