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