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);
我只是想知道类似的东西在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);