gpt4 book ai didi

java - return hashmap 更改指针而不是返回值

转载 作者:行者123 更新时间:2023-11-30 08:12:45 25 4
gpt4 key购买 nike

虽然我已经编程多年,但我对 Java 还是个新手。我遇到了 HashMaps 的问题,我不确定如何解决。我以为我很好地搜索了这个站点,但我一定没有使用正确的术语,因为我认为我不是第一个遇到这个问题的人。我不得不相信有一个我只是没有看到的简单解决方案(以森林换树木)。

我有一个程序使用 HashMap 在类之间来回传递大量变量。这样做是因为我们正在连接各种系统,这些系统包含我们试图在程序中处理的非和谐数据。

我发现,经过多次摸索(并不是我有太多开始),当类中的方法“返回”HashMap 时,值不会返回到调用类的过程。而是返回指向“被调用”类过程中的 HashMap 的指针。在“调用”类的方法中对 HashMap“副本”的后续修改反射(reflect)在被调用类的 HashMap 中,即使被调用类的 HashMap 标记为私有(private)(并且这些类位于不同的包中!)。

同样,对“被调用类的 HashMap”的任何修改也会反射(reflect)在调用类的 HashMap 中。

困惑?我也是,所以我把它归结为一小段代码来重现我发现的东西。 (它可能会更短,但我试图保留我正在使用的一些级别。)

  1. TMain.java - 默认包:

    import mainLogic.MainLogic;

    public class TMain {
    private static MainLogic ml = new MainLogic();

    public static void main(String[] args) {
    ml.performMainLogic();
    }
    }
  2. MainLogic.java - “调用类”

    package mainLogic;
    import java.util.HashMap;
    import subLogic.SubLogic;

    public class MainLogic {

    private HashMap<String,String> slValues;

    public MainLogic() {
    // do constructor stuff here
    }

    public void performMainLogic(){
    SubLogic sl = new SubLogic();

    sl.performSubLogic();

    // returns pointer rather than values?
    slValues = sl.getSLHashUser();
    showSLValues("MainLogic - after calling sl.getSLHashUSer");
    sl.showSLHashUser("MainLogic - calling sl.showSLHashUserafter calling sl.getSLHashUser");

    // affects both slValues AND slHash in the SubLogic Class!!!!!
    slValues.put(SubLogic.USER_FLD1,"NEWVALUE");
    showSLValues("MainLogic - slValues after put");
    sl.showSLHashUser("MainLogic - calling SubLogic showSLHashUser after slValues put");

    // modifies slHash in SubLogic Class AND slValues here!!!!!
    sl.doSubLogic2();
    showSLValues("MainLogic - slValues after doSubLogic2");
    sl.showSLHashUser("MainLogic - calling SubLogic showSLHashUser after doSubLogic2");

    }

    public void showSLValues(String title) {
    System.out.println(title);
    System.out.println(" slValues");
    System.out.println(" Field 1 :\t" + slValues.get(SubLogic.USER_FLD1) );
    System.out.println(" Field 2 :\t" + slValues.get(SubLogic.USER_FLD2) );
    System.out.println("");
    }
    }
  3. SubLogic - “被调用类”

    package subLogic;
    import java.util.HashMap;

    public class SubLogic {

    private HashMap<String,String> slHashUser = new HashMap<String, String>();

    // field names slHashUser
    static public final String USER_FLD1 = "ONE";
    static public final String USER_FLD2 = "TWO";

    public SubLogic() {
    slHashUser.put(USER_FLD1, "SubLogic1");
    slHashUser.put(USER_FLD2, "SubLogic2");
    showSLHashUser("SubLogic - Constructor");
    }

    public void performSubLogic(){
    slHashUser.put(USER_FLD1, "PSubLogic1");
    slHashUser.put(USER_FLD2, "PSubLogic2");
    showSLHashUser("SubLogic - performSubLogic");
    }

    public void doSubLogic2(){
    slHashUser.put(USER_FLD1, "modified");
    showSLHashUser("SubLogic - doSubLogic");
    }

    public HashMap<String,String> getSLHashUser() {
    showSLHashUser("SubLogic - getSubLogic");
    return slHashUser;
    }

    public void showSLHashUser(String title) {
    System.out.println(title);
    System.out.println(" slHash Values");
    System.out.println(" Field 1 :\t" + slHashUser.get(USER_FLD1) );
    System.out.println(" Field 2 :\t" + slHashUser.get(USER_FLD2) );
    System.out.println("");
    }
    }

我的第一个想法是我需要在 MainLogic 中做一些不同的事情:

    slValues = sl.getSLHashUser();

但我不确定真正的问题是否出在我尝试返回的 SubLogic 的 getSLHashuser 方法中:

    return slHashUser;

因为 java 应该是关于“按值传递”和“按引用传递”(在老派的“C”意义上),我只是没想到会这样。

您的帮助将不胜感激,即使它是指向我一定忽略了的正确文档的指针。

最佳答案

"Confused?"

没有。这就是可变对象在 Java 中的工作方式。

Since java is supposed to be all about "passing by value" and "pass by reference" (in the old school "C" sense), I just wasn't expecting this.

Java 方法参数和结果完全按值传递。

但是,很多新手都忽略了一个微妙之处。当您传递或返回一个对象时,传递和复制的是对象引用……而不是对象本身的状态。

但是,如果您牢记这一微妙之处,您所观察到的东西既是可以解释的,也是自然的。

如果您的应用程序要求在您返回 HashMap 时创建一个副本,那么您将需要明确地进行复制。幸运的是,HashMap 有一个“复制构造函数”,它会生成一个新的 HashMap,它是现有 Map 状态的浅拷贝。

关于java - return hashmap 更改指针而不是返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30285269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com