簡體   English   中英

object.equals方法如何在Java中工作?

[英]How does object.equals method is supposed to work in Java?

這是我的源代碼。 我試圖實現一個向用戶提出問題並希望答案為“是”或“否”的簡單程序,並且只有當用戶回答“是”或“否”時才終止。 我建議我不要使用==比較並使用equals方法,以便程序可以理解用戶是否輸入“是”而不是“是”。 但是以這種方式結果是相同的,並且該方法似乎比較用戶的答案,如果它恰好是“是”或“否”。 它不接受例如“否”的aswer。 那種方法合乎邏輯嗎? 它應該以這種方式工作嗎? 如何更改程序以接受“是”“你是”“否”“否”等答案? 我很感激你的幫助:)

import acm.program.*;

public class YesNoExample extends ConsoleProgram{
public void run(){
    while(true){
    String answer = readLine("Would you like instructions? ");
    if(askYesNoQuestion(answer)){
        break;
    }
    println("Please answer yes or no.");
    }
}

private boolean askYesNoQuestion(String str){
    if(str.equals("yes")||str.equals("no")){
        return true;
    }else{
        return false;
    }
}

}

如果你使用==你將比較兩個String對象的引用 (內存指針)。 如果使用equals ,將運行String類中的自定義方法,進行一些“智能”比較,在這種情況下,檢查字符是否完全相同,並且整個事物具有相同的長度。

如果你想支持大小寫混合字母,你可以使用"someString".equalsIgnoreCase("SoMeString") (它將返回true)。 通過使兩個字符串小寫(所以情況無關緊要)並使用equals比較它們來完成(粗略地說)。

編輯:其他海報讓我意識到,除了大寫之外,你還想尋找空間無關緊要的字符串相等。 如果是這種情況,將一切變為小寫的類似技巧適用於你首先刪除所有空格,正如@LouisWasserman在他的回答中所說的那樣

如果你需要模糊識別是/否,首先你需要確切的規則來確定匹配。 根據您的示例,我可以建議:

private boolean askYesNoQuestion(String str) {
  str = str.replace(" ", "").toUpperCase();
  return str.equals("YES") || str.equals("NO");
}

如果對最佳性能感興趣而在可懂度方面根本不感興趣,請使用:

private static final Pattern p = 
    Pattern.compile("y\\s*e\\s*s|n\\s*o", Pattern.CASE_INSENSITIVE);
private boolean askYesNoQuestion(String str) {
  return p != null && p.matcher(str.trim()).matches();
}

== vs .equals()語義

首先,你誤解了語義。

==測試對象標識。 A == B表示A是與B完全相同的對象的引用。

.equals()應用自定義邏輯來測試對象是否以某種邏輯方式相等,而不是完全相同的對象。 為了正確實現,兩個對象也應該具有相同的.hashCode()值。

慣用Java解決方案

由於String對象是final ,這意味着它不能繼承。 您不能覆蓋String對象上的.equals()

您需要做的是將輸入預處理為可以使用.equalsIgnoreCase()直接與目標值進行比較的內容。

執行此操作的一種方法是使用answer.replaceAll("\\\\s","")刪除所有空格,然后可以使用.equalsIgnoreCase()將其與目標String文字進行.equalsIgnoreCase()

替換askYesNoQuestion()更好方法是:

private boolean isAnswerYesOrNo(final String answer)
{
    final String input = answer.replaceAll("\\s","");
    return "yes".equalsIgnoreCase(input) || "no".equalsIgnoreCase(input);
}

如果輸入參數恰好為null則將literal與輸入參數進行比較將使您與NullPointerExceptions隔離.equalsIgnoreCase() can never throw a NullPointerException。 這是慣用的Java。

得到一本更好的書

如果真的說出你聲稱它的內容,那本書就沒有用。 此外,它教你編寫大量代碼來處理錯誤的輸入,當這是一個完整的反模式和一個精心設計的程序將退出時,對確切問題的詳細解釋是可以做什么來修復輸入。

通過上面詳細描述的==和.equals的解釋,這里有一個兩個例子,可以進行你想要的比較。

if ( Pattern.matches("\\s*[yY]\\s*[eE]\\s*[sS]\\s*", input) ) {
  // do something
}


if ( input.replaceAll("\\s", "").equalsIgnoreCase("yes") ) {
  // do something
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM