import java.util.HashMap;
import java.util.Map;public class MapEQ {
public static void main(String[] args) {
Map<ToDos, String> m = new HashMap<ToDos, String>();
ToDos t1 = new ToDos("Monday");
ToDos t2 = new ToDos("Monday");
ToDos t3 = new ToDos("Tuesday");
m.put(t1, "doLaundry");
m.put(t2, "payBills");
m.put(t3, "cleanAttic");
System.out.println(m.size()); //我觉得应该是3才对。
}
}
class ToDos{
String day;
ToDos(String d){
day = d;
}
public boolean equals(Object o){
return ((ToDos)o).day == this.day;
}
public int hashCode(){
return 9;
}
}
import java.util.Map;public class MapEQ {
public static void main(String[] args) {
Map<ToDos, String> m = new HashMap<ToDos, String>();
ToDos t1 = new ToDos("Monday");
ToDos t2 = new ToDos("Monday");
ToDos t3 = new ToDos("Tuesday");
m.put(t1, "doLaundry");
m.put(t2, "payBills");
m.put(t3, "cleanAttic");
System.out.println(m.size()); //我觉得应该是3才对。
}
}
class ToDos{
String day;
ToDos(String d){
day = d;
}
public boolean equals(Object o){
return ((ToDos)o).day == this.day;
}
public int hashCode(){
return 9;
}
}
结果是2
不清楚楼主的1是怎么跑出来的public boolean equals(Object o){
return ((ToDos)o).day == this.day;
}
public int hashCode(){
return 9;
}在一个类可能会放入hashmap等用hash的数据结构的时候
一定要保证equals和hashcode返回相等
楼主这样写有问题,可能会引起程序的不正常结果
建议修改为string 的hashcode
另外由于string都放在字符串常量池的缘故,
这个equals方法中的==竟然在这个小程序里面正常工作了
还是改为string 的equals比较合理一些
这一定不是您程序的意图,所以用equals代替==比较String。
if (key == null) {
return putValueForNullKey(value);
} int hash = secondaryHash(key.hashCode());
HashMapEntry<K, V>[] tab = table;
int index = hash & (tab.length - 1);
for (HashMapEntry<K, V> e = tab[index]; e != null; e = e.next) {
if (e.hash == hash && key.equals(e.key)) {
preModify(e);
V oldValue = e.value;
e.value = value;
return oldValue;
}
} // No entry for (non-null) key is present; create one
modCount++;
if (size++ > threshold) {
tab = doubleCapacity();
index = hash & (tab.length - 1);
}
addNewEntry(key, value, hash, index);
return null;
}源码……
人家要比较key和hash这两样东西的
返回值比较,完全一样则对象为同一个。
如果去掉
public int hashCode(){
return 9;
}结果就是3了。那就是说t1,t2完全相等,导致t2覆盖了t1.
TreeSet等式根据equals()来判断的。
把 equals hashCode 任何一个方法去掉 都是 size=3
preModify(e);
V oldValue = e.value;
e.value = value;
return oldValue;
}大家看好这段了 要两个条件同事满足 才会当成是一个新的 对象放进去 !
m.put(t1, "doLaundry");
m.put(t2, "payBills");
m.put(t3, "cleanAttic");你换成 m.put("doLaundry, "t1);
m.put("payBills", t2);
m.put("cleanAttic", t3);这样就是3了