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

news/2024/10/31 4:15:38/

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

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


http://www.ppmy.cn/news/5654.html

相关文章

矢量网络分析仪如何测量史密斯图及滤波器的带宽?

矢量网络分析仪是一种很神奇的测量仪器,它的功能很强大也值得人们去探索。今天,安泰测试工程师就针对矢量网络分析仪中的史密斯图及滤波器的带宽测量进行简单的介绍,希望能够让更多的人对此有所了解,并产生兴趣。 首先仪器了解一下…

试卷安全分发系统

摘要 高校教务管理过程中,试卷以明文形式传输和集中存储,存在数据泄漏安全隐患。现提出了一个基于数字证书的试卷防泄漏方案,采用算法加密试卷,试卷在传输过程中中以密文的形式传输,每次传输的时候都会对试卷进行签名…

Mac怎么清理缓存?这两种方法都非常好用哦

与电脑系统或应用程序非常相似,您的Mac也有自己的系统缓存,它可以在后台临时存储数据,以加快软件安装速度并减少互联网数据使用量(通过Apple)。与电脑系统或应用程序类似,缓存数据可能会开始堆积——占用存…

艾美捷硝酸盐/亚硝酸盐荧光法检测试剂盒基本参数说明

一氧化氮(NO)由神经元、内皮细胞、血小板和中性粒细胞响应于稳态刺激产生微量。这种NO被迅速清除(t4 s),并以旁分泌的方式传递细胞信号。NO与鸟苷酸环化酶的HEME辅基相互作用,激活酶并导致cGMP水平升高。其…

hadoop常用指令

-ls查看HDFS目录文件 如hadoop fs -ls / -mkdir:在HDFS上创建目录,可以创建多级目录 如hadoop fs -mkdir /tmp/user001 -copyFromLocal:复制本地文件系统到HDFS 如hadoop fs -copyFromLocal /home/01.txt /tmp/user001/ -copyToLocal&#xf…

【Linux】Linux下基本指令(二)

作者:一个喜欢猫咪的的程序员 专栏:《Linux》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 1. Linux基本指令:(续) 1.1man指令&am…

WEB接口测试之Jmeter接口测试自动化(初次接触)

软件测试自动化从不同的测试阶段分类,可从下层到上层依次分为单元测试-->接口测试-->界面自动化测试。 单元测试一般有开发人员自行完成,而界面自动化测试合适的测试条件又很难达到,测试人员在繁杂的手工界面测试之余, 更…

SpringBoot+Vue实现前后端分离的教务评教系统

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…