Java对象StringBuffer类-14-StringBuffer和StringBuilder的区别

       本篇我们来理解下String和StringBuffer分别作为参数传递会发生什么,其值到底会不会发生改变。然后总结一下String和StringBuffer和StringBuilder三者的区别,作为结束String和StringBuffer类的学习。

 

       一个带参数的方法,参数是可以是基本数据类型,也可以是引用数据类型。之前我们有这么一个理论。如果基本数据类型作为参数传递,值是不会发生改变。如果引用数据类型作为参数传递,其值会发生改变。那么我们就来看看String和StringBuffer作为参数传递,其值到底会不会发生变化。

 

1.String类对象作为参数传递

 

package string;

public class Dem04_StringAndStringBuffer {

   public static void main(String[] args) {
      Strings = "Anthony";
      System.out.println(s);
      change(s);
      System.out.println(s);
   }
   public static void change(String s) {
      s += "Liu";
   }
}

运行结果:Anthony 和Anthony

 

解释:

       为什么第二个输出没有打印“AnthonyLiu”? 在执行change()方法的时候,在方法局部内,S的值确实是“AnthonyLiu”, 但是当change()方法弹出栈内存,局部变量S变成了垃圾会被JVM回收。所以第二行打印的s,依然是Main方法里的指向常量池中“Anthony”对象的引用,所以打印出来,值没有发生改变。结论:String对象作为参数传递,其值没有改变,和基本数据类型一样。

 

2.StringBuffer对象作为参数传递

 

package string;

public class Dem04_StringAndStringBuffer {

   public static void main(String[] args) {
      StringBuffersb = new StringBuffer();
      sb.append("Anthony");
      System.out.println(sb);
      change(sb);
      System.out.println(sb);
   }
 
   publicstaticvoid change(StringBuffer s) {
      s.append("Liu");
   }
}

输出结果:Anthony 和AnthonyLiu


解释:

      第一句代码是新建一个StringBuffer对象,字符为空,执行第二行的apend方法之后,sb的值肯定变成了“Anthony”,这个时候sb是一个对象引用,指向了“Anthony”这个对象。接下来,调用change方法,new StringBuffer()作为参数传递,赋值给了形式参数s,所以s的值变成了“Anthony”,在执行change方法,相当于在“Anthony”的基础上加上了“Liu”,所以,上面其实是两个对象(new StringBuffer和形式参数的s)都指向同一个引用(sb),所以, StringBuffer作为参数传递,是引用类型的传递。

 

3.String和StringBufferStringBuilder的区别

 

关于String和StringBuffer或者StringBuffer和StringBuilder区别,在面试过程必考的问题。

 

1)Sting 和StringBuffer的区别

 

       String是字符串常量,一旦创建就不能改变。StringBuffer是字符串缓冲区,可以通过apend和insert进行长度和内容的改变。

2)StringBuffer和StringBuilder的区别

       如果你打开API中搜索,StringBuilder,可以发现,和StringBuffer的构造方法和类方法都一模一样。主要从以下几点回答

StringBuffer:

1.版本,从Java1.0版本就有这个类

2.线程同步

3.线程安全

4.效率低

 

StringBuilder:

1.版本,从Java 1.5开始出现

2.线程不同步

3.线程不安全

4.效率高

       其实线程的同步和安全和效率都是一个整体条件出现(线程同步就必安全,就必效率低),不能单独拆分出来理解,本身就是线程相关的知识。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值