list可以通过方法传值,String不能传值,不明白为什么??

时间:2022-07-27 02:47:38

import java.util.ArrayList;
import java.util.List;

public class Test2 {
public static void main(String[] args) {
System.out.println(method1("11","22"));
//输出的是[11, 22]
}

public static List<String> method1(String str1, String str2){
        List<String> list = new ArrayList<String>();
        method2(str1, str2, list);
        return list;
    }

    private static  void method2(String str1, String str2, List<String> list) {
     list.add(str1);
     list.add(str2);
    }
}

这里的可以通过method2里面的list值传递到method1中,打印出来
可是对于String和int等类型

public class Test {
public static void main(String[] args) {
System.out.println(method1("11","22"));
//输出的是空串,而不是1122 ?
}

public static String method1(String str1, String str2){
        String str3 = "";
        method2(str1, str2, str3);
        return str3;
    }

    private static  void method2(String str1, String str2, String str3) {
     str3 = str1 + str2;
    }
}

str3就不能通过method2操作后传值到method1中,就是说method1中return返回的str3仍然是空串“”
这是为什么呢??
大牛们,求解惑

12 个解决方案

#1


因为list在内存中是同一个对象,而str传递过去了值,你method2(str1, str2, str3);方法如果有返回值,然后传递给str3,才是你想要的结果

#2


1L正解
 public static String method1(String str1, String str2){
        String str3 = "";
        str3= method2(str1, str2, str3);
        return str3;
    }
 
    private static   void  String method2(String str1, String str2, String str3) {
        str3 = str1 + str2;
return str3;
    }

#3


引用 1 楼 alan_waker 的回复:
因为list在内存中是同一个对象,而str传递过去了值,你method2(str1, str2, str3);方法如果有返回值,然后传递给str3,才是你想要的结果

前提是method2没有返回值的情况下,我是想要没返回值实现这个str3

#4


引用 2 楼 qq_30831935 的回复:
1L正解
 public static String method1(String str1, String str2){
        String str3 = "";
        str3= method2(str1, str2, str3);
        return str3;
    }
 
    private static   void  String method2(String str1, String str2, String str3) {
        str3 = str1 + str2;
return str3;
    }


不是正解,这么简单的我就不发出来了。。。我是想要有没有不带return的实现这功能

#5


引用 4 楼 yuxiangaaaaa 的回复:
Quote: 引用 2 楼 qq_30831935 的回复:

1L正解
 public static String method1(String str1, String str2){
        String str3 = "";
        str3= method2(str1, str2, str3);
        return str3;
    }
 
    private static   void  String method2(String str1, String str2, String str3) {
        str3 = str1 + str2;
return str3;
    }


不是正解,这么简单的我就不发出来了。。。我是想要有没有不带return的实现这功能



不带return    你就在你代码的基础上把str3声明成static

#6


当你进行赋值操作后在内存中相当于开辟了另一个空间,在没有返回的方法里对新的内存空间进行操作是没什么意义的,List之所以成功是因为你对原有内存进行操作,而String失败是因为你用str1+str2后形成了新的字符串,并将这个新的字符串赋给str3,这个新的字符串在跳出这个方法后是为空的,你可以试试在方法中创建一个新的List集合,进行add操作然后赋给传进来的list,结果应该是空集合

#7


第一个例子:method2(str1, str2, list);list集合值传递,传的是地址的拷贝,也就是list和List<String> list指向同一块内存地址,list.add(str1);list.add(str2);对该内存地址的内容做了改变,使用add方法为集合里面的数组赋值两个,所以输出的是[11, 22]

第二个例子:str3的值传递也是地址的拷贝,执行 method2(str1, str2, str3);后method1和method2的str3都指向了“”,执行 str3 = str1 + str2;时字符串的拼接用的是StringBuilder的append方法最后相当于新创建了一个String对象new String(),让method2的str3指向这个新的对象,它根本没有对原来拷贝的地址做出改变,而是重新指向一个新的对象,和mehtod1的str3没有什么关系了,所以输出空字符串“”

#8


http://mp.weixin.qq.com/s/Djoet8PKQUTsEug2p7ZnAA
不知道能否给你启发

#9


引用 7 楼 pany1209 的回复:
第一个例子:method2(str1, str2, list);list集合值传递,传的是地址的拷贝,也就是list和List<String> list指向同一块内存地址,list.add(str1);list.add(str2);对该内存地址的内容做了改变,使用add方法为集合里面的数组赋值两个,所以输出的是[11, 22]

