Как пользовательский объект хранится в HashMap - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть проблема в понимании кода ниже, как heavenlyBody.addSatellite(satellites ); добавляется в HashMap?

, когда HeavenlyBody planet1 = solarSystem.get("Mars"); называется planet1.getSatellites () возвращает спутники Фобос и Деймос для pl anet Марс и спутник Луны для растений Земли.

У меня вопрос, как Фобос и Деймос добавляются к ключу Марса в солнечной системе HashMap?

   public class Main {

    public static void main(String[] args) {

        Map<String, HeavenlyBody> solarSystem = new HashMap<>();

        // Create Planet
        HeavenlyBody heavenlyBody = new HeavenlyBody("Mars", 10.2);
        solarSystem.put(heavenlyBody.getName(), heavenlyBody);

        // Create Satellite
        HeavenlyBody satellites  = new HeavenlyBody("Phobos", 01.2);
        solarSystem.put(satellites .getName(), satellites );
        heavenlyBody.addSatellite(satellites );

        // Create Satellite
        satellites  = new HeavenlyBody("Deimos", 01.2);
        solarSystem.put(satellites .getName(), satellites );
        heavenlyBody.addSatellite(satellites );

        heavenlyBody = new HeavenlyBody("Earth", 365);
        solarSystem.put(heavenlyBody.getName(), heavenlyBody);

        satellites  = new HeavenlyBody("Moon", 27);
        solarSystem.put(satellites .getName(), satellites );
        heavenlyBody.addSatellite(satellites );

        // Get the List of Satellites for Planet Mars and Earth
        HeavenlyBody planet1 = solarSystem.get("Mars");
        System.out.println("Planet :" + planet1.getName());
        for (HeavenlyBody satellite : planet1.getSatellites()) {
            System.out.println(" \t" + satellite.getName());
        }

        HeavenlyBody plant2 = solarSystem.get("Earth");
        System.out.println("Planet :" + plant2.getName());
        for (HeavenlyBody satellite : plant2.getSatellites()) {
            System.out.println(" \t" + satellite.getName());
        }
    }
}

HeavenlyBody. java

public class HeavenlyBody {

    private String planetName;
    private double orbitalPeriod;

    private Set<HeavenlyBody> satellites;

    public HeavenlyBody(String planetName, double orbitalPeriod) {
        super();
        this.planetName = planetName;
        this.orbitalPeriod = orbitalPeriod;
        this.satellites = new HashSet<>();
    }

    public Set<HeavenlyBody> getSatellites() {
        return new HashSet<>(this.satellites);
    }

    public String getName() {
        return planetName;
    }

    public double getOrbitalPeriod() {
        return orbitalPeriod;
    }

    public void addSatellite(HeavenlyBody satellite) {
        this.satellites.add(satellite);
    }
}

output:

Planet :Mars
    Phobos
    Deimos
Planet :Earth
    Moon

Может, кто-нибудь объяснит, как ссылка на объект выделяется для объекта и с помощью диаграммы, или как спутники добавлены в HashMap?

1 Ответ

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

In solarSystem.put(heavenlyBody.getName(), heavenlyBody); ключ Mars помещается в карту ha sh со значением heavenlyBody. Таким образом, значение ссылается на объект, связанный с Марсом.

В

HeavenlyBody satellites  = new HeavenlyBody("Phobos", 01.2);
solarSystem.put(satellites .getName(), satellites );
heavenlyBody.addSatellite(satellites );

сначала создается спутник Фобос, затем он помещается в карту ha sh с ключом Фобос и объект satellites как объект. Тогда в heavenlyBody.addSatellite(satellites ); переменная heavenlyBody все еще является ссылкой на Марс, и она просто добавляется туда как спутник. Соответствующее значение в карте ha sh ссылается на тот же объект heavenlyBody. Поскольку карта ha sh ссылается на этот объект, она "видит" обновление в heavenlyBody.

...