将地图传递给另一个要在java中修改的方法

时间:2012-12-14 01:06:47

标签: java arguments

所以我遇到了一些我觉得有些奇怪的代码。想看看你对此有何看法

public class Test {

   public static void main(String[] args) {

      HashMap m = new HashMap();
      Test2 t2 = new Test2();
      t2.fill(m);
   }
}

public class Test2 {

    public void fill(HashMap m) {
        m.put(new Integer(0), new Integer(0));
    }

}

这段代码是好的还是应该以另一种方式完成?

由于

3 个答案:

答案 0 :(得分:5)

这非常好,因为java中的对象是通过引用传递的。如果您尝试直接在方法中分配给m,那就错了:

m = new HashMap();

但是您可以使用传递的引用来修改作为参数传递的对象,就像示例代码一样。

将其视为将对象的位置传递给函数。您可以使用此位置信息来摆弄它。但由于该位置只是一个值,因此分配到该位置(m)对您调用该函数的地方m没有影响。这就是为什么文章说这个论点是按价值传递的。

答案 1 :(得分:4)

将地图传递给该方法操作地图的方法是否可以?肯定。

地图是无类型的;应该是Map<Integer,Integer>。使用编译器来帮助您正确完成任务。使用泛型类型还可以使用自动装箱,因此您可以更简洁put(0,0)

除非明确需要HashMap,否则地图应作为Map而不是HashMap传递(对于HashMap的情况不是这样)。尽可能使用界面,而不是实现。

名称fill看起来对我来说是一个坏名字 - 它似乎并没有“填补”任何东西。


顺便说一句,我建议不要对魔术匿名类进行初始化,这样做:

Map<Integer, Integer> m = new HashMap<Integer, Integer>() {{
    put(0, 0);
    }};

支持简单的初始化程序块:

Map<Integer, Integer> m = new HashMap<Integer, Integer>(); {
    m.put(0, 0);
    }

避免创建SomeClass$n.class形式的冗余匿名内部类 文件

答案 2 :(得分:0)

我会这样做:

Map<Integer, Integer> m = new HashMap<Integer, Integer>() {{
    put(0, 0);
}};

以下是这里使用的java功夫的细分:

  • 地图已键入<Integer, Integer>
  • 这是一个匿名类,其中包含用于初始化地图的实例块
  • 请注意使用put(0, 0)而不是m.put(new Integer(0), new Integer(0)),使用自动装箱