当前位置: 首页 > news >正文

【Java面试题】在Java中String,Stringbuffer,StringBuilder的区别?

Hi i,m JinXiang


⭐ 前言 ⭐

本篇文章主要介绍在Java中String,Stringbuffer,StringBuilder的区别以及部分理论知识


🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁

🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言


目录

一、String

1、什么是String?

2、使用String

代码示例:

3、总结String

二、Stringbuffer

1、什么是Stringbuffer

2、使用Stringbuffer

代码示例:

3、总结Stringbuffer

三、StringBuilder

1、什么是StringBuilder

2、使用StringBuilder

代码示例:

3、总结StringBuilder

⭐String、Stringbuffer和StringBuilder的区别


一、String

1、什么是String?

在Java中,String是一个类,用于表示字符串。它是Java中的一个内置类,不需要额外导入就可以使用。String类是不可变的,一旦创建了一个String对象,就无法修改它的值。这意味着每次对字符串进行操作时,实际上是创建了一个新的String对象来存储修改后的字符串。

String类提供了很多方法来操作和处理字符串,例如,比较字符串、拼接字符串、截取子串等。通过这些方法,我们可以对字符串进行各种常见的操作,如查找子串、替换字符、转换大小写等。

在Java中,我们可以使用双引号(" ")来创建一个String对象,例如:

String str = "Hello world!";

也可以使用String关键字来声明一个字符串变量,然后使用new关键字来创建一个String对象,例如:

String str = new String("Hello world!");

双引号(“”)和String关键字来声明都可以使用String类提供的方法来操作和处理字符串

2、使用String

1、String表示字符串类型,属于 引用数据类型,不属于基本数据类型。

2、在java中随便使用 双引号括起来 的都是String对象。


例如:“abc”,“def”,“hello world!”,这是3个String对象。


3、java中规定,双引号括起来的字符串,是 不可变 的,也就是说"abc"自出生到最终死亡,不可变,不能变成"abcd",也不能变成"ab"

代码示例:
public class String_Test {public static void main(String[] args) {// 这两行代码表示创建了3个字符串对象,都在字符串常量池当中。String str1 = "abcdef";String str2 = "abcdef" + "xy";// 分析:这是使用new的方式创建的字符串对象。这个代码中的"xy"是从哪里来的?// 凡是双引号括起来的都在字符串常量池中有一份。// new对象的时候一定在堆内存当中开辟空间。String str3 = new String("xy");}
}

3、总结String

String类代表字符串, Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。

字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享

以下是String的相关构造方法:

构造方法名描述
String()初始化新创建的 String对象,使其表示空字符序列
String(byte[] bytes)通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes,     Charset charset)构造一个新的String由指定用指定的字节的数组解码charset 
String(byte[] bytes, int offset, int length)通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 
String(byte[] bytes, int offset, int length, Charset charset)构造一个新的String通过使用指定的指定字节子阵列解码charset 
String(byte[] bytes, int offset, int length, String charsetName)构造一个新的 String通过使用指定的字符集解码指定的字节子阵列
String(byte[] bytes,String charsetName)构造一个新的String由指定用指定的字节的数组解码charset 
String(char[] value)分配一个新的 String ,以便它表示当前包含在字符数组参数中的字符序列
String(int[] codePoints, int offset, int count)分配一个新的 String ,其中包含 Unicode code point数组参数的子阵列中的 字符 

二、Stringbuffer

1、什么是Stringbuffer

StringBuffer是Java中的一个可变字符串类,它和String类类似,但是可以修改和操作其内部的字符序列。StringBuffer是一个线程安全的类,适用于多线程环境下的字符串操作。

和String类不同,StringBuffer的字符序列是可变的,可以通过调用StringBuffer的方法来修改其内容,比如追加新的字符、插入字符、删除字符等。由于StringBuffer是可变的,所以在进行多次字符串连接和修改时,使用StringBuffer比直接使用String效率要高。

