如果哈希码等于实现不正确,我的对象创建会失败吗?

拉胡尔·希夫沙兰(Rahul Shivsharan):

我想创建一个可以由“客户编号”唯一标识的“客户”类。

我写了下面的代码

public class Customer{
    private Integer customerNo;
    private String customerName;
    
    public Customer(Integer customerNo, String customerName){
        this.customerNo = customerNo;
        this.customerName = customerName;
    }
    
    @Override
    public int hashCode(){
        return this.customerNo;
    }
    
    public Integer getCustomerNo(){
        return this.customerNo;
    }

    public String getCustomerName(){
       return this.customerName;
    }
    
    @Override
    public boolean equals(Object o){
        Customer cus = (Customer) o;
        return (this.customerNo == cus.getCustomerNo() && this.customerName != null && this.customerName.equals(cus.getCustomerName()));
    }
    
    @Override
    public String toString(){
        StringBuffer strb = new StringBuffer();
        strb.append("Customer No ")
            .append(this.customerNo)
            .append(", Customer Name ")
            .append(this.customerName)
            .append("\n");
        return strb.toString(); 
    }       
    
    public static void main(String [] args){
        Set<Customer> set = null;
        try{
            set = new HashSet<Customer>();
        
            set.add(new Customer(1,"Jack"));
            set.add(new Customer(3,"Will"));
            set.add(new Customer(1,"Tom"));
            set.add(new Customer(3,"Fill"));
        
            System.out.println("Size "+set.size());
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

从上面的代码中,您可以看到我将哈希码作为客户编号返回。

我的平等也基于客户编号和客户名称

如果我运行上面的代码,输出将是

D:\Java_Projects>java Customer
Size 4

D:\Java_Projects>

输出是由相同客户编号创建的4个对象。原因是即使客户编号为0。相同,但名称不同,根据我上面基于“客户编号”和“客户名称”的“等于”实现方式。作为CustomerNo-CustomerName的4种不同组合,因此创建了4个对象。

我的问题是

我上面的哈希码实现是不好的做法吗?

我会遇到什么失败?

如果我与同一个客户一起创建500,000个Customer对象,该怎么办?

是否将500,000个客户对象放在同一个存储桶中?

乔尼:

我上面的哈希码实现是不好的做法吗?

假设不同的客户在customerNo大多数时间都有不同的情况,这是一个很好的实现。在现实世界的应用程序中,customerNo最有可能是唯一标识符,唯一性由数据库约束保证。

我会遇到什么失败?

你还没有处理,其中的情况customerNonull这是一种方法:

public int hashCode(){
    return Objects.hash(customerNo);
}

当这将返回0 customerNonull

equals方法还有另一个错误Integer不应将对象与进行比较==,这会给您带来意想不到的结果。此外,customerName设置为的两个客户null永远都不相等。Objects.equals方法解决了这些问题。

return Objects.equals(this.customerNo, cus.customerNo) 
          && Objects.equals(this.customerName, cus.customerName);

如果我与同一个客户一起创建500,000个Customer对象,该怎么办?是否将500,000个客户对象放在同一个存储桶中?

在这种情况下,所有对象实际上都将放置在同一存储桶中。HashSet将其简化为链表数据结构,并且性能会很差:要找到客户对象,数据结构必须在最坏的情况下将给定对象与每个对象进行比较。

如果Customer实现Comparable,则哈希表存储桶可以使用二进制搜索树而不是链接列表,并且性能不会受到严重影响。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将对象的哈希码定义为所有类变量哈希码的总和,乘积或其他乘积是不正确的吗?

如果我在旋转设备时调用 `insertRows`,UITableView 会崩溃“释放对象的校验和不正确”

我导出的对象不正确吗?JS新手不理解为什么测试失败

bcrypt生成不正确的哈希-我的用户输入处理正确吗?

哈希码和等于实现

为什么我的 Rust StackDFS 实现会产生不正确的结果?

我使用文件不正确吗?

JAXB对象-哈希码等于

如果语句未按预期评估。我的变量设置不正确吗?

如果密码不正确,我无法在文本框下方创建元素

无法重新分配对象键值-我的语法不正确吗?

我使用接口不正确地实现了ValueEventListener

JSON CloudFormation格式不正确。我的JSON文件不正确吗?

哈希码和等于对象引用?

获取锁定的AD用户列表会引发错误。我使用的搜索词不正确吗?

如何比较集合中包含的对象?什么是良好的哈希码并等于此处的实现?

Ruby on Rails 设计 Bootstrap Recaptcha 错误在验证码失败时显示不正确

我在golang上使用通道不正确吗?

模块中的 Eclipse 错误,我格式不正确吗?

当我使用Double时计算不正确吗?

我在Java中执行的操作顺序不正确吗?

我使用的软件包不正确吗?

我使用@font face的方式不正确吗?

为什么我的列表中的对象数目不正确?

对象更新不正确

@EnvironmentObject创建不正确

由于哈希值不正确,从FreeBSD 10.1升级到10.2失败

哈希测试失败,因为输入字符串的格式不正确

基于对象类的哈希码实现