Integer r = new Integer(2);
Integer rr = new Integer(2);
//r和rr不是同一个句柄;这点很明显
Hashtable ht = new Hashtable();
ht.put("1",r);
ht.put("2",rr);
System.out.println(ht.contains(rr));//这里输出为true,请问是怎么回事
ht.clear() ;
ht.put(r,"a");
ht.put("b",rr);
System.out.println(ht.contains(rr));//这里输出也为true,请问是怎么回事
ht.clear() ;
ht.put(r,rr);
System.out.println(ht.contains(rr));//这里输出还是为true,还要请问是怎么回事
contains这个方法到底比较的是什么,是依据什么标准来比较的,比较的是“键”还是“值”??谢谢
Integer rr = new Integer(2);
//r和rr不是同一个句柄;这点很明显
Hashtable ht = new Hashtable();
ht.put("1",r);
ht.put("2",rr);
System.out.println(ht.contains(rr));//这里输出为true,请问是怎么回事
ht.clear() ;
ht.put(r,"a");
ht.put("b",rr);
System.out.println(ht.contains(rr));//这里输出也为true,请问是怎么回事
ht.clear() ;
ht.put(r,rr);
System.out.println(ht.contains(rr));//这里输出还是为true,还要请问是怎么回事
contains这个方法到底比较的是什么,是依据什么标准来比较的,比较的是“键”还是“值”??谢谢
解决方案 »
- 求 用JFormattedTextField规定只能输入日期,输入错误后会弹出报错窗口并恢复修改前的值的方法(网上只有设置,但找不到注册监视器的例子)
- 关于JAVA frame panel Applet坐标问题
- 调试的几个按钮的作用??,马上结贴 JCREAT pro 5.0
- jdbc事物的问题.请多指教
- 菜鸟学习遇问题?!
- 我刚建立的一个QQ群,希望可以给提供学习Java的朋友一个互相交流的空间!(群号:3611831)
- 正则表达式,怎么在匹配一个英语句子时区分英语句号.和小数点.?
- 问个JB8的简单问题
- 查询的问题
- 关于inputstream的问题
- 获取程序运行路径结果不一致的问题
- java 如何pass reference to it??????????
我看不懂你的的三个输出有什么区别
三个都是搜索rr 而且三个map 都有value rr 你的疑问在哪里你的意思是不是 后面两个 ht.contains(rr) 你写错了 你的本意是ht.contains(r)是这样吗我刚刚看了源代码 HashMap的contains方法是通过equals方法来判断 是不是有对象存在的
而显然System.out.println(r.equals(rr)); 这个是true的 既然r 与 rr在map看来就是一个对象,而且Map里面有rr 你调用ht.contains(r)肯定返回true了
http://www.javadingle.com
查了下api
containspublic boolean contains(Object value) 测试此映射表中是否存在与指定值关联的键。此操作比 containsKey 方法的开销更大。 注意,此方法在功能上等同于 containsValue 方法,containValue 是集合框架中 Map 接口的一部分。 参数:
value - 要搜索的值。
返回:
当且仅当此哈希表中某个键映射到 value 参数(由 equals 方法确定)时,返回 true;否则返回 false。
public class T {
int value;
public T(int val) {
value = val;
}
}再把你程序中的Integer用T来替换,那得到结果应当是false。这是因为T类没有重写equals()方法,而是直接继承了Object的equals(),这使得比较标准仍然是比较对象的句柄。一般来说,如果你要把一个类的对象放入容器中,那么通常要为其重写equals()方法。
特别地,如果要把你的类的对象放入散列中,那么还要重写hashCode()方法;要放到有序容器中,还要重写compareTo()方法。
if (value == null) {
throw new NullPointerException();
} Entry tab[] = table;
for (int i = tab.length ; i-- > 0 ;) {
for (Entry e = tab[i] ; e != null ; e = e.next) {
if (e.value.equals(value)) {
return true;
}
}
}
return false;
}
--------------------------------------------------------if (e.value.equals(value)) {
return true;
}
hashtable 的value 不能为Null
测试此映射表中是否存在与指定值关联的键。
---------------------------------
你是不是要说。当键的时候是true
当值的时候为什么也是true
????
-----------------------------------------------------
回复人:Dan1980() ( 五级(中级)) 信誉:98 2007-3-25 14:54:12 得分:0
? 好像没人答到点子上啊。contains()比较的是值,这点是肯定的。关键问题在于这个“等于”关系的标准是什么,也就是说,contains的参数和Hashtable中的值这两个对象符合什么样的条件才认为是相等的,从而让contains返回true。这个等于关系是在equals()中定义的。众所周之,Integer类重写了Object中的equals()方法,让它不再比较句柄,而是比较对象中实际包含的整数的值。这就是为什么楼主的程序返回true的原因。因为equals()被contains()方法回调了,contains利用equals()的返回值。如果楼主自己写一个类,如:// T.java
public class T {
int value;
public T(int val) {
value = val;
}
}再把你程序中的Integer用T来替换,那得到结果应当是false。这是因为T类没有重写equals()方法,而是直接继承了Object的equals(),这使得比较标准仍然是比较对象的句柄。一般来说,如果你要把一个类的对象放入容器中,那么通常要为其重写equals()方法。
特别地,如果要把你的类的对象放入散列中,那么还要重写hashCode()方法;要放到有序容器中,还要重写compareTo()方法。
==============================
这个朋友说得不错哦。
你是只安下面的改一下。就不会行了。
int r = 2;
int rr = 2;
Integer rr = new Integer(2);问题应该是出在这里的!! r and rr 引用的都是 Integer(2);
改为
Integer r = new Integer(2);
Integer rr = new Integer(3); 就哦了.
public boolean contains(Object value)测试此映射表中是否存在与指定值关联的键。此操作比 containsKey 方法的开销更大。
注意,此方法在功能上等同于 containsValue 方法,containValue 是集合框架中 Map 接口的一部分。
参数:
value - 要搜索的值。
返回:
当且仅当此哈希表中某个键映射到 value 参数(由 equals 方法确定)时,返回 true;否则返回 false。
抛出:
NullPointerException - 如果该值为 null。