我有一个名为SNMPv3的类,如下所示。当我尝试从这个类的实例调用函数mergeParameters()时,会发生一些奇怪的事情。
class SNMPv3{
String[] names={"value1",
"value2",
"value3",
"value4",
"value5",
"value6"};
Map<String,String> map = new HashMap<String,String>();
void mergeParameters(ArrayList<SNMPv3> snmpv3List)
{
for(String parametername : this.map.keySet())
{
String parametervalue="";
for(SNMPv3 row : snmpv3List)
{
if(!row.equals(this))
{
if(parametervalue.equals(""))
{
parametervalue = row.map.get(parametername);
}
else if(parametervalue.equals(row.map.get(parametername)))
{
this.map.put(parametername, "");
for(SNMPv3 rowinside : snmpv3List)
{
if(!rowinside.equals(this))
{
this.map.put(parametername,this.map.get(parametername) + rowinside.map.get(parametername));
}
}
}
}
}
}
}
}
在编译时,当'row'和'this'显示相同的对象时编译器进入此行
if(!row.equals(this))
它应该进入下一个循环,但事实并非如此。奇怪的是它走到了这一行:
this.map.put(parametername,this.map.get(parametername) + rowinside.map.get(parametername));
我不明白为什么?顺便说一下,我已经检查了花括号。
然后我尝试在那个奇怪的地方添加一个else:
class SNMPv3{
String[] names={"value1",
"value2",
"value3",
"value4",
"value5",
"value6"};
Map<String,String> map = new HashMap<String,String>();
void mergeParameters(ArrayList<SNMPv3> snmpv3List)
{
for(String parametername : this.map.keySet())
{
String parametervalue="";
for(SNMPv3 row : snmpv3List)
{
if(!row.equals(this))
{
if(parametervalue.equals(""))
{
parametervalue = row.map.get(parametername);
}
else if(parametervalue.equals(row.map.get(parametername)))
{
this.map.put(parametername, "");
for(SNMPv3 rowinside : snmpv3List)
{
if(!rowinside.equals(this))
{
this.map.put(parametername,this.map.get(parametername) + rowinside.map.get(parametername));
}
}
}
}
else{
System.out.println("Isnt it strange?");
}
}
}
}
}
然后它很正常。有人可以解释为什么会发生这种情况吗?
答案 0 :(得分:3)
我认为这条线的处理:
if (!row.equals(this))
您是在比较两个未实现equals方法的对象,这可能会导致一些奇怪的行为。
从java.lang.Object覆盖方法equals
以指定两个“SNMPv3”何时为equal。