【发布时间】:2021-06-02 15:05:42
【问题描述】:
假设我有两个相互指向的 ArrayList(循环引用):
x = createObject("java", "java.util.ArrayList").init();
y = createObject("java", "java.util.ArrayList").init();
x.add(y);
y.add(x);
如果我在其中任何一个上调用hashCode,它会导致StackOverflowError due to the ArrayList implementation。这是意料之中的。
但是,当我调用System.identityHashCode 时,它不应该使用Object.hashCode 实现,它不会跟随ArrayList 中的元素,因此不会导致StackOverflowError?
Documentation of identityHashCode 状态:
为给定对象返回与返回相同的哈希码 通过默认方法 hashCode(),无论给定对象的 类覆盖 hashCode()。
在 Adobe ColdFusion 中,此代码可以正常工作:
System = createObject("java", "java.lang.System");
System.identityHashCode(x); // returns some integer
System.identityHashCode(y); // returns another integer
(这显然也适用于本地编译并使用 Java 运行。)
然而,在 Lucee 中,它会立即导致 StackOverflowError:
lucee.runtime.exp.NativeException: java.lang.StackOverflowError
at java.base/java.util.ArrayList.hashCodeRange(ArrayList.java:627)
at java.base/java.util.ArrayList.hashCode(ArrayList.java:614)
at java.base/java.util.ArrayList.hashCodeRange(ArrayList.java:627)
at java.base/java.util.ArrayList.hashCode(ArrayList.java:614)
[...]
为什么在这里运行hashCode的ArrayList实现?
两个 CFML 引擎在相同的 servlet (Tomcat 9) 上运行相同的 JVM (HotSpot) 和 Java 版本 (11)。我想了解为什么他们的行为不同。
【问题讨论】:
标签: java arraylist coldfusion lucee