[每日一题] java是值传递还是引用传递?

246 阅读1分钟

考虑一下,以下两段程序分别会返回什么结果?

代码段1:

public static void main(String[] args){
	int xx = 1;
	add(xx);
	System.out.print(xx);
}
	
public static void add(int temp){
	temp++;
}

结论:输出xx为1

代码段2:

public static void main(String[] args){
	Map<String,String> a = new HashMap<>();
	List<Map> b = new ArrayList<Map>();
        a.put("1", "a");
	b.add(a);
        
	a = null;
	Map aa = b.get(0);
        
	System.out.println(aa.get("1"));
}

结论:输出为a

总结: java中是采用的值传递策略,当传递基本数据类型作为方法入参时,实际上传递的是基本数据类型的数值,对于片段1来说,add(xx) = add(1) add内部跟xx没有任何关系了。

片段2也是同理,a,b是引用,他们分别引用的对象为new HashMap 和 new ArrayList 当调用b.add(a)时,等同于b.add(a的值),比如a的值为0x66(就是其所引用对象的地址), 那么就等同于b.add(0x66)。 正因如此,a引用指向了新的元素null时,并不会影响到已经保存到b中的0x66,也就是b.get(0),因此通过aa对象,是可以获取到key为1的值的。

如果还是有些疑惑,再看个例子:

public static void main(String[] args) {
    Demo demo = new Demo();
    demo.a = 1;
    demo.b = 2;
    List<Demo> demoList = new ArrayList<>();
    System.out.println(demo);  // com.test.Test11$Demo@42110406
    demoList.add(demo);
    demo=null;
    System.out.println(demoList.get(0)); // com.test.Test11$Demo@42110406
}

虽然demo引用的对象从new Demo()变成了null,但是由于是值传递,所以两者输出相同

难度等级:★☆☆☆☆