java - 在 Java 的 ArrayList 中使用包含的最佳方法?

标签 java arraylist contains

我在 Java 中有一个 ArrayList,它由包含两个字符串和一个整数的类型组成。我可以成功测试此 ArrayList 的一个元素是否等于另一个元素,但我发现 contains 方法失败。我相信这是因为我的类型不是原始类型。

现在我看到了两个替代方案,我想知道哪个是最好的选择:

  1. 通过遍历 ArrayList 并测试每个元素与我要查找的元素的相等性然后中断循环来实现我自己的 contains 方法。

  2. 或者使用我的类型的 HashMap 作为键,使用整数作为值而不是 ArrayList。在这里,我可以使用方法 containsKey 来检查某个元素是否已存在于 HashMap 中。

方法 #2 的唯一警告是在我的案例中该值在很大程度上是多余的。

最佳答案

很可能,您只是忘记了在您的类型中覆盖 equals()hashCode()equals()contains() 检查的内容。

来自Javadoc :

Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).

equals 的默认实现以来测试引用相等性,它不适合像这样的自定义数据类型。

(如果您没有重写 equalshashCode,使用您的类型作为 HashMap 中的键同样是徒劳的。)


编辑:请注意,要覆盖,您必须提供准确签名。

class MyDataType {
    public boolean equals(MyDataType other) { // WRONG!
        ...
    }
    public boolean equals(Object other) { // Right!
        ...
    }
}

这是使用 @Override 的一个非常有力的论据注解;如果使用 @Override 注释,第一个示例将在编译时失败。

关于java - 在 Java 的 ArrayList 中使用包含的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/986924/

相关文章:

c# - C#合并两个ArrayList

arrays - 无法在 Swift 中找到接受 'contains' 类型的参数列表的 '(Array<String!>, String)' 重载

带有对象的 Java 列表 - 如果具有特定属性的对象已存在,则查找并替换(删除)条目

java - 为什么 Impala 不能在 Spark SQL 写入后读取 parquet 文件?

java - OpenGL:关闭除我指定的以外的所有照明?

java - 基于变量而不是常量定义一维数组的元素数量

java - 用于 Java 的轻量级进程内分布式事务管理器?

java - 奇数和偶数的数组列表,停止于 -1

Java .contains 方法

java - 与 hamcrest 比较列表