String,StringBuffer,StringBuilder 的使用及拓展

一、String的源码简扒

String 类是 final 类,String的实现是依赖 char+数组,且数组(在内存中存储位置是连续的)为 final 类型(不可修改)。 所以,String 创建出来的对象不可修改。

顺便一提,定义char变量的时候用单引号‘’,且字符长度为1,如 char a= '';

二、String 的使用示例

补充:== 比较的是引用,equals比较的是值

示例1。此种方式创建的String字符,是从常量池里获取来的,str1使用的时候,常量池不存在,就创建此数据,str2使用的时候,常量池已存在该数据,直接引用。所以,两者的内存地址和值都一样。

示例2。如下方式,在常量池创建hello常量,堆里创建两个String对象。所以以下两个对象,值相等,内存地址不相等。

示例3。对象str1是创建了常量池数据,一个在常量池,一个在堆里,所以值相等,内存地址不相等。

示例4。字符串先拼接,后赋值,两个对象的值和内存地址都一样。

示例5。str1和str2在编译的时候把常量创建出来,使用“+”号的时候,会创建一个新的对象出来,导致内存地址不一样,值相等。

基于jdk1.8里String拼接符 "+" 的讲解截图可知,使用+的时候,会通过StringBuffer或StringBuilder的append方法实现,然后toString(创建新对象)

如下StringBuilder的toString()方法

三、String对象的创建个数问题

四,StringBuffer,StringBuilder的区别

1,StringBuilder和StringBuffer的源码中继承类,实现接口完全一样。且都更强调append和insert的使用。初始默认值都为16,会自动对容器的大小进行扩容。执行toString()方法返回String对象。

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
public final class StringBuffer  extends AbstractStringBuilder implements java.io.Serializable, CharSequence

但是简介上又有点不一样。

2,StringBuilder强调单线程应用的时候会更快。如下源码简介

Where possible,it is recommended that this class be used in preference to {@code StringBuffer} as it will be faster under most implementations.

3,StringBuffer强调更安全。如源码简介 :String buffers are safe for use by multiple threads.

StringBuffer对象内的方法都有synchronized修饰,即同步代码块,保证同步。包含一个短暂的缓冲区,且意思为无论StringBuffer何时修改,都会把最新的缓存值返回给tostring

4,对比。

String:创建后值不可变,少量或局部确定性变量情况下适用

StringBuilder:值可变,线程不安全,操作更快,适合单线程,未知数量下字符串拼接使用。

StringBuffer:值可变,线程安全,适合多线程,未知数量的字符串拼接使用。

附:速度问题,要具体问题具体分析,不能直接下结论。String确定性常量在编译期会先生成,运行期会动态生成未确定的常量

5, AbstractStringBuilder 接口里那些有意思的事

字符的最大长度:Integer 的最大值减 8。

空间不够的时候,重新开辟新存储空间,将旧数据和新添加的数据分配到新的存储空间,将新数据拼接到旧数据的后面,

对类型的限制,如果是boolean类型,拼接字符true或false,如果拼接的对象是null,会拼接为null字符串,类型为float和int的时候,如果达到int的最小值,直接返回的是个数字:-2147483648(float也是如此)超出最大长度,代码异常

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值