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适合单线程,不保证线程安全,拼接字符串效率较高。

最后

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 网络爬虫:深入解析 Scrapy

大家好&#xff0c;在当今数字化时代&#xff0c;获取和分析网络数据是许多项目的关键步骤。从市场竞争情报到学术研究&#xff0c;网络数据的重要性越来越被人们所认识和重视。然而&#xff0c;手动获取和处理大量的网络数据是一项繁琐且耗时的任务。幸运的是&#xff0c;Pyth…

vue3 todolist 简单例子

vue3 简单的TodList 地址&#xff1a; https://gitee.com/cheng_yong_xu/vue3-composition-api-todo-app-my 效果 step-1 初始化项项目 我们不采用vue cli 搭建项目 直接将上图文件夹&#xff0c;复制到vscode编辑器&#xff0c;清空App.vue的内容 安装包 # 安装包 npm…

云原生架构案例分析_2.云原生技术助力某汽车公司数字化转型实践

名词解释&#xff1a; 互联网 在“互联网”模式下&#xff0c;我们仅仅把互联网看作是一种传播工具、传播手段、传播渠道和传播平台&#xff0c;对于互联网的应用大体上是在既有的运作逻辑的基础之上&#xff0c;把互联网作为延伸传媒影响力、价值和功能的一种延伸型工具&…

Linux基础1-基本指令1

1.Linux学习前言 Linux的学习非常重要&#xff0c;我们学习Linux的第一步是在电脑中搭建Linux环境。 对于没有搭建过的可以看这阿伟t的一篇文章 【Linux入门】Linux环境配置-CSDN博客 我的环境为XShell,运行的云服务器是阿里云 2.本章重点 1.显示当前目录下的所有文件…

针对大模型的上下文注入攻击

大型语言模型&#xff08;LLMs&#xff09;的开发和部署取得了显著进展。例如ChatGPT和Llama-2这样的LLMs&#xff0c;利用庞大的数据集和Transformer架构&#xff0c;能够产生连贯性、上下文准确性甚至具有创造性的文本。LLMs最初和本质上是为静态场景设计的&#xff0c;即输入…

Xilinx RFSOC 47DR 8收8发 信号处理板卡

系统资源如图所示&#xff1a;  FPGA采用XCZU47DR 1156芯片&#xff0c;PS端搭载一组64Bit DDR4,容量为4GB,最高支持速率&#xff1a;2400MT/s;  PS端挂载两片QSPI X4 FLASH&#xff1b;  PS支持一路NVME存储&#xff1b;  PS端挂载SD接口&#xff0c;用于存储程序&…

解决kettle界面右上角的connect消失——且使用admin登录不上Kettle资源库

一、问题描述 1.1、Kettle界面右上角的connect消失了 当我们配置Kettle界面的资源库(Other Repositories)内容后,Kettle界面右上角的connect消失了;如下图所示: 1.2、使用默认的账户【admin】和密码【admin】登录不上kettle资源库 当我们切换到我们配置的数据库使用超管账…

uniapp实现微信小程序调用云函数【vue3】

本人是从微信开发者工具写原生微信小程序一步一步走来&#xff0c;由于vue3框架的慢慢的步入前端市场&#xff0c;为了不被前端市场遗弃&#xff0c;果断从vue2开始步入vue3的学习&#xff0c;本人习惯在在HBuilder X写uniapp的项目&#xff0c;过去uniapp默认vue2框架&#xf…

注册北京个体工商户条件和办理时间

在北京这座充满活力的城市中&#xff0c;每天都有无数的创业者怀揣着梦想&#xff0c;踏上创业之路。然而&#xff0c;对于许多初次接触企业注册的人来说&#xff0c;往往对注册流程和时间感到困惑。特别是选择代理服务时&#xff0c;更希望了解一个大概的时间范围。那么&#…

【案例实操】银河麒麟桌面操作系统实例分享,V10SP1重启后网卡错乱解决方法

