[英]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()
值。
由於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.