【问题标题】:How to sort objects in a collection by the memory location?如何按内存位置对集合中的对象进行排序?
【发布时间】:2020-08-06 18:58:21
【问题描述】:
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中内存位置的差异?

【问题讨论】:

  • 这能回答你的问题吗? Memory address of variables in Java
  • 首先,如何定义“在内存中的位置”?内存不仅仅是一个具有整数索引的大数组,它是一个层次结构,从超快的寄存器到越来越慢的缓存、内存、磁盘等。其次,JVM 充当抽象层,所以这是不可能的。

标签: java sorting memory-address comparable


【解决方案1】:

对象的内存位置不适用于(纯)Java 程序。

即使您使用本机代码或Unsafe 来获取对象的位置,也不能保证 GC 不会移动它......没有任何通知。因此,如果您要按其内存地址对集合中的对象进行排序,则该集合将不会保持有序。

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

【讨论】:

    【解决方案2】:

    为什么要按内存地址对元素进行排序。你不能依赖它,因为它会随着时间而改变。 Read here

    【讨论】:

      猜你喜欢
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 2012-02-13
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多