第二个例子:str3的值传递也是地址的拷贝,执行 method2(str1, str2, str3);后method1和method2的str3都指向了“”,执行 str3 = str1 + str2;时字符串的拼接用的是StringBuilder的append方法最后相当于新创建了一个String对象new String(),让method2的str3指向这个新的对象,它根本没有对原来拷贝的地址做出改变,而是重新指向一个新的对象,和mehtod1的str3没有什么关系了,所以输出空字符串“”



7楼正解

#10


引用 5 楼 qq_30831935 的回复:
Quote: 引用 4 楼 yuxiangaaaaa 的回复:

Quote: 引用 2 楼 qq_30831935 的回复:

1L正解
 public static String method1(String str1, String str2){
        String str3 = "";
        str3= method2(str1, str2, str3);
        return str3;
    }
 
    private static   void  String method2(String str1, String str2, String str3) {
        str3 = str1 + str2;
return str3;
    }


不是正解,这么简单的我就不发出来了。。。我是想要有没有不带return的实现这功能



不带return    你就在你代码的基础上把str3声明成static


你说的是全局变量,这个是

引用 5 楼 qq_30831935 的回复:
Quote: 引用 4 楼 yuxiangaaaaa 的回复:

Quote: 引用 2 楼 qq_30831935 的回复:

1L正解
 public static String method1(String str1, String str2){
        String str3 = "";
        str3= method2(str1, str2, str3);
        return str3;
    }
 
    private static   void  String method2(String str1, String str2, String str3) {
        str3 = str1 + str2;
return str3;
    }


不是正解,这么简单的我就不发出来了。。。我是想要有没有不带return的实现这功能



不带return    你就在你代码的基础上把str3声明成static


这个是声明全局变量,适用于整个类,当然可以实现了,如果method1和method2里面的str3用不同的名字代替就不行了,我用两个一样的名字是为了方便的。
另外我是想知道为什么输出结果不是我想要的,不是要改代码 list可以通过方法传值,String不能传值,不明白为什么??

#11


引用 8 楼 g1258194015 的回复:
http://mp.weixin.qq.com/s/Djoet8PKQUTsEug2p7ZnAA
不知道能否给你启发


谢谢  挺好的

#12


引用 7 楼 pany1209 的回复:
第一个例子:method2(str1, str2, list);list集合值传递,传的是地址的拷贝,也就是list和List<String> list指向同一块内存地址,list.add(str1);list.add(str2);对该内存地址的内容做了改变,使用add方法为集合里面的数组赋值两个,所以输出的是[11, 22]

第二个例子:str3的值传递也是地址的拷贝,执行 method2(str1, str2, str3);后method1和method2的str3都指向了“”,执行 str3 = str1 + str2;时字符串的拼接用的是StringBuilder的append方法最后相当于新创建了一个String对象new String(),让method2的str3指向这个新的对象,它根本没有对原来拷贝的地址做出改变,而是重新指向一个新的对象,和mehtod1的str3没有什么关系了,所以输出空字符串“”


差不多明白了,谢谢 list可以通过方法传值,String不能传值,不明白为什么??

#1


因为list在内存中是同一个对象,而str传递过去了值,你method2(str1, str2, str3);方法如果有返回值,然后传递给str3,才是你想要的结果

#2


1L正解
 public static String method1(String str1, String str2){
        String str3 = "";
        str3= method2(str1, str2, str3);
        return str3;
    }
 
    private static   void  String method2(String str1, String str2, String str3) {
        str3 = str1 + str2;
return str3;
    }

#3


引用 1 楼 alan_waker 的回复:
因为list在内存中是同一个对象,而str传递过去了值,你method2(str1, str2, str3);方法如果有返回值,然后传递给str3,才是你想要的结果

前提是method2没有返回值的情况下,我是想要没返回值实现这个str3

#4


引用 2 楼 qq_30831935 的回复:
1L正解
 public static String method1(String str1, String str2){
        String str3 = "";
        str3= method2(str1, str2, str3);
        return str3;
    }
 
    private static   void  String method2(String str1, String str2, String str3) {
        str3 = str1 + str2;
return str3;
    }


不是正解,这么简单的我就不发出来了。。。我是想要有没有不带return的实现这功能

#5


引用 4 楼 yuxiangaaaaa 的回复:
Quote: 引用 2 楼 qq_30831935 的回复:

1L正解
 public static String method1(String str1, String str2){
        String str3 = "";
        str3= method2(str1, str2, str3);
        return str3;
    }
 
    private static   void  String method2(String str1, String str2, String str3) {
        str3 = str1 + str2;
return str3;
    }


不是正解,这么简单的我就不发出来了。。。我是想要有没有不带return的实现这功能



不带return    你就在你代码的基础上把str3声明成static

#6


