Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-在不同类型的对象上实现equals_Java_Comparison_Equals - Fatal编程技术网

Java-在不同类型的对象上实现equals

Java-在不同类型的对象上实现equals,java,comparison,equals,Java,Comparison,Equals,假设我有一个名为Customer的实体和一个名为CustomerMapper的助手类,它从表单中获取值。然后我将这个CustomerMapper发送到服务层,在那里我从getter中提取值,并将一个新客户添加到数据库中 但是现在我需要迭代一个列表,并检查customerID是否包含在另一个数组列表中。我了解到.contains()方法调用元素上的.equals()。。所以我想知道在Customer上实现equals()是否正确,我将发送CustomeMapper类型的对象,并将Customer.

假设我有一个名为Customer的实体和一个名为CustomerMapper的助手类,它从表单中获取值。然后我将这个CustomerMapper发送到服务层,在那里我从getter中提取值,并将一个新客户添加到数据库中

但是现在我需要迭代一个
列表
,并检查customerID是否包含在另一个
数组列表
中。我了解到.contains()方法调用元素上的.equals()。。所以我想知道在Customer上实现equals()是否正确,我将发送CustomeMapper类型的对象,并将Customer.getId()与customerMapper.customerId()进行比较

如果答案是否定的,请详细说明原因

编辑:


这就是我想到的。我已经遍历了两个ArraList并创建了
Map
Map
。基本上,我需要删除其ID不包含在
映射中的所有客户。现在我迭代
Map
并调用
Map.contaisKey(currentElement)。
这是一个好的解决方案,因为这样我有三个for循环。

否,您应该只实现
equals
来为相等的对象返回
true
。研究
equals
上的Javadoc,特别是它所施加的关系必须具有哪些属性,例如对称性、传递性和反射性。我认为您计划的实现至少在前两个方面会失败,也许在最后一个方面也会失败。您只需编写一个显式循环来测试所有成员的标准

关于您当前的解决方案:
使用地图不是太过分了吗?我建议将
id
s从
CustomerMapper
s收集到
HashSet
中,并在
Customer
s的过滤循环中使用该集合。顺便说一句,使用
equals
不会降低时间复杂度;循环只会隐藏在
contains
方法调用后面,从而导致总的O(n2)复杂性。由于O(1)散列查找,使用Set/Map的解决方案实际上不太复杂。
总体复杂度仅为O(n)。

否,您应该只实现
equals
以返回相等对象的
true
。研究
equals
上的Javadoc,特别是它所施加的关系必须具有哪些属性,例如对称性、传递性和反射性。我认为您计划的实现至少在前两个方面会失败,也许在最后一个方面也会失败。您只需编写一个显式循环来测试所有成员的标准

关于您当前的解决方案:
使用地图不是太过分了吗?我建议将
id
s从
CustomerMapper
s收集到
HashSet
中,并在
Customer
s的过滤循环中使用该集合。顺便说一句,使用
equals
不会降低时间复杂度;循环只会隐藏在
contains
方法调用后面,从而导致总的O(n2)复杂性。由于O(1)散列查找,使用Set/Map的解决方案实际上不太复杂:总体复杂度只有O(n)。

实现
equals()
方法没有意义,因为两个对象不相等


只需提取
id
并检查
CustomerMapper
是否具有相同的id。

实现
equals()
方法没有意义,因为这两个对象不相等


只需提取
id
并检查
CustomerMapper
是否具有相同的id。

我不会这样做。考虑集合的任何其他用途,例如
java.util.Set
。您可以运行以下代码:

Set<Object> customerLikeObjects = new HashSet<Object>();
customer.add(new CustomerMapper(13));

if (customer.contains(new Customer(13))) {
    // Run some code
}
Set customerLikeObjects=newhashset();
添加(新CustomerMapper(13));
if(customer.contains(新客户(13))){
//运行一些代码
}
条件应检查ID为13的客户是否已在集合中,然后运行一些代码。但事实上,集合中并不包含客户,而是一些“相似”的对象。事实上,你甚至不会在一个集合中混合这两种对象类型,对吗


虽然这个“聪明”的解决方案似乎可以解决您的问题,但最终会让您感到非常困惑。事实上,任何“聪明”但感觉不对劲的事情都是一个非常糟糕的主意。

我不会这么做。考虑集合的任何其他用途,例如
java.util.Set
。您可以运行以下代码:

Set<Object> customerLikeObjects = new HashSet<Object>();
customer.add(new CustomerMapper(13));

if (customer.contains(new Customer(13))) {
    // Run some code
}
Set customerLikeObjects=newhashset();
添加(新CustomerMapper(13));
if(customer.contains(新客户(13))){
//运行一些代码
}
条件应检查ID为13的客户是否已在集合中,然后运行一些代码。但事实上,集合中并不包含客户,而是一些“相似”的对象。事实上,你甚至不会在一个集合中混合这两种对象类型,对吗

虽然这个“聪明”的解决方案似乎可以解决您的问题,但最终会让您感到非常困惑。事实上,任何“聪明”但不知何故感觉不对的东西都是一个非常糟糕的主意。

因为“equals”方法签名看起来像是
公共布尔equals(Object that)
您可以在任何类型的对象之间实现比较。可能你需要添加一些类似的内容

if (that instanceof CustomerMapper){
//do your comparison here
}
在方法实现中

instanceof
的速度相当慢。

因为“equals”方法签名看起来像是
公共布尔等于(对象)
您可以实现任何类型对象之间的比较。可能你需要添加一些类似的内容

if (that instanceof CustomerMapper){
//do your comparison here
}
在方法实现中


然而,
的instanceof
是一个相当慢的实例。

以这种方式覆盖equals是“错误”的,因为它会破坏和