如何按内存位置对集合中的对象进行排序?
How to sort objects in a collection by the memory location?
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
class。我希望能够将节点插入 TreeSet
并按它们在内存中的位置对它们进行排序。我如何 return 函数 compareTo
中内存位置的差异?
为什么要按内存地址对元素进行排序。你不能依赖它,因为它会随着时间而改变。 Read here
对象的内存位置不可用于(纯)Java 程序。
即使您使用本机代码或 Unsafe
获取对象的位置,也不能保证 GC 不会移动它...恕不另行通知。因此,如果您要按内存地址对集合中的对象进行排序,则该集合将不会保持有序。
另一方面,您可以使用 System.identityHashCode(Object)
获得一个在对象的生命周期内不会改变的 32 位代码。即使GC移动了对象。
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
class。我希望能够将节点插入 TreeSet
并按它们在内存中的位置对它们进行排序。我如何 return 函数 compareTo
中内存位置的差异?
为什么要按内存地址对元素进行排序。你不能依赖它,因为它会随着时间而改变。 Read here
对象的内存位置不可用于(纯)Java 程序。
即使您使用本机代码或 Unsafe
获取对象的位置,也不能保证 GC 不会移动它...恕不另行通知。因此,如果您要按内存地址对集合中的对象进行排序,则该集合将不会保持有序。
另一方面,您可以使用 System.identityHashCode(Object)
获得一个在对象的生命周期内不会改变的 32 位代码。即使GC移动了对象。