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,一经查实,立即删除!

相关文章

为图片设置经纬度信息

一、java实现 小编看了很多技术博客&#xff0c;但是测试要么下载的jar包中的api和博客对不上&#xff0c;要么就是不对&#xff0c;总之没实现 Java 读取图片信息 java 写入 exif 信息 使用Java读取和修改图片的Exif信息 java获取图片的GPS信息 https://drewnoakes.com/code/e…

MySQL之数据库字段约束学习笔记(三)

MySQL 中的字段约束用于限制字段的取值范围&#xff0c;确保数据的一致性和完整性。常见的字段约束包括&#xff1a; PRIMARY KEY&#xff1a;定义主键约束&#xff0c;唯一标识表中的每一行数据。FOREIGN KEY&#xff1a;定义外键约束&#xff0c;确保两个表之间的关联完整性…

Python 介绍

python 发展简史 Python 起源&#xff08;1989-1991&#xff09; Python的诞生可以追溯到1989年&#xff0c;当时Guido van Rossum在荷兰国家数学和计算机科学研究所工作时&#xff0c;出于对当时编程语言的不满&#xff0c;开始构思一种新的编程语言。他希望这种语言能够弥补C…

【Python】使用 Pandas 统计每行数据中的空值

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 在数据分析…

传感器的基本特性

传感器的基本特性主要包括以下几个方面&#xff1a; 静态特性&#xff1a;这是指传感器在被测量的各个值处于稳定状态时的输入和输出关系。传感器的静态特性可以用一些静态性能指标来衡量&#xff0c;主要包括线性度、灵敏度、迟滞、重复性、漂移和分辨力等。其中&#xff0c;线…

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.显示当前目录下的所有文件…

iperf

文章目录 1.安装1.1在 Ubuntu 上安装1.2在 CentOS 上安装 2.iperf服务端选项3.iperf客户端选项4.iperf常用命令5.结果展示5.1 tcp结果展示5.2 udp结果展示 Iperf是一款基于TCP/IP和UDP/IP的网络性能测试工具&#xff0c;它可以用来测量网络带宽和网络质量&#xff0c;还可以提供…

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

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

asio之winsock的初始化

简介 asio中&#xff0c;winsock初始化工作是放在winsock_init类中来处理的 类结构 #mermaid-svg-aC4x3cdr8TKGhsnX {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aC4x3cdr8TKGhsnX .error-icon{fill:#552222;}#…

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;更希望了解一个大概的时间范围。那么&#…

WHAT - 容器化系列(二)- docker

目录 一、前言二、Docker镜像&#xff1a;可运行软件包三、Docker容器&#xff1a;可执行环境四、容器和镜像的关系五、创建镜像的过程5.1 编写Dockerfile5.2 构建Docker镜像5.3 查看构建的镜像5.4 运行Docker容器5.5 验证容器运行状态5.6 推送镜像到镜像仓库&#xff08;可选&…

【案例实操】银河麒麟桌面操作系统实例分享,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;主要用于控制某些特定上下文…

【模型参数微调】最先进的参数高效微调 (PEFT) 方法

简介 由于大型预训练模型的规模,微调大型预训练模型的成本通常高得令人望而却步。参数高效微调 (PEFT) 方法只需微调少量(额外)模型参数而不是所有模型参数,即可使大型预训练模型有效地适应各种下游应用。这大大降低了计算和存储成本。最近最先进的PEFT技术实现了与完全…