Java 找到一个具体的实例,最好的方法是什么

Java 找到一个具体的实例,最好的方法是什么,java,filter,Java,Filter,假设我有两个类的实例: public class MyClass { public void sayHello() { System.out.println("Hello"); } } a = new MyClass(); b = new MyClass(); 现在我将这些添加到另一个对象,例如: public class OtherClass { private ArrayList<MyClass> myClsList = new Ar

假设我有两个类的实例:

public class MyClass {
    public void sayHello() {
         System.out.println("Hello");
    }
}

a = new MyClass();
b = new MyClass();
现在我将这些添加到另一个对象,例如:

public class OtherClass {
    private ArrayList<MyClass> myClsList = new ArrayList<>();

    public void add(MyClass obj) {
        myClsList.add(obj);
    }

    public void remove(MyClass obj) {
        // ????
    }
}

c = new OtherClass();

c.add(a);
c.add(b);
  • 我可以迭代它们并测试它们是否相等吗?我的意思是,这在理论上应该是可行的,因为这两个实例有不同的“内部指针”

  • 我想使用基于HashMap的方法会更有效,但我可以使用什么作为密钥(假设我不能添加唯一的实例ID或其他东西)

  • 编辑:关于我到底想知道什么,有一些困惑。 这里的关键是,我想知道是否有任何方法可以从c的ArrayList或我可能使用的任何聚合器对象中删除该特定实例,只需提供相应的对象引用。 我想这可以通过保持ArrayList和测试相等性来实现(虽然我不是100%确定),但是如果不需要遍历整个列表就可以实现,那么它会更干净。
    我只是想知道类似的东西在Java中是否可行。(我知道如何通过使用附加信息来解决这个问题,但线索是仅使用相应的对象引用进行过滤/检索。

    根据Java

    类对象的toString方法返回一个字符串,该字符串由 对象作为实例的类的名称,at符号 字符“@”和哈希的无符号十六进制表示形式 对象的代码

    这应该为类实例提供一个唯一标识符,因此可以将其用作哈希键,而无需存储/创建任何额外标识符


    注意:注意这个练习,不要依赖'Object.toString()返回的值,因为它与实际的对象地址有关,请参阅详细说明。

    而你的问题是许多初学者(包括我自己)都有的问题,我相信您的担心在这种情况下是没有道理的。您要求的功能已经在规范级别内置到Java语言中

    首先,让我们看一看。一方面

    方法equals定义了对象相等的概念,它基于值,而不是引用、比较

    但是,
    Object.equals()
    的文档明确指出

    Object
    equals
    方法在对象上实现了最有区别的等价关系;也就是说,对于任何非空引用值
    x
    y
    ,当且仅当
    x
    y
    引用同一对象时,此方法返回
    true
    x==y
    的值为
    true

    这意味着您可以安全地将
    OtherClass.remove
    重定向到任何对象。equals正在比较的对象与唯一ID完全相同。事实上,在许多(但不是所有)实现中,它将内存地址与唯一ID形式的对象进行比较

    可以理解的是,您不希望每次都使用线性迭代。事实上,
    对象
    的机制非常适合与a这样的东西一起使用,顺便说一下,这就是我建议您在本例中使用的解决方案

    如果您没有处理一些庞大的数据集,我们不需要讨论的优化。您只需要知道,它将实现任何必要的契约,以便正确使用
    对象。equals
    使其正确工作

    唯一的声明是

    方法
    hashCode
    与方法
    equals
    一起在诸如
    java.util.Hashmap
    的哈希表中非常有用

    这并不能说明什么,因此我们转向API参考。两个相关点是:

    • 如果根据equals(Object)方法两个对象相等,那么对两个对象中的每一个调用hashCode方法必须产生相同的整数结果
    • 如果根据
      等于
      java.lang.Object
      ),两个对象不相等,则不需要方法,然后对两个对象中的每个对象调用
      hashCode
      方法必须生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同的整数结果可能会提高哈希表的性能
    简单地说,相等对象的
    hashCode
    必须相同,但是相等的
    hashCode
    并不一定意味着相等的对象。
    Object
    实现了这个契约,因此您可以将它与
    HashSet
    一起使用,HashSet由
    HashMap
    支持

    缺少一条信息使其成为支持不做任何额外工作的正式论据,这就是为什么我一直引用API引用,好像它是语言规范一样。因为:

    如上所述,本规范通常涉及Java SE平台API的类。特别是,一些类与Java编程语言有特殊关系。示例包括类,如
    类加载器
    字符串
    线程
    ,以及包
    java.lang.reflect
    中的类和接口等。此规范限制此类类和接口的行为,但不提供完整的规范。读者可参考java SE平台API文档。

    [emphasis mine],但你明白了。就
    Object
    方法的行为而言,JavaSEAPI参考是语言规范

    另一方面,您可能不想使用类似的工具,因为这将要求您向实现中添加一组机器
    c.remove(a);