6

所以我遇到了一些我认为看起来有点奇怪的代码。想看看你对此有何看法

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

}

那么这段代码可以吗,还是应该以其他方式完成?

谢谢

4

3 回答 3

8

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

m = new HashMap();

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

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

于 2012-12-14T01:30:17.717 回答
4

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

地图没有打字;应该是Map<Integer,Integer>。使用编译器来帮助你把事情做好。使用泛型类型也将允许使用自动装箱,因此您可以做得更简洁put(0,0)

除非明确需要 HashMap(对于 HashMap 的情况,情况并非如此),否则该映射应作为 a 传递Map,而不是 a传递。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

于 2012-12-14T01:28:51.440 回答
0

我会这样做:

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

以下是这里使用的 java kung fu 的细分:

  • 地图是打字的<Integer, Integer>
  • 这是一个带有实例块的匿名类来初始化地图
  • 注意使用put(0, 0)而不是m.put(new Integer(0), new Integer(0)),使用自动装箱
于 2012-12-14T01:38:19.860 回答