用自定义的对象作为Map的key
2012-04-27 18:16
344 查看
用自定义的对象作为Map的key时,如果要让Map根据你自己定义的方式来判断它的key是否是唯一的,那么自定义的对象必须同时重写equals和hashCode方法。
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 } }
相关文章推荐
- Map中自定义对象做KEY
- 用仿函数实现以std::string作为key的map自定义排序
- HashCode 和 Equals 的使用 - 使用自定义对象作为HashMap的Key例子
- 【C++】自定义结构体作为map的key
- java 关于Map的key可不可以是自定义对象的学习
- 使用用户自定义类型作为map的key
- 自定义结构作为map的key,比较函数写法
- Objective-C如何使自定义对象类作为NSDictionary的key
- Java 将自定义的对象作为HashMap的key
- 对象作为 map 的 key 时,需要重写 equals 方法和 hashCode 方法
- stl map double/float 作为key,自定义比较器
- 自定义结构作为map的key,比较函数写法
- 以自定义对象作为hashmap的key需要注意什么
- std::map 自定义类做为key时 find operator< 的正确写法
- XStream序列化对象,java.util.Map自定义Converter
- 集合框架--Map集合之HashMap存储自定义对象
- 【redis,1】java操作redis: 将string、list、map、自定义的对象保存到redis中
- map以自定义类型当Key(键值)
- C#基础 Dictionary存储自定义对象作为键值
- JS 自定义对象实现Java中的Map对象功能