1. 程式人生 > >String類重寫的equals方法,比較的是字元序列,比較物件不是字串時,注意使用toString()方法

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​()方法才是物件的字串表示形式。

  • public String toString​()
  • 返回物件的字串表示形式。