首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

【Java 每日一題】20170220:List 與 Map 包含判斷陷阱

     編輯:Java 相關知識

題目代碼

package Feb2017;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Ques0220 {
    public static void main(String[] args) {
        List<Student> list = new ArrayList<Student>();
        list.add(new Student("001"));

        Map<Student, Object> map = new HashMap<Student, Object>();
        map.put(new Student("001"), new Object());

        System.out.println("list是否包含001:" + list.contains(new Student("001")));
        System.out.println("map是否包含001:" + map.containsKey(new Student("001")));
    }
}

class Student {
    private String stuId;
    public Student(String stuId) { this.stuId = stuId; }
    public String getStuId() { return stuId; }
    public void setStuId(String stuId) { this.stuId = stuId; }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Student) {
            Student stu = (Student) obj;
            if (stu.getStuId() == null || stuId == null) return false;
            return stuId.equalsIgnoreCase(stu.getStuId());
        }
        return false;
    }
    // 注意:未重寫 hashCode()
}

問題分析

Student 重寫了 equals() 但未重寫 hashCode()。這會導致:

  • List.contains():遍歷調用 equals(),返回 true。
  • Map.containsKey():先比較 hashCode(),默認基於對象地址,新創建的 Student("001") 與 map 中的 key hashCode 不同,直接返回 false,不會調用 equals()。

運行結果

list是否包含001:true
map是否包含001:false

核心教訓

重寫 equals() 時必須重寫 hashCode(),否則在基於哈希的集合(HashMap、HashSet 等)中會出現邏輯錯誤。

正確做法:

@Override
public int hashCode() {
    return stuId == null ? 0 : stuId.toLowerCase().hashCode();
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved