无论如何,我可以为JVM中的所有对象定义序列/顺序,以便对于任何两个不同的对象o1或o2,有一个明确定义的规则,表示o1> o2或o2> o1和o1 == o2当且仅当它们是同一个对象时?
identityHashCode()比较将是一个很好的候选者,如果有无碰撞保证(没有)。
出生时间也会起作用 - 如果我能以某种方式获得它。
有什么想法吗?
谢谢!
答案 0 :(得分:3)
如果您可以维护自己的对象存储库,则可以使用WeakHashMap<Object, Long>
来维护自己的序列ID。
答案 1 :(得分:2)
您需要做的就是定义任意稳定的顺序。 (你的“对象出生时间”是 一个这样的想法,但我不认为它是存储的。)
方法一: 对于具有相同确切类型的任何两个对象,您可以通过比较来定义这样的排序 他们各自的领域。如果所有字段都相同,则对象相等;如果不, 某些字段f不同,您可以根据基础类型定义排序。 如果您有两个具有不同类型的对象,只需使用类型名称来定义顺序;该 名字按字典缩小的名称是“小于”。您可以实现每种类型的比较 (可能是很多工作)或者你可以实现一个通用比较使用反射 枚举字段名称和类型(以启用特定于类型的比较),尽管这可能 很慢。
方法2: 无论何时调用比较器,都要缓存线性阵列中尚未遇到的任何对象。 这样比较的任何对象现在在数组中都有一个索引位置; o1&lt; o2如果索引(o1)&lt;指数(O 2)。 您可能需要一个哈希表来将指定的索引位置与缓存的对象相关联。
方法3: 如果您正在处理对象的特定子集,并且有规范 生成树,然后对生成树的每个边缘进行编号,使子节点成为弧形 有独特的数字。然后o1&lt; o2如果从生成树的根路径到o1, 小于o2的路径。
答案 2 :(得分:1)
您需要实现Comparable<YourObject>
接口和compareTo(YourObject obj)
方法。 compareTo(..)方法的契约是当此对象小于作为参数传递的对象时返回-1(-ve number),当它们相等时返回0,当此对象更大时返回+1(+ ve数)比其他对象。您可以将比较用于使用您喜欢的任何字段。
使用Collections.sort()或任何list.sort()将使用此比较器对列表进行排序。
希望这有帮助!
答案 3 :(得分:0)
如果您的对象属于同一类型,则可以在构造函数中记住它们的创建编号:
class A {
private static long count = 0;
private long objNumber;
public A() {
synchronized(A.class) {
objNumber = count;
count++;
}
}
}
答案 4 :(得分:0)
Object.toString()
方法应该以格式为不同的对象返回不同的值:
getClass().getName() + '@' + Integer.toHexString(hashCode())
那么你可以先按字母顺序比较getClass()。getName(),然后是hashCode()吗?