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;
}
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
前提是method2没有返回值的情况下,我是想要没返回值实现这个str3
#4
不是正解,这么简单的我就不发出来了。。。我是想要有没有不带return的实现这功能
#5
不带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没有什么关系了,所以输出空字符串“”
第二个例子: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
第一个例子: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
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
你说的是全局变量,这个是
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用不同的名字代替就不行了,我用两个一样的名字是为了方便的。
另外我是想知道为什么输出结果不是我想要的,不是要改代码
#11
http://mp.weixin.qq.com/s/Djoet8PKQUTsEug2p7ZnAA
不知道能否给你启发
谢谢 挺好的
#12
第一个例子: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没有什么关系了,所以输出空字符串“”
差不多明白了,谢谢
#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;
}
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
因为list在内存中是同一个对象,而str传递过去了值,你method2(str1, str2, str3);方法如果有返回值,然后传递给str3,才是你想要的结果
前提是method2没有返回值的情况下,我是想要没返回值实现这个str3
#4
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
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没有什么关系了,所以输出空字符串“”
第二个例子: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
第一个例子: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
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
你说的是全局变量,这个是
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用不同的名字代替就不行了,我用两个一样的名字是为了方便的。
另外我是想知道为什么输出结果不是我想要的,不是要改代码
#11
http://mp.weixin.qq.com/s/Djoet8PKQUTsEug2p7ZnAA
不知道能否给你启发
谢谢 挺好的
#12
第一个例子: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没有什么关系了,所以输出空字符串“”
差不多明白了,谢谢