String的引用传递
项目中经常会用到trim这个方法,如果每个类里面用太麻烦,现在想写到一个工具类里面。下面是代码
public class DotDotDotArrayTest {
public static void main(String[] args) {
String s1 = " test1";
String s2 = "test2 ";
String s3 = " test ";
System.out.println("pre:"+s1+s2+s3);
trim(s1,s2,s3);
System.out.println("later:"+s1 + s2 +s3);
}
public static void trim(String... args){
for(int i=0;i<args.length;i++){
if (null != args[i])
args[i] = args[i].trim();
}
}
}
这样还是值传递,如果把String s 这种形式换成String s = new String()可以但是会不会影响效率呀?
------解决方案--------------------1、java没有引用传递,任何传递都是值传递
2、String里面是个常量,给String重新赋值不会改变那个常量,也不会在你的方法中传递改变的值
------解决方案--------------------String s1 = " test1";用的其实是stringbuff
String s = new String()
从效率来看还是 前者高吧
------解决方案--------------------------解决方案--------------------
java是有引用传递的
String的底层实现是字符数组,所以string传参,还是值传递
换成String s = new String(),s仍然是String类型,还是值传递
------解决方案--------------------
我说没有引用传递,地址传递也算作值传递,如果你不同意不如举个例子证明一下,不过搜索引擎可以找到不少的反例。
------解决方案--------------------地址传递其实就是引用传递
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法中执行形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(即地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法中执行对形式参数的操作实际上就是对实际参数的操作(地址操作),这样方法执行中形式参数值的改变将会影响实际参数的值。
网上随便搜了一个例子,你可以看一下
http://blog.csdn.net/sunboy_2050/article/details/6906797
------解决方案--------------------
这类用测试得出的结论有时也会背离本质,因为测试的面不够广,像我之前说的,你找到的只是反例之一。
非基本类型的确是引用,但是传递这些非基本类型时虽然传递了地址,但地址值是赋给这些参数变量的,很简单的一个问题就可以证明:你是否能通过在方法体内为传入的引用赋值来改变方法体外的这个引用?显然是不能得,因为他们根本就是2个引用引用了同一个地址,也就是将同一个值赋值给了2个变量,虽然这两个变量都是引用,但他们却是2个不同的变量,根本谈不上引用的传递。
另外,之前你说因为String底层是字符数组,所以是值传递,这个我也认为是错的。
------解决方案--------------------上面干嘛那么执着!
方法接收的参数和传进去的变量都是指向相同的内存地址。(注:常量池,不是new的堆)
因为String是final,所有在方法里改变变量的值,只是在常量池里重新创建一个而已!
------解决方案--------------------
网上这种争论很多,其实只是概念理解上的差异