String類重寫的equals方法,比較的是字元序列,比較物件不是字串時,注意使用toString()方法
阿新 • • 發佈:2018-11-15
今天幫同事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類的,原方法比較的是兩個物件是否為統一記憶體地址,對於任何非空參考值x
和y
,當且僅當x
和y
引用相同物件( 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()
- 返回物件的字串表示形式。