【JavaSE】String类总结,StringBuilder、StringBuffer、String的区别讲解

news2024/10/7 20:36:55

文章目录

  • String对象的构造
  • String类的一些常用方法
    • 求字符串的长度
    • 字符串判空
    • 字符串对象的比较
    • 字符串对象的查找
    • 字符串对象的转化
    • 字符串对象的截取
    • 字符串对象的替换
    • 字符串对象的拆分
    • 字符串对象的大小写转换
    • 常用方法总结
  • StringBuilder与StringBuffer
    • 字符串为什么不可变
    • String StingBuilder 与 StringBuffer的区别

String对象的构造

C语言中我们提到过字符串的概念,而C语言中并没有字符串类型,但是在Java中为我们提供了字符串类型StringString是引用类型,所以他并不存储字符串本身。我们通过调试来看看一个String类型的内存结构。
在这里插入图片描述
如图我们构造了一个String类型的对象string,我们通过画图来说明一下string的内存结构:
在这里插入图片描述

字符串构造有三种方法:

1、直接赋值
2、使用new String 构造对象
3、使用字符数组构造

在这里插入图片描述

String类的一些常用方法

求字符串的长度

int length();计算字符串的长度。

在这里插入图片描述

在这里插入图片描述

字符串判空

boolean isEmpty();如果字符串长度为0,就返回true,否则返回false。
在这里插入图片描述

在这里插入图片描述

字符串对象的比较

在基本类型的比较时,我们经常使用==进行比较,但String是引用类型使用==比较的是对象的地址,并不是字符串对象里面value数组中的值。要想进行值比较我们需要使用boolean equals()
在这里插入图片描述

在这里插入图片描述
在字符串比较中还有一个方法int compareTo(String string)

在这里插入图片描述
int compareTo(String string)的返回值:

1、如果出现不等字符,直接返回这两个字符的大小插值
2、如果长度较小的字符串比完了,前面的字符都相同,那么返回两个字符串长度的差值

int compareTolgnoreCase(String string)可以在比较时忽略字符串的大小写。

在这里插入图片描述

字符串对象的查找

Char charAt(int i) 找到i位置上的字符。
在这里插入图片描述

在这里插入图片描述
这样我们就可以通过循环去遍历我们的字符串了:
在这里插入图片描述
我们还可以在字符串中寻找一个字符第一次出现的位置int index(String str,int fromIndex):
在这里插入图片描述

在这里插入图片描述
我们还可以从前往后找int lastindex(String str,int fromIndex):
在这里插入图片描述

在这里插入图片描述

字符串对象的转化

字符串还可以进行转化,我们可以把字符串与数值进行转化String.valueOf(),还可以将数值转化为字符串。
在这里插入图片描述

在这里插入图片描述

字符串对象的截取

我们还可以对字符串进行截取,可以指定截取的位置和长度:String substring(int beginIndex,int endIndex);
在这里插入图片描述

在这里插入图片描述

字符串对象的替换

String replaceAll(String regex,String replacement);我们还可以对字符串中的字符统一进行替换:
在这里插入图片描述

在这里插入图片描述

字符串对象的拆分

使用String[] split(String regex,int limit);可以对字符串进行拆分。
在这里插入图片描述

在这里插入图片描述

字符串对象的大小写转换

字符串还有一些其他的常用的方法,例如使用String trim();去掉字符串中的左右空格,保留中间空格。String toUpperCase();字符串转大写,String toLowerCase();字符串转小写。
在这里插入图片描述

常用方法总结

以上我们就给大家介绍并演示了String常用方法的用法,下面我们来通过一个表格来汇总一下这些方法。

方法作用
int length() 计算字符串的长度
boolean isEmpth()判断字符串是否为空
boolean equals()比较字符串的大小
int compareTo() 比较字符串大小,不同输出字符差值,相同输出0,最短长度相同输出长度差值。
char charAt(int index)查找字符串index位置上的字符
int indexOf(int ch,int fromIndex)从fromIndex开始查找第一次出现ch的位置,没有返回-1
String replaceAll(String regex,String replacement)替换所有的指定内容
String replaceFirst(String regex,String replacement)替换第一个出现的指定内容
String[] split(Stirng regex , int limit)将字符串以regex为分隔,拆分成limit组
String substring(int beginIndex,int endIndex)截取部分内容
String trim()去掉字符串中的左右空格,保留中间空格
String toUpperCase()字符串大写转换
String toLowerCase()字符串小写转换

