String、StringBuffer、StringBuilder源码解读,常量池

一:String 类的结构

首先看一下 String 类的结构

在这里插入图片描述
1、String 类实现了接口 Serializable【String 可以串行化:可以在网络传输】
2、Comparable 【String 对象可以比较大小】
3、String 是 final 类,不能被其他的类继承

二:创建 String 对象的两种方式

//方式一:直接赋值
String str1 = "hello";
//方式二:调用构造器
String str2 = new String("hello");

我们来看一下它的构造方法:
在这里插入图片描述
在这里插入图片描述
我们可以看出,String 字符串的值是存放在字符数组 value 中,所以 String 的底层就是char 数组。

两种创建 String 对象的区别:
方式一:先从常量池中查看是否有"hello",如果有则直接指向,如果没有就先创建,然后再指向,最终 str1 指向的是常量池中的空间地址。

方式二:调用构造器的话,则会先在堆中创建一个空间 (value数组),由这个空间指向常量池中的 “hello” 空间。如果有则直接指向,如果没有就先创建,然后再指向。最终 str2 指向的是堆中的空间地址
在这里插入图片描述
所以:

System.out.println(str1.equals(str2));    // true
System.out.println(str1 == str2);        // false

三:字符串的特性

String str1 = "hahaha";
str1 = "tom";

在这里插入图片描述

String a = "hello";
String b = "world";
String c = a + b;

在这里插入图片描述
采用 + 运算符拼接字符串时:
1、如果拼接的都是字符串直接量,则在编译时编译器会将其直接优化为一个完整的字符串,和你直接写一个完整的字符串是一样的,所以效率非常的高。

2、如果拼接的字符串中包含变量,则在编译时编译器采用StringBuilder对其进行优化,即自动创建StringBuilder实例并调用其append()方法,将这些字符串拼接在一起,效率也很高。但如果这个拼接操作是在循环中进行的,那么每次循环编译器都会创建一个StringBuilder实例,再去拼接字符串,相当于执行了 new StringBuilder().append(str),所以此时效率很低。

我们看一下源码,看看字符串 c 是怎么拼接的。
第一步:先 new 出来一个 StringBuilder 对象
在这里插入图片描述
第二步:使用 append 方法追加 “hello”
在这里插入图片描述
第三步:使用 append 方法追加 “world”
在这里插入图片描述
第四步:使用 toString 方法
在这里插入图片描述

四:String 、StringBuffer 与 StringBuilder

1、StringBuffer

String 保存的是字符串常量,里面的值不能更改,每次 String 类的更新实际上就是更改地址,效率较低。

private final char value[];

StringBuffer 保存的是字符串变量,里面的值可以更改,每次 StringBuffer 的更新实际上可以更新内容,不用每次都更新地址。其实 StringBuffer 就是一个容器

构造方法:
1、StringBuffer()
在这里插入图片描述
2、StringBuffer(20)
在这里插入图片描述
3、StringBuffer(“zzuli”)
在这里插入图片描述

2、StringBuilder

StringBuilder 是一个可变的字符序列。此类提供与 StringBuffer 兼容的API,但是它不能保证同步。也就是说 StringBuilder 是线程不安全的。如果在单线程的情况下建议使用 StringBuilder ,它比 StringBuffer 更快。

3、String 、StringBuffer 和 StringBuilder的区别

1、StringBuilder 和 StringBuffer非常类似,均代表可变的字符序列,而且方法也一样。
2、String 是不可变字符序列,效率低,但是复用率高。
3、StringBuffer 是可变字符序列、效率较高(增删)、线程安全。
4、StringBuilder 是可变字符序列、效率最高、线程不安全。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小本科生debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值