String,StringBuffer ,StringBuilder 的区别及其详解

目录

  • 一、String
    • 1.1 String介绍
    • 1.2 深入理解String的不可变性
    • 1.3 String 操作字符串方法
  • 二、StringBuffer
    • 2.1 StringBuffer介绍
    • 2.2 StringBuffer 构造方法
    • 2.3 StringBuffer 常用方法
  • 三、StringBuilder
    • 2.1 StringBuffer介绍
  • 四、String,StringBuffer ,StringBuilder 区别
    • 最后

一、String

1.1 String介绍

  • String 类代表的字符串,程序中任何字符串都是String类的对象
public final class String extends Objectimplements Serializable, Comparable<String>, CharSequence

在这里插入图片描述

  • 字符串是常量;它们的值在创建之后不能更改。
  • 通过上图发现String final修饰,所以字符串的值创建之后就不可以被修改,具有不可变性

1.2 深入理解String的不可变性

  • 通过字面量方式为字符串赋值时,此时的字符串存储在方法区的字符串常量池中,并且在字符串常量池中不会存储相同内容的字符串。
    在这里插入图片描述
  • 也就是说,s1 和 s2 指向同一地址
    那么你可能会说,我重新给s1 赋值,他不就改变了吗?那还有什么不可变性呢
    在这里插入图片描述
  • 看上图就知道了,给s1重新赋值,,只是在字符串常量池又new 了一新的字符串,原先的”abc“并没有被改变。

1.3 String 操作字符串方法

  • 大家可以点下面链接,总结很详细
    String 方法详细总结及归类

二、StringBuffer

2.1 StringBuffer介绍

  • 也就是因为String类字符串定义后不能改变,所以提供了StringBuffer类(字符串缓冲区)来操作字符串。
  • 可将字符串缓冲区安全地用于多个线程
  • 看完上面,你也就知道String 和StringBuffer的最大区别了
  • 那就是StringBuffer创建的字符串可以改变

2.2 StringBuffer 构造方法

既然是类,那当然有构造方法啦,有了构造方法就可以创建StringBuffer类的字符串了

  • 可不可以像String那样创建呢?
    在这里插入图片描述
    看来是不行的,那该如何创建呢?
  • 当然就像普通类一样啦,new 对象啦!
  • 首先要知道构造方法是啥
声明方法描述
StringBuffer()构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
StringBuffer(CharSequence seq)public java.lang.StringBuilder(CharSequence seq) 构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符。
StringBuffer(int capacity)构造一个不带字符,但具有指定初始容量的字符串缓冲区。
StringBuffer(String str)构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容

创建字符串

 StringBuffer sbf = new StringBuffer("java");

这样就创建了一个可变的字符串了

2.3 StringBuffer 常用方法

有了对象就可调用方法了,下面就演示一些方法

  • 两个最常用方法 append() 和 insert() 方法
  1. append()
声明方法描述
StringBuffer append(boolean b)将 boolean 参数的字符串表示形式追加到序列。
StringBuffer append(char c)将 char 参数的字符串表示形式追加到此序列。
StringBuffer append(char[] str)将 char 数组参数的字符串表示形式追加到此序列。
StringBuffer append(char[] str, int offset, int len)将 char 数组参数的子数组的字符串表示形式追加到此序列。
StringBuffer append(CharSequence s)将指定的 CharSequence 追加到该序列。
StringBuffer append(CharSequence s, int start, int end)将指定 CharSequence 的子序列追加到此序列。
StringBuffer append(double d)将 double 参数的字符串表示形式追加到此序列。
StringBuffer append(float f)将 float 参数的字符串表示形式追加到此序列。
StringBuffer append(int i)将 int 参数的字符串表示形式追加到此序列。
StringBuffer append(long lng)将 long 参数的字符串表示形式追加到此序列。
StringBuffer append(Object obj)追加 Object 参数的字符串表示形式。
StringBuffer append(String str)将指定的字符串追加到此字符序列。
StringBuffer append(StringBuffer sb)将指定的 StringBuffer 追加到此序列中。
  • 看着表格里append 方法好像很多,其实只是重载的多,传入参数不同
  • 而且都是追加在末尾了,看演示代码就知道了
 sbf.append("666");// 在末尾追加
 System.out.println(sbf);//java666

2.insert

声明方法描述
StringBuffer insert(int offset, char c)将 char 参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, char[] str)将 char 数组参数的字符串表示形式插入此序列中。
StringBuffer insert(int index, char[] str, int offset, int len)将数组参数 str 的子数组的字符串表示形式插入此序列中。
StringBuffer insert(int dstOffset, CharSequence s)将指定 CharSequence 插入此序列中。
StringBuffer insert(int dstOffset, CharSequence s, int start, int end)将指定 CharSequence 的子序列插入此序列中。
StringBuffer insert(int offset, double d)将 double 参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, float f)将 float 参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, int i)将 int 参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, long l)将 long 参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, Object obj)将 Object 参数的字符串表示形式插入此字符序列中。
StringBuffer insert(int offset, String str)将字符串插入此字符序列中。
  • 跟append 一样,重载的多
  • insert方法可以让你以指定位置插入,append 只能在末尾加
 sbf.insert(4,"-"); // 插入
 System.out.println(sbf );//java-666
  • 其他方法
