@Test
    public void a() {
        List a = new ArrayList();
        String b = "1";
        ;
        Map c = new HashMap();
        c.put("1", "1");        b(a, b, c);
        System.out.println(a.toString() + "------" + b + "--------" + c.toString());
    }    public void b(List a, String b, Map c) {
        a.add("a");
        a.add("b");
        a.add("c");
        b = "2";
        c.put("2", "2");    }
输出
[a, b, c]------1--------{2=2, 1=1}
为什么String引用地址没变

解决方案 »

  1.   

    因为Java中只有值传递,没有引用传递
      

  2.   

    这跟引用类型没有关系,换成Integer结果也是一样的
      

  3.   

    为什么写在同一方法里 String 引用地址可以改变
      

  4.   

    等同于这个,给你重新new了一个出来了
      

  5.   

    这跟引用类型没有关系,换成Integer结果也是一样的基本数据类型是按值传递,对象是按引用, Integer是基本数据类型,按值传递的,形参改变的只是实参的数据副本,实参值不变
      

  6.   

    这跟引用类型没有关系,换成Integer结果也是一样的基本数据类型是按值传递,对象是按引用, Integer是基本数据类型,按值传递的,形参改变的只是实参的数据副本,实参值不变
    Integer是基本数据类型?哪int是什么?
      

  7.   

    这跟引用类型没有关系,换成Integer结果也是一样的基本数据类型是按值传递,对象是按引用, Integer是基本数据类型,按值传递的,形参改变的只是实参的数据副本,实参值不变
    Integer是基本数据类型?哪int是什么?自动装箱拆箱,  integer是int的包装类,不是基本类型,纠正下
      

  8.   

    这跟引用类型没有关系,换成Integer结果也是一样的基本数据类型是按值传递,对象是按引用, Integer是基本数据类型,按值传递的,形参改变的只是实参的数据副本,实参值不变
    Integer是基本数据类型?哪int是什么?自动装箱拆箱,  integer是int的包装类,不是基本类型,纠正下
    按你说的,基本数据类型是值传递,对象是按引用,那为什么在楼主的问题中,String的引用没有被改变,Java中只有值传递的
      

  9.   


    这跟引用类型没有关系,换成Integer结果也是一样的基本数据类型是按值传递,对象是按引用, Integer是基本数据类型,按值传递的,形参改变的只是实参的数据副本,实参值不变
    Integer是基本数据类型?哪int是什么?自动装箱拆箱,  integer是int的包装类,不是基本类型,纠正下
    我去,看源码吧,这个和String性质是一样的,图就不贴了,误导大家了
      

  10.   


    这跟引用类型没有关系,换成Integer结果也是一样的基本数据类型是按值传递,对象是按引用, Integer是基本数据类型,按值传递的,形参改变的只是实参的数据副本,实参值不变
    Integer是基本数据类型?哪int是什么?自动装箱拆箱,  integer是int的包装类,不是基本类型,纠正下
    我去,看源码吧,这个和String性质是一样的,图就不贴了,误导大家了
    不知道你为什么非要纠结于被final修饰这个问题,不管他有没有被final,能不能修改,Java中是只有值传递没有引用传递
      

  11.   


    这跟引用类型没有关系,换成Integer结果也是一样的基本数据类型是按值传递,对象是按引用, Integer是基本数据类型,按值传递的,形参改变的只是实参的数据副本,实参值不变
    Integer是基本数据类型?哪int是什么?自动装箱拆箱,  integer是int的包装类,不是基本类型,纠正下
    我去,看源码吧,这个和String性质是一样的,图就不贴了,误导大家了
    不知道你为什么非要纠结于被final修饰这个问题,不管他有没有被final,能不能修改,Java中是只有值传递没有引用传递值是对象的时候,传递的是地址,我所谓的引用其实是地址值传递,你要理解为只有值传递,太过死板的话,是不是形参传值都不会改变实参的值?
      

  12.   


    这跟引用类型没有关系,换成Integer结果也是一样的基本数据类型是按值传递,对象是按引用, Integer是基本数据类型,按值传递的,形参改变的只是实参的数据副本,实参值不变
    Integer是基本数据类型?哪int是什么?自动装箱拆箱,  integer是int的包装类,不是基本类型,纠正下
    我去,看源码吧,这个和String性质是一样的,图就不贴了,误导大家了
    不知道你为什么非要纠结于被final修饰这个问题,不管他有没有被final,能不能修改,Java中是只有值传递没有引用传递值是对象的时候,传递的是地址,我所谓的引用其实是地址值传递,你要理解为只有值传递,太过死板的话,是不是形参传值都不会改变实参的值?
    那也不能这样说,如果传一个Buffer对象,实参肯定会被改变的
      

  13.   

    回答下这个问题,只要明白一点就可以了。java 中的String类型是不可变类型,声明为String 类型的变量b初始化值为1后,b的值就不会改变了。所以打印出来的值还是1。
      

  14.   

    在函数b中,参数b最初仍旧是指向函数a中字符串b的引用,然而接下来你改变了参数b的引用指向,将其指向了另一个字符串常量。然而这和函数a中的变量b没有半毛钱关系,所以当然不会变~ 说白了传入函数b的参数b,你可以看作是函数a中变量b的拷贝,只不过拷贝的不是字符串的内容,而是字符串的引用,即它们都指向同一个字符串,这坨字符串存在内存中某一块地方,但你不用关心这些实现细节。
      

  15.   

    还有LSS的回答只是一知半解~ java中String的不可变靠的是设计方式。String所有公开的成员函数,只要是可能改变字符串内容的函数,都是以返回一个新字符串来实现的,这样就保证了完全不修改原始字符串,即不变性。这样的好处主要是多线程很方便,不用担心并发,竞争什么的问题~ 比较有了不变性,就相当于只读了~
      

  16.   

    Java中volatile关键字
    https://www.jianshu.com/p/d5323deb04db