Как отсортировать объекты в коллекции по расположению в памяти? - PullRequest
0 голосов
/ 23 апреля 2020
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?

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Расположение объекта в памяти недоступно (чистой) программе Java.

Даже если вы используете собственный код или Unsafe для определения местоположения объекта, нет гарантии, что G C не переместит его ... без какого-либо уведомления. Поэтому, если бы вы упорядочили объекты в коллекции по их адресу в памяти, коллекция не была бы упорядочена.

С другой стороны, вы могли бы использовать System.identityHashCode(Object), чтобы получить 32-битный код, который не изменится на весь срок службы объекта. Даже если G C перемещает объект.

1 голос
/ 23 апреля 2020

Почему вы хотите упорядочить элементы по их адресу памяти. Вы не можете полагаться на это, потому что со временем оно может измениться. Читать здесь

...