StringBuilder与StringBuffer

字符串为什么不可变

字符串不可变?那类似下面这样的代码难道不是改变了string的值嘛?

String string = new String("abc");
string = "abcd";

我们通过调试来看一下,是否改变了字符串。
在这里插入图片描述
在这里插入图片描述
上图说明了,我们在改变字符串时都是创建了一个新对象,改变的都是新字符串对象的值,为什么会这样呢?我们ctrl+ 鼠标左键点击String查看他的源码。
在这里插入图片描述
在这里插入图片描述
从他的源码中我们知道了,String类中的value[]成员是被private final修饰的,因为在类外无法访问到private修饰的成员变量,所以我们无法改变String类中存储字符的value[]成员,所以我们说字符串无法改变。有很多人说字符串无法改变是因为value[]final修饰了,其实不是,因为final修饰value[]表示String类中的value[]无法指向其他字符数组,但是其中的值是可以改变的

String StingBuilder 与 StringBuffer的区别

上面我们说明了字符串不可变的原因,那么现在来看这样一个代码:

  public static void main(String[] args) {
        String string = new String("abcd");
        string += "efg";
        System.out.println(string);
    }

在这里插入图片描述

我们通过观察底层的代码运行逻辑发现,短短三行的代码在底层实现起来很复杂,我们还看到StringBuilder.append(),这些都是什么呢?让我来讲解一下
在这里插入图片描述

我们发现这样实现字符串的增加我们在底层实现时需要多创建两个对象一个StringBuilder一个String,这样一定很费时间的,那么有没有省时间的方法呢?当然有,既然我们修改字符串时需要重新创建StringBuild对象,那么我们可不可以直接创建StringBuilder对象呢?
在这里插入图片描述
我们看都是同样的需求运行的效率大不相同,原因是什么呢?
在这里插入图片描述
在这里插入图片描述
这样我们就总结出了原因:原因是StringBuilder StringBuffer在修改字符串时并没有创建新的对象,所以效率变高了。而StringBuilder Stringbuffer效率不一样的原因是StringBufferStringBuilder多了一个锁的概念,是在我们多线程中使用的,而频繁的开锁和关锁会耗费资源。
在这里插入图片描述
经过刚才的讲解现在我们总结一下 String StingBuilder 与 StringBuffer的区别了:

1、String是不可变的,而StringBuilder StringBuffer是可变的
2、StringBuffer采用同步处理,属于线程安全操作,而StringBuiler未采用同步处理,属于不安全操作,但二者功能基本相同。

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

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

相关文章

Alibaba架构师内部最新发布SpringCloud开发手册,Github限时开源

微服务是SOA之后越来越流行的体系结构模式之一! 如果您关注行业趋势,就会发现,如今商业机构不再像几年前那样,开发大型应用程序,来管理端到端之间的业务功能,而是选择快速灵活的微服务。 通过微服务,架构师…

寒气难抵,跨境电商年底仍有一批卖家要出局!

2020年初的新冠疫情仍历历在目,跨境电商在这两年间也是经历了许多不同的波折和困难。从2020年到2022年,由于各国之间出于疫情防控等多方面的考虑,逐渐的增加贸易壁垒,致使跨境电商的物流成本大概增长了50%,物流成本占订…

UE4 回合游戏项目 22- 控制新角色

在上一节(UE4 回合游戏项目 21- 添加多种类型的敌人)基础上新添加一个玩家角色 效果: 步骤: 1.打开进阶游戏资源,解压“回合迁移_第七节(只是新人物包)” 2.解压后双击打开工程 3.选中“ziyuan…

免费查题接口系统

免费查题接口系统 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点击跳…

微信小程序 | 小程序开发

🖥️ 微信小程序专栏:小程序开发 初级知识 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ &#x1f…

51单片机学习笔记2 仿真器的使用及STC89Cxx简介

51单片机学习笔记2 仿真器的使用及STC89Cxx简介)一、连接步骤1. 硬件连接2. 安装软件驱动3. 检查是否安装成功二、仿真步骤1. 打开一个51工程2. 选择仿真设备3. Settings设置4. Utilities设置5. 点击仿真三、连接开发板四、STC89Cxx单片机简介1. 单片机2. 51单片机3…

