【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的相关构造方法:
| 构造方法 | 描述 |
StringBuffer | append(double d) 将 |
StringBuffer | append(String str) 将指定的字符串附加到此字符序列。 |
StringBuffer | deleteCharAt(int index) 删除 |
int | indexOf(String str, int fromIndex) 返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。 |
StringBuffer | insert(int offset, boolean b) 在此序列中插入 |
StringBuffer | insert(int index, char[] str, int offset, int len) 在此序列中插入 |
StringBuffer | insert(int offset, double d) 在此序列中插入 |
int | lastIndexOf(String str, int fromIndex) 返回指定子字符串最后一次出现的字符串中的索引。 |
int | length() 返回长度(字符数) |
StringBuffer | replace(int start, int end, String str) 用指定的String中的字符替换此序列的子字符串中的 |
StringBuffer | reverse() 导致该字符序列被序列的相反代替。 |
void | setCharAt(int index, char ch) 指定索引处的字符设置为 |
void | setLength(int newLength) 设置字符序列的长度。 |
CharSequence | subSequence(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的相关构造方法:
| 构造方法 | 描述 |
StringBuilder | append(char[] str) 将 |
StringBuilder | append(char[] str, int offset, int len) 将 |
int | capacity() 返回当前容量。 |
StringBuilder | delete(int start, int end) 删除此序列的子字符串中的字符。 |
StringBuilder | deleteCharAt(int index) 删除 |
StringBuilder | insert(int offset, char c) 在此序列中插入 |
StringBuilder | insert(int offset, char[] str) 在此序列中插入 |
void | setLength(int newLength) 设置字符序列的长度。 |
String | toString() 返回表示此顺序中的数据的字符串。 |
void | trimToSize() 尝试减少用于字符序列的存储。 |
⭐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的基本…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