当你进行赋值操作后在内存中相当于开辟了另一个空间,在没有返回的方法里对新的内存空间进行操作是没什么意义的,List之所以成功是因为你对原有内存进行操作,而String失败是因为你用str1+str2后形成了新的字符串,并将这个新的字符串赋给str3,这个新的字符串在跳出这个方法后是为空的,你可以试试在方法中创建一个新的List集合,进行add操作然后赋给传进来的list,结果应该是空集合

#7


第一个例子:method2(str1, str2, list);list集合值传递,传的是地址的拷贝,也就是list和List<String> list指向同一块内存地址,list.add(str1);list.add(str2);对该内存地址的内容做了改变,使用add方法为集合里面的数组赋值两个,所以输出的是[11, 22]

第二个例子:str3的值传递也是地址的拷贝,执行 method2(str1, str2, str3);后method1和method2的str3都指向了“”,执行 str3 = str1 + str2;时字符串的拼接用的是StringBuilder的append方法最后相当于新创建了一个String对象new String(),让method2的str3指向这个新的对象,它根本没有对原来拷贝的地址做出改变,而是重新指向一个新的对象,和mehtod1的str3没有什么关系了,所以输出空字符串“”

#8


http://mp.weixin.qq.com/s/Djoet8PKQUTsEug2p7ZnAA
不知道能否给你启发

#9


引用 7 楼 pany1209 的回复:
第一个例子:method2(str1, str2, list);list集合值传递,传的是地址的拷贝,也就是list和List<String> list指向同一块内存地址,list.add(str1);list.add(str2);对该内存地址的内容做了改变,使用add方法为集合里面的数组赋值两个,所以输出的是[11, 22]

第二个例子:str3的值传递也是地址的拷贝,执行 method2(str1, str2, str3);后method1和method2的str3都指向了“”,执行 str3 = str1 + str2;时字符串的拼接用的是StringBuilder的append方法最后相当于新创建了一个String对象new String(),让method2的str3指向这个新的对象,它根本没有对原来拷贝的地址做出改变,而是重新指向一个新的对象,和mehtod1的str3没有什么关系了,所以输出空字符串“”



7楼正解

#10


引用 5 楼 qq_30831935 的回复:
Quote: 引用 4 楼 yuxiangaaaaa 的回复:

Quote: 引用 2 楼 qq_30831935 的回复:

1L正解
 public static String method1(String str1, String str2){
        String str3 = "";
        str3= method2(str1, str2, str3);
        return str3;
    }
 
    private static   void  String method2(String str1, String str2, String str3) {
        str3 = str1 + str2;
return str3;
    }


不是正解,这么简单的我就不发出来了。。。我是想要有没有不带return的实现这功能



不带return    你就在你代码的基础上把str3声明成static


你说的是全局变量,这个是

引用 5 楼 qq_30831935 的回复:
Quote: 引用 4 楼 yuxiangaaaaa 的回复:

Quote: 引用 2 楼 qq_30831935 的回复:

1L正解
 public static String method1(String str1, String str2){
        String str3 = "";
        str3= method2(str1, str2, str3);
        return str3;
    }
 
    private static   void  String method2(String str1, String str2, String str3) {
        str3 = str1 + str2;
return str3;
    }


不是正解,这么简单的我就不发出来了。。。我是想要有没有不带return的实现这功能



不带return    你就在你代码的基础上把str3声明成static


这个是声明全局变量,适用于整个类,当然可以实现了,如果method1和method2里面的str3用不同的名字代替就不行了,我用两个一样的名字是为了方便的。
另外我是想知道为什么输出结果不是我想要的,不是要改代码 list可以通过方法传值,String不能传值,不明白为什么??

#11


引用 8 楼 g1258194015 的回复:
http://mp.weixin.qq.com/s/Djoet8PKQUTsEug2p7ZnAA
不知道能否给你启发


谢谢  挺好的

#12


引用 7 楼 pany1209 的回复:
第一个例子:method2(str1, str2, list);list集合值传递,传的是地址的拷贝,也就是list和List<String> list指向同一块内存地址,list.add(str1);list.add(str2);对该内存地址的内容做了改变,使用add方法为集合里面的数组赋值两个,所以输出的是[11, 22]

第二个例子:str3的值传递也是地址的拷贝,执行 method2(str1, str2, str3);后method1和method2的str3都指向了“”,执行 str3 = str1 + str2;时字符串的拼接用的是StringBuilder的append方法最后相当于新创建了一个String对象new String(),让method2的str3指向这个新的对象,它根本没有对原来拷贝的地址做出改变,而是重新指向一个新的对象,和mehtod1的str3没有什么关系了,所以输出空字符串“”


差不多明白了,谢谢 list可以通过方法传值,String不能传值,不明白为什么??