(原)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的可变性,形参还是在实参的基础上继续添加新的字符串。

原文地址:https://www.cnblogs.com/xh0102/p/5803530.html