Java-从HashMap检索对象
从hashmap检索值时出现问题。hashmap声明如下:Java-从HashMap检索对象,java,hashmap,Java,Hashmap,从hashmap检索值时出现问题。hashmap声明如下: HashMap<TRpair,A> aTable = new HashMap<TRpair,A>(); aTable.put(new TRpair(new T(<value>),new Integer(<value>)),new Ai()); int i = 0; for (Map.Entry<TRpair,A> entry : aTable.entrySet()) {
HashMap<TRpair,A> aTable = new HashMap<TRpair,A>();
aTable.put(new TRpair(new T(<value>),new Integer(<value>)),new Ai());
int i = 0;
for (Map.Entry<TRpair,A> entry : aTable.entrySet()) {
System.out.println(entry.getKey().toString() + " " + entry.getValue().toString());
System.out.println(entry.getKey().equals(new TRpair(new T("!"),new Integer(10))));
i++;
}
public class TRpair {
private final T t;
private final Integer r;
protected TRpair(Integer r1, T t1) {
terminal = t1;
row = r1;
}
protected TRpair(T t1, Integer r1) {
t = t1;
r = r1;
}
@Override
public boolean equals(Object o) {
TRpair p = (TRpair)o;
return (p.t.equals(t)) && (p.r.equals(r));
}
@Override
public String toString() {
StringBuilder sbldr = new StringBuilder();
sbldr.append("(");
sbldr.append(t.toString());
sbldr.append(",");
sbldr.append(r.toString());
sbldr.append(")");
return sbldr.toString();
}
}
尽管上面的代码片段确认映射中确实有一个条目正好使用此键,但输出为null
如果有帮助,类TRpair声明如下:
HashMap<TRpair,A> aTable = new HashMap<TRpair,A>();
aTable.put(new TRpair(new T(<value>),new Integer(<value>)),new Ai());
int i = 0;
for (Map.Entry<TRpair,A> entry : aTable.entrySet()) {
System.out.println(entry.getKey().toString() + " " + entry.getValue().toString());
System.out.println(entry.getKey().equals(new TRpair(new T("!"),new Integer(10))));
i++;
}
public class TRpair {
private final T t;
private final Integer r;
protected TRpair(Integer r1, T t1) {
terminal = t1;
row = r1;
}
protected TRpair(T t1, Integer r1) {
t = t1;
r = r1;
}
@Override
public boolean equals(Object o) {
TRpair p = (TRpair)o;
return (p.t.equals(t)) && (p.r.equals(r));
}
@Override
public String toString() {
StringBuilder sbldr = new StringBuilder();
sbldr.append("(");
sbldr.append(t.toString());
sbldr.append(",");
sbldr.append(r.toString());
sbldr.append(")");
return sbldr.toString();
}
}
每个Ai(扩展A)和T类中的equals()和toString()方法都会被类似地重写,并表现出预期的行为
为什么hashmap的值输出为空,而之前已经确认对应键的值确实在映射中
非常感谢,
Froskoy。哈希集合的键/元素,但如果重写了euqals,则重写hashCode() 你可以用
public int hashCode() {
return t.hashCode() * 31 ^ r.hashCode();
}
顺便说一句:从代码中可以看出,Integer r
不能为null
,在这种情况下,使用int r
更有意义
从
请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码
哈希集合的键/元素,但如果重写了euqals,则重写hashCode() 你可以用
public int hashCode() {
return t.hashCode() * 31 ^ r.hashCode();
}
顺便说一句:从代码中可以看出,Integer r
不能为null
,在这种情况下,使用int r
更有意义
从
请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码
IIRC hashmap是通过
hashCode()
而不是通过相等来查找的,因为您没有实现hashCode,所以使用与对象指针相等一致的默认实现-
您需要实现适当的hashcode函数,该函数考虑了“T”参数和整数(或不考虑)
hashCode()和equals()是一致的,这是一个很好的实践,但如果您知道自己在做什么,则在结构上不需要 IIRC hashmap按
hashCode()
查找,而不是按相等进行查找,并且由于您没有实现hashCode,因此使用与对象指针相等一致的默认实现-
您需要实现适当的hashcode函数,该函数考虑了“T”参数和整数(或不考虑)
hashCode()和equals()是一致的,这是一个很好的实践,但如果您知道自己在做什么,则在结构上不需要 您需要重写
TRpair
中的hashCode()
方法,否?为什么?覆盖equals()还不够吗?hashCode()
如果有更多对象具有相等的值(和状态),则需要覆盖以保持相等。更多可哈希表通过哈希检查一致性和相等性。您需要重写TRpair
中的hashCode()
方法,否?为什么?覆盖equals()还不够吗?hashCode()
如果有更多对象具有相等的值(和状态),则需要覆盖以保持相等。更多可哈希表通过哈希检查一致性和相等性。谢谢!选择31仅仅是因为它是一个任意素数,还是有其他原因?它是一个有点任意但常用的素数。e、 g.String.hashCode()使用它。@Froskoy,你可以使用你选择的任何素数。再次感谢!还有,我应该在t.hashCode()和r.hashCode()中放些什么?这些东西对于t/r来说是唯一的吗?@Froskoy你可以使用任何非平凡的素数。我不会用2谢谢选择31仅仅是因为它是一个任意素数,还是有其他原因?它是一个有点任意但常用的素数。e、 g.String.hashCode()使用它。@Froskoy,你可以使用你选择的任何素数。再次感谢!还有,我应该在t.hashCode()和r.hashCode()中放些什么?这些东西对于t/r来说是唯一的吗?@Froskoy你可以使用任何非平凡的素数。我不会用2