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

用自定义的对象作为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
		}
	}



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值