String类重写的equals方法,比较的是字符序列,比较对象不是字符串时,注意使用toString()方法

今天帮同事debug,问题描述:判断相应条件之后,没有按照预想的结果接入if语句中;

其代码如下:

Map<String, Object> alarmByAlarmNum = alarmMapper.getAlarmByDeviceNumber(deviceNumber);

.....


 if(alarmByAlarmNum==null||alarmByAlarmNum.size()<=0||"1".equals(alarmByAlarmNum.get("alarm_state"))){
                            //发送告警
                            sendDeviceWarn(lonLat,alarmNum,deviceMap,deviceNumber,deviceType);
                        }

由于本地操作无法开启debug模式,加输出语句如下,在服务器观察输出情况:

Map<String, Object> alarmByAlarmNum = alarmMapper.getAlarmByDeviceNumber(deviceNumber);

.....

System.out.println(alarmByAlarmNum.get("alarm_state")); //输出 1

 if(alarmByAlarmNum==null||alarmByAlarmNum.size()<=0||"1".equals(alarmByAlarmNum.get("alarm_state"))){
                            //发送告警
                            sendDeviceWarn(lonLat,alarmNum,deviceMap,deviceNumber,deviceType);
                        }

上面打印输出1,下面比较后却没有进入if方法体,问题就出来了,“1”和输出的那个“1”,比较结果出问题了。

我随手加上.toString(),问题解决。

Map<String, Object> alarmByAlarmNum = alarmMapper.getAlarmByDeviceNumber(deviceNumber);

.....

System.out.println(alarmByAlarmNum.get("alarm_state")); //输出 1

 if(alarmByAlarmNum==null||alarmByAlarmNum.size()<=0||"1".equals(alarmByAlarmNum.get("alarm_state").toString())){
                            //发送告警
                            sendDeviceWarn(lonLat,alarmNum,deviceMap,deviceNumber,deviceType);
                        }

那么究竟是为什么出现这个问题的呢?这还得从equals方法说起:

1、equals方法是Object类的,原方法比较的是两个对象是否为统一内存地址,对于任何非空参考值xy ,当且仅当xy引用相同对象( x == y具有值true )时,该方法返回true

2、String中重写了这个方法,public boolean equals​(Object anObject)

将此字符串与指定对象进行比较。 如果且仅当参数不是null且是表示与该对象相同的字符序列的String对象时,结果为true

3、也就是说,在上面的代码中,只有当 alarmByAlarmNum.get("alarm_state") 代表的是“1”这个字符串序列的时候,结果才是true,那么明明输出的是“1”啊,为什么还是false呢?  原因就在于

  • public void println​(Object x)
  • 打印一个对象,然后终止该行。 此方法首先调用String.valueOf(x)来获取打印对象的字符串值,然后表现为调用print(String)然后println()

4、这里容易造成误解的就是输出的结果看起来一样,但是实际alarmByAlarmNum.get("alarm_state")代表的是一个对象,而调用Object 的toString​()方法才是对象的字符串表示形式。

扫描二维码关注公众号,回复: 4084628 查看本文章
  • public String toString​()
  • 返回对象的字符串表示形式。

猜你喜欢

转载自blog.csdn.net/ejiao1233/article/details/81489278