【Java基础知识复盘】String、StringBuffer、StringBuilder篇——持续更新中

本人知识复盘系列的博客并非全部原创,大部分摘自网络,只是为了记录在自己的博客方便查阅,往后也会陆续在本篇博客更新本人查阅到的新的知识点,望悉知!

String类

在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

创建字符串
  • String str = "bejav";
    
  • String str = new String("bejav");
    

String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上

这里有一个点需要注意:String str = “bejav” 创建了多少个对象? 而 String str = new String(“bejav”) 又创建了多少个对象?

  • String str = “bejav” 创建了0个或1个对象,因为这是存储在公共常量池中,如果常量池中有bejav,就不用创建对象,如果没有就创建
  • String str = new String(“bejav”) 是存储在堆上,所以这里首先就需要在堆中创建一个对象,然后再从公共常量池中寻找bejav,如果没有就还要再创建一个对象

img

String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串

String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了

字符串长度

用于获取有关对象的信息的方法称为访问器方法

String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数

连接字符串

String类提供了连接两个字符串的方法:

string1.concat(string2);
"我的名字是".concat("bejav");

更常用的是使用 + 操作符来连接字符串

String方法-看API

https://www.runoob.com/manual/jdk11api/java.base/java/lang/String.html

常见面试题

String为什么是不可变字符串?但是我们在实际应用中String是可以被改变的,是为什么

不可变字符串主要是:

  • 保存字符串的数组被final修饰并且是私有的,并且 String 类没有提供和暴露修改这个字符串的方法
  • String 类被 final修饰不能被子类继承,进而避免了子类破坏 String不可变

实际中可变的原因是:

  • 其实并不是改变 String ,是新创建了一个 String 对象指向改变后的值,原本的 String 成为副本字符串对象存留在内存中。

String str = new String(“abc”) 和 String str = “abc” 两者的区别在哪里?

String str = new String(“abc”) :

  • 不管字符串常量池中存不存在 “abc” ,直接就创建直接新建一个字符串 “abc” (注意新建的字符串 “abc” 不是在字符串常量池中,而是在堆中),然后将其赋给str。这种效率低于使用字符串常量池的方式。

String str = “abc” :

  • 首先查看字符串常量池中是否存在字符串 “abc” ,如果存在则直接将“abc”赋给str,如果不存在则先在字符串常量池中新建一个字符串 “abc” ,然后再将其赋给str。

String中 + 和 StringBuffer中的append性能上有什么区别?

+:

每次对 String 类型进行 “+” 的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。所以经常改变内容的字符串最好不要用 String 的 “+” 。因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

append:

使用 StringBuffer 类的 append 方法时每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。

需要线程安全使用 StringBuilder

StringBuffer、StringBuilder

介绍

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

img

在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。

StringBuffer方法

以下是StringBuffer类支持的主要方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AOam0zYK-1671692616902)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20221221153809908.png)]

还有其他常用的方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7VMoidke-1671692616903)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20221221153906648.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IdVYrj5i-1671692616903)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20221221153917046.png)]

更多的StringBuffer类的介绍:https://www.runoob.com/manual/jdk11api/java.base/java/lang/StringBuffer.html

StringBuilder类:https://www.runoob.com/manual/jdk11api/java.base/java/lang/StringBuilder.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BeJav

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

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

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

打赏作者

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

抵扣说明:

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

余额充值