(原)String、StringBuilder、StringBuffer作为形参
今天在刷一道算法题时,突然遇到StringBuilder作为形参和String作为形参时,最终得出来的结果不同。故尝试了几个demo看看它们之间的区别。
当String类型作为参数时,
1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 String sb=new String(); 6 Test.TestString(sb); 7 System.out.println("实参为: "+sb.toString()); 8 9 } 10 11 public static void TestString(String s) 12 { 13 s="5"; 14 System.out.println("形参为: "+s); 15 } 16 }
输出结果为:
即说明形参的改变并不影响实参的改变,本质上是值的传递。
当StringBuilder类型作为参数时,
1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 StringBuilder sb=new StringBuilder(); 6 Test.TestString(sb); 7 System.out.println("实参为: "+sb.toString()); 8 9 } 10 11 public static void TestString(StringBuilder s) 12 { 13 s.append("5"); 14 System.out.println("形参为: "+s); 15 } 16 }
说明形参的改变会影响实参的改变,即引用的传递
1 public class Test 2 { 3 public static void main(String[] args) 4 { 5 StringBuffer sb=new StringBuffer(); 6 Test.TestString(sb); 7 System.out.println("实参为: "+sb.toString()); 8 9 } 10 11 public static void TestString(StringBuffer s) 12 { 13 s.append("5"); 14 System.out.println("形参为: "+s); 15 } 16 }
说明形参的改变会影响实参的改变,即引用的传递
其区别在于:String类不可变
而StringBuilder与StringBuffer可变
默认创建了一个长度为16的数组。
故在String作为形参时,由于String的不可变性,在作形参时形参和实参分别指向了不同的字符串,由于StringBuilder的可变性,形参还是在实参的基础上继续添加新的字符串。
路漫漫其修远兮,吾将上下而求索