如何在一个类中构建HashMap,然后在Java中将其用于另一个类?

时间:2018-11-09 00:29:24

标签: java hashmap

基本上我要做的就是在一个类中创建一个HashMap对象,使用循环在该类中构建它,然后能够将其调用到另一个类中。我不确定要完成此操作需要做什么。我尝试在类本身中声明它,然后在main()函数中构建它,但这不允许我在类外部访问它,因为它必须是静态的。

以下是我思考过程的一些伪代码:

public class Class1 {
    public Map<> map = new HashMap<>();

    public static void main(String[] args) {
    //build hashmap here using map.put etc
    }

public class Class2 {
    public static void main(String[] args) {
    //get the map using Class1.map
    }
}

2 个答案:

答案 0 :(得分:2)

在方法调用中传递对象引用

HashMap是一个对象。因此,在另一个类的对象的方法调用中传递对它的引用。

制作地图。

Map map = new HashMap() ; 
map.put( … ) ;

制作另一个对象。在这里,我们假设您编写了一个名为Other的类。

Other other = new Other() ;

通过地图。

other.workOnMap( map ) ;

您可以在Oracle Java Tutorials中看到这一点。

示例

这是一个使用四个类的完整示例,您可以编写自己的MapDemo.javaReportTool.java以及LoggingTool.javaEmployeePagingTool.java

public static void main方法中,我们创建了一个应用程序实例来开始。这解决了chicken-or-the-egg paradoxOOP。在学习Java时,不要专注于这种方法。我将其更多地看作是黑客,是将我们从地球(主机,操作系统,文件,内存尚未分配)带到天堂的一个拐杖(一个奇妙的OOP天堂,只有干净的物体在周围漂浮,并相互传递消息) )。

真正的行动是在doIt方法中,我们建立MapDayOfWeek枚举对象,这些对象导致一个String包含员工姓名的雇员,该雇员的姓名涵盖了一天(例如进行呼叫寻呼机)。

enum表示已经为我们实例化的一组命名对象。在这种情况下,我们已经为我们创建了七个DayOfWeek对象,一周中的每一天都有一个。这里没有什么太神秘的,枚举对象只是一个对象,而是JVM加载类时已经提前为您调用new DayOfWeek的对象。

我们以一周中的每一天为关键字填充地图,每个DayOfWeek关键字对象都指向某人的名字。我们为一周中的每一天分配了一个唯一的名称。

最后,我们将此地图移交给另一个对象进行分析,以生成报告并发送给老板。我们从类ReportTool实例化的其他工具(此处未显示,因为其源代码与该演示无关)。 LoggingToolEmployeePagingTool的同上。

package com.basilbourque.example;

import java.time.DayOfWeek;
import java.util.HashMap;
import java.util.Map;

public class MapDemo {

    public static void main ( String[] args ) {
        MapDemo app = new MapDemo();
        app.doIt();
    }

    private void doIt ( ) {
        int initialCapacity = DayOfWeek.values().length;
        Map < DayOfWeek, String > weekCoverage = new HashMap <>( initialCapacity );

        weekCoverage.put( DayOfWeek.MONDAY , "Stuart" );
        weekCoverage.put( DayOfWeek.TUESDAY , "Wendy" );
        weekCoverage.put( DayOfWeek.WEDNESDAY , "Lisa" );
        weekCoverage.put( DayOfWeek.THURSDAY , "Jesse" );
        weekCoverage.put( DayOfWeek.FRIDAY , "Marvin" );
        weekCoverage.put( DayOfWeek.SATURDAY , "Janet" );
        weekCoverage.put( DayOfWeek.SUNDAY , "Jarrod" );

        System.out.println( weekCoverage );

        ReportTool reportTool = new ReportTool();
        reportTool.makeHtmlSummaryOfWeekCoverageAndEmailToBoss( weekCoverage );

        LoggingTool loggingTool = new LoggingTool();
        loggingTool.logWeekCoverage( weekCoverage );

        EmployeePagingTool employeePagingTool = new EmployeePagingTool();
        employeePagingTool.sendTextMessagesForWeekCoverage( weekCoverage );

    }
}

在实际工作中,我们不太可能仅使用String对象作为员工姓名。我们可能会有一个Employee类,并且将分配该类的对象。在这种情况下,我们将Map声明为Map < DayOfWeek, Employee > weekCoverage

您可能要防止更改地图。一种实现方法是在Java 9及更高版本中使用Map.ofMap.ofEntries。另一种方法是Collections.umodifiableMap


关于polymorphism的注释…请注意,我们如何从HashMap的具体类中实例化一个对象,但是我们将该对象的引用存储为更通用的Map。然后,我们可以自由地在以后的Map中使用HashMap的其他实现,从MapDemo到其他地图,而无需破坏ReportTool中的代码。

实际上,我们应该更改该MapDemo代码。尽管上面的代码可以编译并运行得很好,但是使用枚举对象作为键时,Map接口的实现更好。与使用枚举作为键的HashMap相比,EnumMap类使用的内存更少,并且执行速度更快。 EnumMapHashMap都实现相同的Map接口。

因此,几个月后我们可以发现这个机会来调整我们的MapDemo代码,而不必担心ReportTool受到任何损害。 OOP的主要优点之一是避免了古老的编程问题,因为一个地方的一点改动都会导致其他部分崩溃。

我们更改这两行:

        int initialCapacity = DayOfWeek.values().length;
        Map < DayOfWeek, String > weekCoverage = new HashMap <>( initialCapacity );

…此行:

        Map < DayOfWeek, String > weekCoverage = new EnumMap( DayOfWeek.class );

其他代码均不需要更改。

答案 1 :(得分:0)

更新:我最终只是在Class1中的一个方法中构建并返回哈希图,然后在Class2中创建Class1的实例并调用该方法以返回哈希图

这是一个相当简单的解决方案,不确定为什么很难找到答案。感谢所有尝试提供帮助的人