StringBuffer类提供了很多方法来操作和处理字符串,例如,追加字符串、插入字符串、删除字符串、替换字符串等。通过这些方法,可以在字符串中进行各种操作。

  • 每个字符串缓冲区都有一个容量。 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区数组。 如果内部缓冲区溢出,则会自动变大。

在Java中,我们可以使用new关键字来创建一个StringBuffer对象,然后调用它的方法来修改和操作字符串,例如:

StringBuffer stringbuffer = new StringBuffer();
stringbuffer.append("Hello");
stringbuffer.append(" world!");

通过调用append方法,我们可以将不同的字符串追加到StringBuffer的字符序列中。

需要注意的是,由于StringBuffer是线程安全的,所以在单线程环境下,如果只需要修改和操作字符串,建议使用StringBuilder类,因为StringBuilder的性能更高。只有在多线程环境下,才需要使用StringBuffer来保证线程安全性。线程详解:Java 线程(什么是线程?为什么要使用线程?使用线程的好处和优势优点)-CSDN博客

2、使用Stringbuffer

1、StringBuffer是一个可变序列。

2、线程不安全,存在同步操作同一数据的行为,效率高。安全的时候,没有同步操作,效率低。

3、StringBuffer又被称为字符缓冲区,把它当成一个字符串去操作,只不过它与string相比是可以修改内容的。

