public class ChangeTest {

public void changeMap(Map s){
s.put("2", "he");
}

public void changeString(String s){
s = s + "hello";
}

public static void main(String[] args) {
Map map = new HashMap();
map.put("key", "value");
new SocketTest().changeMap(map);
System.out.println(map);

String str = "123";
new SocketTest().changeString(str);
System.out.println(str);

}

}
请问输出什么?
为什么?结果不重要,重要的是原因。

解决方案 »

  1.   

    Map是一个类    用Map生成的对象作为函数的参数传递的是一个引用,类似C语言中的指针,在函数中保存值之后返回主函数,内存单元中的值没有被释放掉,所以打印出来,值是存在的 ;
    String类型作为参数是作为值传递,返回主函数就释放掉了,但是在主函数中原先保存的值还是存在的;
    应该是这样理解的~~~
      

  2.   

    Map和String都是对象,为什么一个是引用一个是值,这才是我想知道的。谢谢!
      

  3.   

    结果:
    {key=value,2=he}
    123
    原因:JAVA只采用pass by value(传值),即使是传递对象,也是按值传递的!
    可以改变参数的内部状态,题中map的状态被修改 
    但对参数对象重新赋值是没有意义的,(s=s+"hello",将参数s连接一个字符串常量重新赋值给s),str仍然是123.
      

  4.   

    因为在java中 字符串是不可变的 你用的 s+="..." 实际上是把引用s从新付给了一个地址 后面就很明白了 引用压栈的值却没有变 推荐看下Tij 很多基础东西都清楚了