如何根据内存位置对集合中的对象进行排序?

问题描述 投票:0回答:1
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 sorting memory-address comparable
1个回答
1
投票

对象的内存位置对(纯)Java程序来说是不可用的。

即使你使用本地代码或 Unsafe 来获取一个对象的位置,但不能保证GC不会在没有任何通知的情况下移动它。 因此,如果你按照内存地址对一个集合中的对象进行排序,这个集合将不会保持有序。

另一方面,你可以使用 System.identityHashCode(Object) 以获得一个32位的代码,在对象的生命周期内不会改变。 即使GC移动对象。


1
投票

为什么你要按元素的内存地址来排序。你不能依靠它,因为它可以随着时间的推移而改变。阅读这里

© www.soinside.com 2019 - 2024. All rights reserved.