声明方法描述
int capacity()返回当前容量。
char charAt(int index)返回此序列中指定索引处的 char 值。
int codePointAt(int index)返回指定索引处的字符(统一代码点)。
int codePointBefore(int index)返回指定索引前的字符(统一代码点)。
int codePointCount(int beginIndex, int endIndex)返回此序列指定文本范围内的统一代码点。
StringBuffer delete(int start, int end)移除此序列的子字符串中的字符。
StringBuffer deleteCharAt(int index)移除此序列指定位置的 char。
void ensureCapacity(int minimumCapacity)确保容量至少等于指定的最小值。
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)将字符从此序列复制到目标字符数组 dst。
int indexOf(String str)返回第一次出现的指定子字符串在该字符串中的索引。
int indexOf(String str, int fromIndex)从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
int lastIndexOf(String str)返回最右边出现的指定子字符串在此字符串中的索引。
int lastIndexOf(String str, int fromIndex)返回最后一次出现的指定子字符串在此字符串中的索引。
int length()返回长度(字符数)。
int offsetByCodePoints(int index, int codePointOffset)返回此序列中的一个索引,该索引是从给定 index 偏移 codePointOffset 个代码点后得到的。
StringBuffer replace(int start, int end, String str)使用给定 String 中的字符替换此序列的子字符串中的字符。
StringBuffer reverse()将此字符序列用其反转形式取代。
void setCharAt(int index, char ch)将给定索引处的字符设置为 ch。
void setLength(int newLength)设置字符序列的长度。
CharSequence subSequence(int start, int end)返回一个新的字符序列,该字符序列是此序列的子序列。
String substring(int start)返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
String substring(int start, int end)返回一个新的 String,它包含此序列当前所包含的字符子序列。
String toString()返回此序列中数据的字符串表示形式。(默认)
void trimToSize()尝试减少用于字符序列的存储空间。

三、StringBuilder

2.1 StringBuffer介绍

  • StringBuilder和StringBuffer,String一样代表字符串

  • 也是可变字符序列,API与StringBuffer完全一致,就是为了替换StringBuffer

  • StringBuilder是不保证线程安全,相对StringBuffer在改变字符串时效率较快

  • 如果不考虑线程安全,改变字符建议Builder,如果要求线程安全使用Buffer

StringBuilder 与 StringBuffer 方法完全一致,这里就不在列出了,讲述了,下面总结一下这String,StringBuffer ,StringBuilder 这三个的区别

四、String,StringBuffer ,StringBuilder 区别

  • String 不可变,拼接字符串效率最低
  • StringBuffer 、StringBuilder 均可变
  • StringBuffer 适合多线程,可保证线程安全,但是拼接字符串效率较低。
  • StringBuilder适合单线程,不保证线程安全,拼接字符串效率较高。

最后

编写不易,如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/672584.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中的redo log 和 undo log

undo log和redo log 先引入两个概念&#xff1a; 当我们做了一些操作 (update/delete/insert)&#xff0c;提交事务后要操作MySql中的数据。 为了能够提升性能&#xff0c;引入了两块区域&#xff1a;内存结构和磁盘结构。 磁盘结构&#xff1a; 主要存储的就是数据页&#x…

OSG学习记录

osg开发配置与第一个osg程序-CSDN博客 #include <osg/Geode> #include <osg/ShapeDrawable> #include <osgViewer/Viewer> #include <iostream>int main(int argc, char** argv) {std::cout << "Hello, osg!" << std::endl;osg:…

【Qt系列教程】一、认识Qt、安装Qt、运行Hello Qt

文章目录 1.1 Qt 简介1.2 Qt 的安装1.3 编写 Hello World 1.1 Qt 简介 Qt&#xff08;官网&#xff1a;https://www.qt.io&#xff09;于1995年5月首次公开发布&#xff0c;是一个跨平台的应用程序开发框架&#xff0c;也是最主流的 C 开发框架&#xff1b; Qt 具有其他编程…

Windows安装Kibana7.17.0

安装 Kibana 是通过下载 Kibana 压缩包并解压&#xff0c;然后进行简单的配置即可。以下是在 Windows 系统上安装 Kibana 的基本步骤&#xff1a; 1. 下载 Kibana 访问 Elastic 官网的下载页面&#xff0c;选择适用于你系统的 Kibana 版本进行下载。根据你的系统选择 Windows…

【Linux】进程间通信(System V IPC)

这节我们开始学习System V IPC方案。 分别是共享内存&#xff0c;消息队列与信号量 会着重讲解共享内存&#xff0c;但是消息队列与信号量只会说明一下原理。 原因&#xff1a;System V是新设计的一套标准 与文件的整合度不高只能进行本地通信 更何况&#xff0c;我们现在有…

【30天精通Prometheus:一站式监控实战指南】第15天:ipmi_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

flink Jobmanager metaspace oom 分析

