当前位置: 首页 > 面试题库 >

是否有可能在Java中制作类似Comparator的内容,但用于实现自定义的equals()和hashCode()

公孙胡媚
2023-03-14
问题内容

我有一个对象数组,我想将其与另一个对象数组连接起来,除了具有相同ID的对象。该对象在系统中的许多地方都使用过,没有哈希码或实现的等式。因此,我不想实现hashCode()and
equals(),因为我担心会破坏使用该对象的系统中的某个地方,而我对此一无所知。

我想将所有这些对象放在集合中,但是以某种方式使这些对象使用custom hashCode()equals()。类似于custom
Comparator,但等于。


问题答案:

是的,可以这样做。但这不允许您将对象放入HashMap,HashSet等中。这是因为标准集合类期望关键对象提供equalshashCode方法。(这就是他们设计工作的方式…)

备择方案:

  1. 实现一个包装器类,该包装器类包含真实类的实例,并提供其自己的equals和实现hashCode

  2. 实现自己的基于哈希表的类,这些类可以使用“可哈希”对象来提供等于和哈希码功能。

  3. 咬一下子弹,在相关类上实现equalshashCode覆盖。

实际上,第三个选项可能是最好的,因为您的代码库很可能 需要
使用一致的概念来表示这些对象相等。还有其他一些事情表明您的代码需要大修。例如,它当前正在使用对象数组而不是Set实现来表示显然是集合的事实。

另一方面,当前的实现可能有一些真实的(或想象中的)性能原因;例如减少内存使用。在这种情况下,您可能应该编写一堆辅助方法来执行诸如将2个表示为数组的集合连接在一起的操作。



 类似资料:
  • 问题内容: 我正在探索批注,并得出了一些批注似乎在其中具有层次结构的观点。 我正在使用注释在Cards的后台生成代码。卡的类型不同(因此代码和注释也不同),但是其中某些特定的元素(例如名称)是相同的。 这就是常见的注释: 在上面的示例中,我希望Move可以继承method3,但会收到一条警告,指出扩展对注释无效。我试图让Annotation扩展一个通用的基数,但这是行不通的。那有可能还是仅仅是设计

  • 声明函数以映射值并在存在值时使用它们是很方便的。 在您有几个强制对象和几个可选对象的情况下,我发现自己将其他对象包装为可选对象。也可以使用(mandatoryObject),这样我就可以在它们上使用相同的表达式,而不必全部倒写。 但是我不喜欢这个代码: 所以我把它包装起来: 但这是错误的,因为蔬菜(在这个例子中)实际上不是可选的。它们非常重要,我只是给每个人的印象是它们是可选的。 所以我的问题是:

  • 问题内容: 您好,我正在命令行应用程序上工作,它可以接受命令行参数,例如 我正在寻找可以返回我对选项及其对应值的函数,例如c中的getopt。 问题答案: 那里有很多针对Java的命令行解析器库。 picocli是最近(截至2019年末)具有许多功能和特性的命令行解析器。 一些较老的流行类是commons- cli (相当古老),args4j和JCommander。

  • 问题内容: 在C#中,您可以将一个类标记为,以便只能从同一包中对其进行访问。Java有什么类似的东西吗? 问题答案: 您可以通过从类的声明中省略安全修饰符(公共,私有)来创建程序包专用类。

  • 问题内容: 我进入字节和对象类型的函数消息数组,我需要从字节恢复对象。Java中是否有像C ++一样的类型转换? 问题答案: 不,您可以使用序列化。

  • 问题内容: 我正在写a 来检查许多文件中某些变量的存在以及检查那些变量的某些值的存在。但是,我的代码由于遇到无效的变量名而停止执行。 我知道我将Java和Stata编码混合在一起,这是完全不合适的,但是有什么办法可以执行以下操作: 问题答案: 简短的回答是。稍长一点的答案是,通过类比猜测语法可能成功的可能性很小。最好阅读Stata的文档,例如,从略读[P]手册中的主要条目开始。 这里被困的问题是不