确定两个对象是否包含对同一对象的引用

时间:2014-03-10 18:41:09

标签: java algorithm

我想确定对象中的字段是否包含任何指针别名?

例如:

class A {
    A a1;
    A a2;
}

A z = new A();

A y = new A();
y.a1 = z;
y.a2 = z;

A x = new A();
x.a1 = y;
x.a2 = z;

// i.e. x has a reference to y and to z, and y has a reference to z

在这个例子中,我想确定对象x包含指针别名,因为x.a1.a1 == x.a2

我的想法是使用反射来迭代对象的引用字段,并且对于每个字段,通过遍历存储引用的每个字段来构建一组引用(即将每个引用展平为一组引用)。然后我会看看这些集合的交集。 这是我的问题的一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

如果我理解您的需要,那么您需要的是IdentityHashSet

public static boolean hasLoops(final A a)
{
    if (a.a2 == null)
         return false;
    final Set<A> set = new IdentityHashSet<>();
    set.add(a.a2);
    A other = a.a1;
    while (other != null) {
        if (!set.add(other))
            return true;
        other = other.a1;
   }
   return false;
}

由于你想要相同引用的相等性,IdentityHashSet就是你想要的;虽然如果你没有实施.equals().hashCode(),那么“常规”HashSet也可以做到这一点。