来自Java文档:
注意:虽然允许列表包含自身作为元素,但极其谨慎:在这样的列表上,equals和hashCode方法不再定义良好。
问题在于List对象的哈希码是递归计算的。
int hashCode = 1;
for (E e : list)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
问题是如何使我的代码傻瓜化并检测List对象(或其某些项甚至更深层次的对象)是否包含List对象本身。
在遍历List对象时如何保持List对象的列表并能够调用类似contains()的方法?保留System.identityHashCode(object)并测试它是否足够好?
equals
或hashCode
调用开始时,您可以检测列表是否已经处于中间状态,但在多线程环境中使其正常工作可能会变得棘手。如果您需要使用ArrayList之类的东西,那么这是否可行取决于您需要处理什么类型的元素。如果列表元素具有包含您的列表的私有字段,则您可能永远不会知道。 - user2357112