自定义对象如何存储在 HashMap 中

How the custom object is stored in HashMap

我无法理解下面的代码如何将 heavenlyBody.addSatellite(satellites ); 添加到 HashMap 中?

HeavenlyBody planet1 = solarSystem.get("Mars"); 被称为 planet1.getSatellites() returns 火星的 Phobos 和 Deimos 卫星和植物地球的卫星 Moon。

我的问题是如何将 Phobos 和 Deimos 添加到 solarSystem HashMap 中的 Mars 键?

   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);
    }
}

输出:

Planet :Mars
    Phobos
    Deimos
Planet :Earth
    Moon

请问有人能解释一下对象引用是如何分配给对象并用图表说明的,或者是如何在 HashMap 中添加卫星的?

solarSystem.put(heavenlyBody.getName(), heavenlyBody); 中,键 Mars 被放入具有值 heavenlyBody 的哈希映射中。所以值引用与火星相关的对象

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

首先创建卫星 Phobos,然后将其放入以 Phobos 键和对象 satellites 为对象的哈希映射中。然后在 heavenlyBody.addSatellite(satellites ); 中,变量 heavenlyBody 仍然是对火星的引用,它只是作为卫星添加到那里。哈希映射中的相应值引用相同的对象 heavenlyBody。由于散列映射引用此对象,因此 "sees" heavenlyBody 中的更新。