其实,要是在之前,我会很肯定的回答String是引用传递,但是今晚一个例子,也可以说是自己忘了一些String的知识点,如需复习一下String的可以,看一下我之前的一篇博客用好字符串,提防陷阱
好吧,我简单列一下我遇到的情况
public class Test { public static void main(String[] args) throws IOException { String str = "string"; append(str); System.out.println("main方法:" +str); } public static void append(String str) { str += " change"; System.out.println("append方法:" + str); } }
这时我就开始怀疑是不是String其实是值传递呢?
仔细一想,其实String是不可变长的,也就是String改变了,那jvm其实就在缓冲池长生了新的String直接量,并把String指向他,所以上面代码中执行的结果就是main中的str指向原来的String直接量,而 append方法中的str指向新的String直接量
要实现上面的效果可以用可以变长的StringBuilder,他整个过程中不会长生新的对象
public class Test { public static void main(String[] args) throws IOException { StringBuilder str = new StringBuilder("string"); append(str); System.out.println("main方法:" + str); } public static void append(StringBuilder str) { str.append(" change"); System.out.println("append方法:" + str); } }
其实以上这些点,在我之前的博客用好字符串,提防陷阱就有关于String的注意事项,不过确实有时候还是会跌入这些啃爹的陷阱了去
原文:http://blog.csdn.net/chenxuegui1234/article/details/18746819