1.问题现象 8 个网口&#xff0c; 命名从 eth1 开始到 eth8。 目前在系统 grub 里面加了 net.ifnames0 biosdevname0 参数&#xff0c; 然后在 udev 规则中加了一条固定网卡和硬件 pci 设备号的规则文件。 最后在 rc.local 中加了两条重新安装网卡驱动的命令&#xff08; rmmod…

Spring 中如何控制 Bean 的加载顺序?

如果你脱口而出说添加 Order 注解或者是实现 Ordered 接口&#xff0c;那么恭喜&#xff0c;你掉坑了。 一 Order 注解和 Ordered 接口 在 Spring 框架中&#xff0c;Order 是一个非常实用的元注解&#xff0c;它位于 spring-core 包下&#xff0c;主要用于控制某些特定上下文…

git基本使用——回退,撤销add,commit,合并分支

学习笔记 笔记中表格中的—— 表示需要回退的地方&#xff0c;也就是使用命令之后会改变的地方 网页软件分享 这是一个非常好用web端笔记画图软件&#xff0c;解决了typora画图不方便的问题

模板-初阶

引言&#xff1a; 在C&#xff0c;我们已经学过了函数重载&#xff0c;这使得同名函数具有多个功能。但是还有一种更省力的方法&#xff1a;采用模板。 本文主要介绍以下内容 1. 泛型编程 2. 函数模板 3. 类模板 1.泛型编程 在将这一部分之前&#xff0c;通过一个故事引…

mysql中EXPLAIN详解

大家好。众所周知&#xff0c;MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划&#xff0c;这个执行计划展示了接下来具体执行查询的方式。在日常工作过程中&#xff0c;我们可以使用EXPLAIN语句来查看某个查询语句的具体执行计划&#xff0c; 今天我们…

数据库索引的理解

目录 1.索引是什么&#xff0c;解决了什么问题 2.索引付出了什么代价 3.如何使用sql索引&#xff0c;有何注意事项 普通索引&#xff1a; 唯一索引&#xff1a; 主键索引(Primary Key Index)&#xff1a; 删除索引: 创建主键索引的基本语法: 4.索引背后的数据结构 1.索…

数据结构严蔚敏版精简版-绪论

1.基本概念和术语 下列概念和术语将在以后各章节中多次出现&#xff0c;本节先对这些概念和术语赋予确定的含义。 数据(Data)&#xff1a;数据是客观事物的符号表示&#xff0c;是所有能输入到计算机中并被计算机程序处理的符号 的总称。 数据元素(DataElement)&#xff1a;…

基于STM32的水库预警系统的Proteus仿真

文章目录 一、水库预警系统1.题目要求2.思路2.1 OLED显示汉字2.2 水质传感器等等2.3 步进电机2.4 驱动水泵 3.仿真图3.1 未仿真时3.2 开始仿真&#xff0c;OLED开始显示3.3 提高水位&#xff0c;开启阀门和预警3.4 通过按键增大水位阈值&#xff0c;取消报警 4.仿真程序4.1 程序…

轻松拿捏C语言——【文件操作】

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f389;创作不易&#xff0c;请多多支持&#x1f389; &#x1f308;感谢大家的阅读、点赞、收藏和关注&#x1f495; &#x1f339;如有问题&#xff0c;欢迎指正 目录 &#x1f…

谨以此文章记录我的蓝桥杯备赛过程

以国优秀结束了蓝桥杯cb组 鄙人来自电信学院&#xff0c;非科班出身&#xff0c;在寒假&#xff0c;大约2024年2月份&#xff0c;跟着黑马程序员将c基础语法学完了&#xff0c;因为过年&#xff0c;事情较多&#xff0c;没在学了。 最初就是抱着拿省三的态度去打这个比赛的&a…

C语言之旅:探索单链表

目录 一、前言 二、实现链表的功能&#xff1a; 打印 创建节点 尾插 尾删 头插 头删 查找 在指定位置之前插入数据 指定位置删除 在指定位置之后插入数据 打印 销毁 三、全部源码&#xff1a; 四、结语 一、前言 链表是一个强大且基础的数据结构。对于很多初…