6

无论如何我可以为JVM中的所有对象定义一个序列/顺序,以便对于任何两个不同的对象o1或o2,有一个明确定义的规则,即o1> o2或o2> o1和o1 == o2当且仅如果它们是同一个对象?

如果有无冲突保证(没有),identityHashCode() 比较将是一个不错的选择。

出生时间也可以——如果我能以某种方式获得的话。

有任何想法吗?

谢谢!

4

5 回答 5

3

如果您能够维护自己的对象存储库,则可以使用 aWeakHashMap<Object, Long>来维护自己的序列 ID。

于 2011-04-11T07:45:33.823 回答
2

您需要做的就是定义一个任意的稳定排序。(您的“对象出生时间”就是这样一个想法,但我认为它不会被存储)。

方法1:对于任何两个完全相同类型的对象,您可以通过比较它们各自的字段来定义这样的排序。如果所有字段都相同,则对象相等;如果不是,某些字段 f 是不同的,您可以根据基础类型定义排序。如果您有两个不同类型的对象,只需使用类型名称来定义顺序;名称按字典顺序较小的是“小于”。您可以实现每个类型的比较(可能需要做很多工作),或者您可以实现通用比较,使用反射来枚举字段名称和类型(以启用特定于类型的比较),尽管这可能会很慢。

方法 2:任何时候调用比较器时,缓存尚未在线性数组中遇到的任何对象。这样比较的任何对象现在在数组中都有一个索引位置;如果索引(o1)<索引(o2),则o1 <o2。您可能需要一个哈希表来将分配的索引位置与缓存的对象相关联。

方法 3:如果您正在处理对象的特定子集,并且存在规范生成树,则对生成树的每条边进行编号,以便子弧具有唯一编号。如果从生成树的根到 o1 的路径小于到 o2 的路径,则 o1 < o2。

于 2011-04-11T08:08:21.567 回答
1

您需要实现Comparable<YourObject>接口和compareTo(YourObject obj)方法。compareTo(..) 方法的约定是当这个对象小于作为参数传递的对象时返回 -1(-ve number),当它们相等时返回 0,当这个对象大于时返回 +1(+ve number)比其他对象。您可以使用您喜欢的任何字段来实现比较。

使用 Collections.sort() 或任何 list.sort() 将使用此比较器对列表进行排序。

希望这可以帮助!

于 2011-04-11T07:32:54.267 回答
0

如果您的对象属于同一类型,您可以在构造函数中记住它们的创建编号:

class A {
    private static long count = 0;
    private long objNumber;
    public A() {
        synchronized(A.class) {
            objNumber = count;
            count++;
        }
    }
}
于 2011-04-11T07:41:47.853 回答
0

Object.toString()方法应该以格式为不同的对象返回不同的值:

getClass().getName() + '@' + Integer.toHexString(hashCode())

那么你能先按字母顺序比较 getClass().getName(),然后再比较 hashCode() 吗?

于 2011-04-11T07:42:16.980 回答