所以我遇到了一些我觉得有些奇怪的代码。想看看你对此有何看法
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));
}
}
这段代码是好的还是应该以另一种方式完成?
由于
答案 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))
,使用自动装箱