String、StringBuffer和StringBuilder

一、详解

  1. String操作详解
    StringBuilder>StringBuffer>String
    why?
    String:字符串常量
    StringBuffer:字符串变量
    StringBuilder:字符串变量
    从名字分析来看,String是一个常量,也就是它产生之后就不能被改变,那么等等看看下面的代码
String s = "hello";
s+="world";
System.out.println(s);//结果为:"helloworld"

我们不是说String是字符串常量吗?哪为甚吗?它又改变值了呢?下面我们看一下内存图

首先我们要明确一下:字符串的直接赋值的方式是先到字符串常量池当中去找,如果没有就创建并返回,如果有就直接返回;字符串的另一个特性就是一旦被赋值就不能被改变;
先说一下上面代码的执行过程:
a:在栈内存当中执行String s = “hello”的代码,首先我们要判断”hello”这个字符串是否存在字符串常量池。
b:如果”hello”不在字符串常量池当中,那么就创造一个,然后把”hello”的地址给s,赋值给s;
c:当执行s+=”world”;时,由于字符串常量的特点,所以给”world”从新开一个空间。
d:然后在从新开一个空间把两个串拼接在一起,把地址给s赋值给s;
注意:我们说的字符串一旦创建就不能被改变,不是说的s不能被改变,而是说的”hello”字符串不能被改变
从上面执行过程发现:没当用String进行操作的时候会创建好几个对象,所以这特别耗时和浪费空间,而StringBuffer和StringBuilder就不一样了,他们是字符串变量,是可以改变,所以在进行操作的时候是不用在内存当中新开辟一个空间的,直接调用append()方法在原先的空间后面添加就可以。

二 、面试常问的点

  1. String、StringBuffer和StringBuilder的区别?
    1. String 是内容不可变得,而其他两者内容是可以改变的;
    2. StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高。(以上所的是多线程)
  2. StringBuffer和数组的区别?
    二者都可以看做是一个装数据的容器,但是呢,StringBuffer是一个字符串数据,而数组可以是任何类型的数据,但是必须是同一类型。
  3. 形式参数问题
    1. String作为形式参数传递,把String当成一个基本数据类型;
    2. StringBuffer作为形式参数
      1. 基本类型:形式参数的改变不影响实际参数。
      2. 引用类型:形式参数的改变直接影响实际参数。

注意:String作为形式参数和基本类型一样,因为它在内存中的位置不一样,所以是一个特殊的类

三.尾巴

1.如有错误欢迎大家指出,我会及时更正,有什么不懂也可以留言提问,互相交流吗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值