package com.company;
import java.util.TreeSet;
public class Main {
public static class Node implements Comparable<Node>
{
public int value;
public Node(int value) {
this.value = value;
}
@Override
public int compareTo(Node node) {
// Memory location of this - memory location of node.
return 0;
}
}
public static void main(String[] args) {
TreeSet<Node> set = new TreeSet<>();
Node n = new Node(5);
set.add(n);
for (var node : set)
System.out.println(node.value);
}
}
我这里有一个 Node
类中插入节点。我希望能够将节点插入到一个 TreeSet
并按它们在内存中的位置进行排序。如何在函数中返回内存位置的差值?compareTo
?
对象的内存位置对(纯)Java程序来说是不可用的。
即使你使用本地代码或 Unsafe
来获取一个对象的位置,但不能保证GC不会在没有任何通知的情况下移动它。 因此,如果你按照内存地址对一个集合中的对象进行排序,这个集合将不会保持有序。
另一方面,你可以使用 System.identityHashCode(Object)
以获得一个32位的代码,在对象的生命周期内不会改变。 即使GC移动对象。
为什么你要按元素的内存地址来排序。你不能依靠它,因为它可以随着时间的推移而改变。阅读这里