String和StringBuilder作为方法参数的区别
2017-09-11 22:34
281 查看
String作为方法参数:
public class StringTest {
public static void main(String[] args) {
String s1 = new String("string");
change(s1);
System.out.println(s1);
}
public static String change(String s){
s += "test";
return s;
}
}
输出结果s1并未改变。
执行过程:
首先在堆中创建对象string,栈中存储s1,也就是s1对象的引用地址。调用方法时,形参s也指向堆中相同的对象。执行s += "test"后,将会堆中创建另一个String对象,将该对象的地址复制给栈中的形参s1,所以在方法里面s1和s相互独立的,指向不同的对象,s1并未改变。
StringBuilder作为方法参数:
public class StringBuilderTest {
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer("Hello");
StringBuffer s2 = new StringBuffer("Hello");
changeStringBuffer(s1, s2);
System.out.println("s1=" + s1);
System.out.println("s2=" + s2);
}
public static void changeStringBuffer(StringBuffer ss1, StringBuffer ss2) {
ss1.append(" world");
ss2 = ss1;
ss2.append("aa");
}
}
输出结果:
s1=Hello worldaa
s2=Hello
首先知道s1和s2是不相等的,指向堆中两个不同的StringBuilder对象。下面这张图可以很好解释s2未改变的原因。
总结:
String为不可变对象,对其进行操作将生成不一样的对象。
StringBuilder为可变对象,可以直接在原对象上面进行操作。StringBuilder作为方法参数时其实就是传递引用地址。
public class StringTest {
public static void main(String[] args) {
String s1 = new String("string");
change(s1);
System.out.println(s1);
}
public static String change(String s){
s += "test";
return s;
}
}
输出结果s1并未改变。
执行过程:
首先在堆中创建对象string,栈中存储s1,也就是s1对象的引用地址。调用方法时,形参s也指向堆中相同的对象。执行s += "test"后,将会堆中创建另一个String对象,将该对象的地址复制给栈中的形参s1,所以在方法里面s1和s相互独立的,指向不同的对象,s1并未改变。
StringBuilder作为方法参数:
public class StringBuilderTest {
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer("Hello");
StringBuffer s2 = new StringBuffer("Hello");
changeStringBuffer(s1, s2);
System.out.println("s1=" + s1);
System.out.println("s2=" + s2);
}
public static void changeStringBuffer(StringBuffer ss1, StringBuffer ss2) {
ss1.append(" world");
ss2 = ss1;
ss2.append("aa");
}
}
输出结果:
s1=Hello worldaa
s2=Hello
首先知道s1和s2是不相等的,指向堆中两个不同的StringBuilder对象。下面这张图可以很好解释s2未改变的原因。
总结:
String为不可变对象,对其进行操作将生成不一样的对象。
StringBuilder为可变对象,可以直接在原对象上面进行操作。StringBuilder作为方法参数时其实就是传递引用地址。
相关文章推荐
- String和StringBuilder作为参数的区别
- String和StringBuilder作为参数的区别
- 由String作为方法参数,引起的值传递,引用传递,及StringBuffer 原文引用: http://www.cnblogs.com/zuoxiaolong/p/lang1.html ht
- js使用数组作为参数,直接调用push与apply方法调用push的区别
- java 基础 String和StringBuffer在作为参数传递时的区别
- 作为函数参数时String和String[]数组的区别
- Java语言中,以String作为类型的变量在作为方法参数时所表现出的“非对象”的特性。
- Ruby中将代码块作为参数传入方法的几种方法及其区别
- 复习一下基础:'C# 值类型和引用类型 以及作为方法参数的区别'
- String、StringBuffer和StringBuilder区别及其常用方法
- Java中的String,StringBuilder,StringBuffer三者的区别和各自使用方法
- C# 值类型和引用类型 以及作为方法参数的区别
- Java——String、StringBuilder、StringBuffer的区别与常用方法
- Java中String, StringBuffer, StringBuilder的区别和常用方法
- 作为函数参数时String和String[]数组的区别
- String、StringBuffer和StringBuilder的区别以及使用方法
- Java中String和Array作为函数参数的区别
- StringBuilder对象作为方法的参数
- 类类型作为方法的参数时,使用 ref 和不使用ref的区别?
- 详述 Java 语言中的 String、StringBuffer 和 StringBuilder 的使用方法及区别