文章目录 现象作业背景分析现象分析类卸载条件MAT 分析 解决办法flink 官方提示 现象 通过flink 页面提交程序&#xff0c;多次提交后&#xff0c;jobmanager 报metaspace oom 作业背景 用户代码是flink 代码Spring nacos 分析 现象分析 从现象来看肯定是因为有的类没有被…

[学习笔记](b站视频)PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】(ing)

视频来源&#xff1a;PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】 前面P1-P5属于环境安装&#xff0c;略过。 5-6.Pytorch加载数据初认识 数据文件: hymenoptera_data # read_data.py文件from torch.utils.data import Dataset …

RabbitMQ-直连交换机(direct)使用方法

RabbitMQ-默认读、写方式介绍 RabbitMQ-发布/订阅模式 目录 1、概述 2、直连交换机 3、多重绑定 4、具体代码实现 4.1 生产者部分 4.2 消费者部分 5、运行代码 6、总结 1、概述 直连交换机&#xff0c;可以实现类似路由的功能&#xff0c;消息从交换机发送到哪个队列…

使用低代码系统的意义与价值主要体现在哪里?

使用低代码系统的意义与价值主要体现在以下几个方面&#xff0c;这些观点基于驰骋低代码设计者的专业洞察和行业经验&#xff1a; 快速原型创建&#xff1a; 低代码平台通过提供图形化界面和预构建的模块&#xff0c;极大地加速了系统原型的创建过程。这意味着企业能够更快地验…

Aras Innovator-Team(群组)的使用方法

当Aras Innovator在处理权限时&#xff0c;在不使用Team的情况下&#xff0c;系统的权限配置可以满足大部分业务场景&#xff0c;如&#xff1a;常见的按照组织架构&#xff0c;成员和角色分配权限&#xff0c;按照生命周期分配权限等。 如果遇到比较复杂的权限需求&#xff0c…

Docker安装启动Mysql

1、安装Docker&#xff08;省略&#xff09; 网上教程很多 2、下载Mysql5.7版本 docker pull mysql:5.7 3、查看镜像是够下载成功 docker images 4、启动镜像&#xff0c;生成容器 docker run --name mysql5.7 -p 13306:3306 -e MYSQL_ROOT_PASSWORD123456 -d mysql:5.7 5…

通过非欧几何体改变 AI 嵌入

目录 一、说明 二、LLM嵌入的形势 三、了解一些背景信息 3.1 什么是嵌入&#xff1f; 3.2 为什么嵌入在 NLP 中很重要&#xff1f; 3.3 复数Complex 几何的角色 3.4 C主动学习 3.5 角度嵌入 &#xff08;AE&#xff09;&#xff1a;解锁稳健排序 3.6 RotatE&#xff1a;将关系…

探索 Python 的 vars() 函数

大家好&#xff0c;在软件开发的过程中&#xff0c;调试是一个不可或缺的环节。无论你是在解决 bug&#xff0c;优化代码&#xff0c;还是探索代码的执行流程&#xff0c;都需要一些有效的工具来帮助你更好地理解和调试代码。在 Python 编程中&#xff0c;vars() 函数是一个非常…

无人机路径规划:基于鸽群优化算法PIO的无人机三维路径规划MATLAB代码

一、无人机模型介绍 无人机三维航迹规划_无人机航迹规划-CSDN博客 二、部分代码 close all clear clc warning (off) global model global gca1 gca2 gca3 gca4 model CreateModel(); % Create search map and parameters load(BestPosition5.mat); load(ConvergenceCurve5…

【Linux】Linux的权限_1

文章目录 三、权限1. shell外壳2. Linux的用户3. Linux权限管理文件访问者的分类文件类型和访问权限 未完待续 三、权限 1. shell外壳 为什么要使用shell外壳 由于用户不擅长直接与操作系统直接接触和操作系统的易用程度、安全性考虑&#xff0c;用户不能直接访问操作系统。 什…

GIS、GPS、RS综合应用

刘老师&#xff08;副教授&#xff09;&#xff0c;北京重点高校资深专家&#xff0c;拥有丰富的科研及工程技术经验&#xff0c;长期从事3S在环境中的应用等领域的研究和教学工作&#xff0c;具有资深的技术底蕴和专业背景。 第一章、3S 技术及应用简介 1.1、3S 技术及集成简…

C++20 范围(Range):简化集合操作

C20 范围&#xff1a;简化集合操作 一、范围&#xff08;Range&#xff09;的目的二、在模板函数中使用范围概念三、投影四、视图五、结论 一、范围&#xff08;Range&#xff09;的目的 在 C20 中&#xff0c;范围概念要求一个对象同时拥有迭代器和结束哨兵。这在标准集合的上…

STM32HAL-最简单的长、短、多击按键框架

目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、总结 概述 本文章使用最简单的写法实现长、短、多击按键框架&#xff0c;非常适合移植各类型单片机&#xff0c;特别是资源少的芯片上。接下来将在stm32单片机上实现&#xff0c;只需占用1个定时…

定个小目标之每天刷LeetCode热题(7)

今天这道题是道简单题&#xff0c;使用双指针进行迭代即可&#xff0c;画了下草图如下 代码如下 class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode p head, q head.next, temp null;while (q ! nu…