红黑树的插入与验证——附图详解

文章目录红黑树性质红黑树的插入前言寻找插入位置情况 1.0情况 1.1情况 1.2情况 1.3情况 2.0情况 2.1情况 2.2情况 2.3完整代码红黑树的检验验证代码和用例红黑树 上篇文章我们说到 AVL 树在新增 / 减少结点的时候会进行旋转以保持 AVL 树的高度平衡, 但是实际上在需要 频繁加…

【构建ML驱动的应用程序】第 2 章 :制定计划

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

【线程】多线程安全

考点,线程同步有哪些操作: 一、概念 如果一个函数能被多个线程同时调用且不发生竞态条件,则成为它是线程安全,也叫可重入函数。通俗地说就是多线程程序无论调度顺序怎么样都可以得到正确的结果,运行时程序不出错。可重…

2023年浙大MBA项目的后备考阶段三大策略:你永远要相信光的力量

有些人,走着走着就掉队了。距离今年的管理类联考还有一个月时间,一切看似终成定局,但实际上仍有很大转圜空间。对浙大MBA的准考生来说,走到目前这一步,剩下的一个月时间务必要坚持走完,而且要更加的勇敢和底…

SDN功能实现(四)--- 实现自定义action(1)修改OVS源码<队列去重(内核态实现)>

实现功能:设计一个新的action,实现在冗余链路中的数据包去重 一:在内核级定义OVS action (一)在datapath/linux/compat/include/linux/openvswitch.h中添加: enum ovs_action_attr {/* ... *//** after…

SparkStreaming

sparkstreaming 1.批处理与流处理 spark本身作为引擎时是批处理,从信息源全部读取数据,然后一批一批处理数据。处理sparkSQL等之后再存入hdfs。 sparkstreaming是实时引擎,在一个窗口时间内(比如1s)积攒数据&#x…

Spring IOC源码:实例化前的准备工作

前言 上篇文章我们讲解了IOC比较重要的后置处理器注册方法,本篇文章讲解实例化前的准备工作,包括国际化、多播器创建、监听器注册等节点。 正文 进入refresh方法中,可以看到在正式实例化初始化方法前,还有4个方法: …

Day09--小程序API的Promise化

1.基于回调函数的异步API的缺点 ************************************************************************************************************** 2.啥子是API Promise化呢? *****************************************************************************…

【Java八股文总结】之MyBatisPlus

文章目录MybatisPlus一、MyBatis Plus介绍1、Mybatis 和 Mybatis Plus 的区别Q:MyBatis的优缺点Q:MyBatis Plus的优点Q:MyBatis-Plus中的lambda表达式?Q:MyBatis中的动态标签有哪些?2、MyBatis Plus常用注解…

ZYNQ之FPGA学习----RAM IP核使用实验

1 RAM IP核介绍 RAM 的英文全称是 Random Access Memory, 即随机存取存储器, 它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度由时钟频率决定 Xilinx 7 系列器件具有嵌入式存储器结…

【OpenCV 例程 300篇】248. 特征描述之HOG描述符

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】248. 特征描述之HOG描述符 1. 方向梯度直方图 方向梯度直方图(Histogram of Oriented Gradient, HOG)使用梯度方向的分布作为特征来构造描述符,应用非常广泛。 梯…

07-HTTPS双向认证及Java案例

1.双向认证流程 客户端发起建立HTTPS连接请求,将SSL协议版本的信息发送给服务端;服务器端将本机的公钥证书(server.crt)发送给客户端;客户端读取公钥证书(server.crt),取出了服务端公…

wordpress的手工迁移

我的场景 将某个在阿里云服务器(windows操作系统)上apache容器下的wordpress服务迁移到另一个linux主机上的apache上。 迁移要点 1、迁移源主机下的wordpress文件夹,在apache容器下的htdocs文件夹中 2、迁移数据库 3、根据目标&#xff0…

表弟大学毕业要学前端,我给他制定了一份亲属自学计划

表弟也终于到了马上要大学毕业的时间,然后听说我在做前端开发工作,就想着能不能和我一起搞一搞。 我说这又不是小时候一起去地里抓兔子,说走就一起走,拿上工具一起走了,这得学啊。看着表弟期待的眼神,他问了…