代码示例:
package com.one;public class StringDemo {public static void main(String[] args) {//public StringBuffer()  构造一个没有字符的字符串缓冲区,初始容量为16个字符。StringBuffer sb1 = new StringBuffer();System.out.println("sb1:" + sb1); //StringBuffer重写了toString方法//如何获取StringBuffer的容量//public int capacity()返回当前容量。System.out.println("当前StringBuffer的容量为:" + sb1.capacity());//public int length()返回长度(字符数)。System.out.println("StringBuffer中字符串的长度为:" + sb1.length());System.out.println("===================================================");//public StringBuffer(int capacity)  构造一个没有字符的字符串缓冲区和指定的初始容量。StringBuffer sb2 = new StringBuffer(50);System.out.println("sb2:" + sb2); //StringBuffer重写了toString方法//如何获取StringBuffer的容量//public int capacity()返回当前容量。System.out.println("当前StringBuffer的容量为:" + sb2.capacity());//public int length()返回长度(字符数)。System.out.println("StringBuffer中字符串的长度为:" + sb2.length());System.out.println("===================================================");//public StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。StringBuffer sb3 = new StringBuffer("hello");System.out.println("sb3:" + sb3); //StringBuffer重写了toString方法//如何获取StringBuffer的容量//public int capacity()返回当前容量。System.out.println("当前StringBuffer的容量为:" + sb3.capacity()); // 21 = 16 + 5//public int length()返回长度(字符数)。System.out.println("StringBuffer中字符串的长度为:" + sb3.length()); // 5}
}

3、总结Stringbuffer

线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。

字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。

以下是Stringbuffer的相关构造方法:

构造方法描述
StringBufferappend(double d)

double参数的字符串表示附加到此序列。

StringBufferappend(String str)

将指定的字符串附加到此字符序列。

StringBufferdeleteCharAt(int index)

删除 char在这个序列中的指定位置。

intindexOf(String str, int fromIndex)

返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。

StringBufferinsert(int offset, boolean b)

在此序列中插入 boolean参数的字符串表示形式。

StringBufferinsert(int index, char[] str, int offset, int len)

在此序列中插入 str数组参数的子阵列的字符串表示形式。

StringBufferinsert(int offset, double d)

在此序列中插入 double参数的字符串表示形式。

intlastIndexOf(String str, int fromIndex)

返回指定子字符串最后一次出现的字符串中的索引。

intlength()

返回长度(字符数)

StringBufferreplace(int start, int end, String str)

用指定的String中的字符替换此序列的子字符串中的 String

StringBufferreverse()

导致该字符序列被序列的相反代替。

voidsetCharAt(int index, char ch)

指定索引处的字符设置为 ch

voidsetLength(int newLength)

设置字符序列的长度。

CharSequencesubSequence(int start, int end)

返回一个新的字符序列,该序列是该序列的子序列。

三、StringBuilder

1、什么是StringBuilder

StringBuilder是Java中的一个可变字符串类,它和StringBuffer类功能相似,都可以对字符串进行修改和操作。StringBuilder也是用来处理可变字符串的,但与StringBuffer不同的是,StringBuilder是非线程安全的类。

和String类不同,StringBuilder的字符序列是可变的,可以通过调用StringBuilder的方法来修改其内容,比如追加新的字符、插入字符、删除字符等。由于StringBuilder是可变的,所以在进行多次字符串连接和修改时,使用StringBuilder比直接使用String效率更高。

StringBuilder类提供了很多方法来操作和处理字符串,例如,追加字符串、插入字符串、删除字符串、替换字符串等。通过这些方法,可以在字符串中进行各种操作。

在Java中,我们可以使用new关键字来创建一个StringBuilder对象,然后调用它的方法来修改和操作字符串,例如:

StringBuilder stringbuilder = new StringBuilder();
stringbuilder.append("Hello");
stringbuilder.append(" world!");

通过调用append方法,我们可以将不同的字符串追加到StringBuilder的字符序列中。

需要注意的是,由于StringBuilder是非线程安全的,所以在多线程环境下,应该使用StringBuffer类来保证线程安全性。只有在单线程环境下,才需要使用StringBuilder来提高性能。

2、使用StringBuilder

首先我们使用StringBuilder()来创建一个空白可变字符串对象,不含有任何内容。

StringBuilder s1 = new StringBuilder();
System.out.println("s1:" + s1);

接下来我们使用StringBuiler(String str)根据字符串内容,来创建可变字符串对象。

StringBuilder s2 = new StringBuilder("Hello World");
System.out.println("s2:" + s2);

最后我们会发现结果为:

sb1:

sb2:Hello World

由于第一个没有给定任何内容,所以控制台的输出为空白。而第二个给定内容为Hello World,所以控制台输出为Hello World。

String转换为StringBuilder
public StringBuilder(String s):通过构造方法就可以实现把String转换为StringBuilder

代码示例:
StringBuilder转换为String
StringBuilder sb = new StringBuilder();
//添加数据
sb.append("Hello");
//StringBuilder转换为String
String a = sb.toString();
System.out.println(a);
String转换为StringBuilderString s = "Hello";
StringBuilder sb = new StringBuilder(s);
System.out.println(sb);

3、总结StringBuilder

StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器。

这里的可变指的是 StringBuilder对象中的内容是可变的。

以下是Stringbuffer的相关构造方法:

构造方法描述
StringBuilderappend(char[] str)

char数组参数的字符串表示追加到此序列。

StringBuilderappend(char[] str, int offset, int len)

char数组参数的子阵列的字符串表示附加到此序列。

intcapacity()

返回当前容量。

StringBuilderdelete(int start, int end)

删除此序列的子字符串中的字符。

StringBuilderdeleteCharAt(int index)

删除 char在这个序列中的指定位置。

StringBuilderinsert(int offset, char c)

在此序列中插入 char参数的字符串表示形式。

StringBuilderinsert(int offset, char[] str)

在此序列中插入 char数组参数的字符串表示形式。

voidsetLength(int newLength)

设置字符序列的长度。

StringtoString()

返回表示此顺序中的数据的字符串。

voidtrimToSize()

尝试减少用于字符序列的存储。

⭐String、Stringbuffer和StringBuilder的区别

String、StringBuffer和StringBuilder都是Java中用于处理字符串的类

它们之间的主要区别如下:

1、可变性:String类是不可变的,即一旦创建了一个String对象,就不能修改它的值。而StringBuffer和StringBuilder是可变的,可以对其内容进行修改和操作。

2、线程安全性:String是线程安全的,即多个线程可以同时访问和操作一个String对象而不会出现线程安全问题。而StringBuffer是线程安全的,多个线程可以共享一个StringBuffer对象而不会出现数据混乱。而StringBuilder是非线程安全的,不同的线程同时访问和操作一个StringBuilder对象可能会出现数据混乱。

3、性能:由于String是不可变的,每次对String进行修改都会创建一个新的String对象,这会产生大量的临时对象,降低性能。而StringBuffer和StringBuilder是可变的,对其进行修改不会创建新的对象,可以提高性能。StringBuilder比StringBuffer的性能更高,因为StringBuffer为了保证线程安全性使用了同步锁,而StringBuilder没有。

综上所述,如果需要处理不可变的字符串或在多线程环境下操作字符串时,应使用String类或StringBuffer类。如果在单线程环境下需要频繁修改和操作字符串时,应使用StringBuilder类以获得更好的性能。

总结不易,希望宝宝们不要吝啬亲爱的👍哟(^U^)ノ~YO!如有问题,欢迎评论区批评指正😁

相关文章:

【Java面试题】在Java中String,Stringbuffer,StringBuilder的区别?

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在Java中String,Stringbuffer,StringBuilder的区别以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录…...

让AIGC成为你的智能外脑,助力你的工作和生活

人工智能成为智能外脑 在当前的科技浪潮中,人工智能技术正在以前所未有的速度改变着我们的生活和工作方式。其中,AIGC技术以其强大的潜力和广泛的应用前景,正在引领着这场革命。 AIGC技术是一种基于人工智能的生成式技术,它可以通…...

ubuntu12.04 源

替换 /etc/apt/sources.list deb http://old-releases.ubuntu.com/ubuntu precise main restricted universe multiverse deb http://old-releases.ubuntu.com/ubuntu precise-security main restricted universe multiverse deb http://old-releases.ubuntu.com/ubu…...

openssl数据压缩

介绍 数据压缩是将原有数据通过某种压缩算法计算得到相对数据量小的过程。这种过程是可逆的,即能通过压缩后的数据恢复出原数据。数据压缩能够节省存储空间,减轻网络负载。 在即需要加密又需要压缩的情况下,必须先压缩再加密,次…...

SQLturning:定位连续值范围起点和终点

在上一篇blog说到,如何去优化查询连续值范围,没看过的朋友,上篇blog链接[在此]。(https://blog.csdn.net/weixin_42575078/article/details/135067645?spm1001.2014.3001.5501) 那么今天来说说怎么将连续的数据合并,然后返回合并…...

饥荒Mod 开发(十七):手动保存和加载,无限重生

饥荒Mod 开发(十六):五格装备栏 饥荒Mod 开发(十八):Mod 添加配置选项 饥荒游戏会自动保存,本来是一个好的机制,但是当角色死亡的时候存档会被删除,又要从头开始,有可能一不小心玩了很久的档就直接给整没了…...

Skywalking系列之最新版9.2.0-JavaAgent本地构建

MAC 10.15.7IDEA 2021.2skywalking-agent 9.2.0-SNAPSHOTJDK 17/21 (最新的代码要看最新的要求,注意不能使用JDK8,会构建失败)Maven 3.6.0 关于本地构建JavaAgent源码 1、获取源码,加载submodule 分步执行: git clone https:/…...

olap/clickhouse-编译器优化与向量化

本文主要结合15721和clickhouse源码来聊聊向量化,正好我最近也在用Eigen做算子加速,了解下还是有好处的。 提示编译器 提示编译器而不是复杂化简单的代码 什么时候使用汇编,什么时候使用SIMD?下面有几个基本原则: …...

RK3399平台开发系列讲解(内核入门篇)网络协议的分层

🚀返回专栏总目录 文章目录 一、应用层二、传输层三、网络层四、数据链路层(Data Link Layer)五、物理层沉淀、分享、成长,让自己和他人都能有所收获!😄 📢对于多数的应用和用户而言,使用互联网的一个基本要求就是数据可以无损地到达。用户通过应用进行网络通信࿰...

Idea远程debugger调试

当我们服务部署在服务器上,我们想要像在本地一样debug,就可以使用idea自带的Remote JVM Debug 创建Remote JVM Debug服务器启动jar打断点进入断点 当我们服务部署在服务器上,我们想要像在本地一样debug,就可以使用idea自带的 Remote JVM Debug) 创建Rem…...

MATLAB - Gazebo 仿真环境

系列文章目录 前言 机器人系统工具箱(Robotics System Toolbox™)为使用 Gazebo 模拟器可视化的模拟环境提供了一个界面。通过 Gazebo,您可以在真实模拟的物理场景中使用机器人进行测试和实验,并获得高质量的图形。 Gazebo 可在…...

selenium自动化webdriver下载及安装

1、确认浏览器的版本 在浏览器的地址栏,输入chrome://version/,回车后即可查看到对应版本 2、找到对应的chromedriver版本 2.1 114及之前的版本可以通过点击下载chromedriver,根据版本号(只看大版本)下载对应文件 2.2 116版本通过…...

网络基础介绍

1.网线制作 1.1 网线制作需要的工具 网线 网线钳 水晶头 测试仪 ​编辑 1.2 网线的标准 1.3 网线的做法 2.集线器&交换机&路由器的介绍 3.OSI七层模型 4.路由器的设置 4.1 常见的路由器设置地址 4.2 常见的路由器账号密码 4.3 登录路由器 设置访客网…...

Java中四种引用类型(强、软、弱、虚)

目录 引言 强引用(Strong References) 软引用(Soft References) 弱引用(Weak References) 虚引用(Phantom References) 引用类型的应用场景 总结 引言 Java中的引用类型是管理…...

【MyBatis学习笔记】MyBatis基础学习

MyBatis基础 MyBatis简介MyBatis特性MyBatis下载和其他持久化层技术对比 核心配置文件详解默认的类型别名 搭建MyBatis开发环境创建maven工程创建MyBatis的核心配置文件创建mapper接口创建MyBatis的映射文件通过junit测试功能加入log4j日志功能 MyBatis获取参数值的两种方式&am…...

还在为论文焦虑?免费AI写作大师帮你搞定

先来看1分钟的视频,对于要写论文的你来说,绝对有所值! 还在为写论文焦虑?免费AI写作大师来帮你三步搞定 第一步:输入关键信息 第二步:生成大纲 稍等片刻后,专业大纲生成(由于举例&am…...

3.10【窗口】窗口使用示例(窗口缩放 三)

五,从窗口所有者放大 要从窗口的所有者本身进行放大,可以将源图像矩形设置得比窗口小。可以想象我们在一张图片中选取一部分进行放大的操作。 屏幕使用默认位置 (0,0) 作为源矩形、窗口和显示器显示的左上角。要放大源图形的特定区域,必须设置源矩形的大小。 源矩形由这些…...

【机器学习】密度聚类:从底层手写实现DBSCAN

【机器学习】Building-DBSCAN-from-Scratch 概念代码数据导入实现DBSCAN使用样例及其可视化 补充资料 概念 DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算…...

2023-12-20 二叉搜索树的最近公共祖先和二叉搜索树中的插入操作和删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先 思想:和二叉树的公共最近祖先节点的思路基本一致的!就是不用从下往上遍历处理!可以利用的二叉搜索树的特点从上往下处理了!而且最近公共节点肯定是第一个出现在【q,p】这个区间的内的&…...

pytorch文本分类(三)模型框架(DNNtextCNN)

pytorch文本分类(三)模型框架(DNN&textCNN) 原任务链接 目录 pytorch文本分类(三)模型框架(DNN&textCNN)1. 背景知识深度学习 2. DNN2.1 从感知器到神经网络2.2 DNN的基本…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...