当前位置: 首页 > news >正文

Java基础-String Class(字符串类)

String


Java String 类概览

String 类是 Java 中最常用的类之一,用于处理字符串。以下是 String 类的主要特性和操作:

特性/操作描述
不可变性String 对象一旦创建就不能被修改
创建方式使用双引号 “” 或 String 构造函数
字符串池Java 维护字符串常量池以优化内存使用
比较操作equals() 比较内容,compareTo() 比较顺序
连接操作使用 + 运算符或 concat() 方法

String的常用Method

方法描述示例
length()返回字符串的长度"Hello".length()返回 5
charAt(int index)返回指定索引处的字符"Java".charAt(0)返回 ‘J’
substring(int beginIndex, int endIndex)返回一个新的字符串,它是此字符串的一个子字符串"Hello".substring(0, 3)返回 “Hel”
equals(Object anObject)将此字符串与指定的对象比较"Hello".equals("Hello")返回 true
toLowerCase()使用默认语言环境的规则将此 String 中的所有字符都转换为小写"HELLO".toLowerCase()返回 “hello”
toUpperCase()使用默认语言环境的规则将此 String 中的所有字符都转换为大写"hello".toUpperCase()返回 “HELLO”
trim()返回字符串的副本,忽略前导空白和尾部空白" hello ".trim()返回 “hello”
replace(char oldChar, char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的"hello".replace('l', 'w')返回 “hewwo”
contains(CharSequence s)当且仅当此字符串包含指定的 char 值序列时,返回 true"Hello".contains("He")返回 true
split(String regex)根据给定正则表达式的匹配拆分此字符串"a,b,c".split(",")返回 [“a”, “b”, “c”]

下面的流程图展示了 String 对象的生命周期和常见操作:

创建 String 对象
是否使用字面量?
检查字符串池
在堆中创建新对象
池中是否存在?
返回池中的引用
在池中创建并返回引用
执行字符串操作
是否修改字符串?
创建新的 String 对象
返回原始引用
垃圾回收旧对象
继续使用

这个流程图说明了 String 对象从创建到使用的过程,包括字符串池的检查、字符串操作和不可变性原则。理解这个过程有助于更高效地使用 String 类。

Stirng的继承关系

在 Java 中,String类最终继承自java.lang.Object类,并且它实现了java.io.Serializablejava.lang.Comparable<String>java.lang.CharSequence接口。以下是用 Mermaid 语法展示的更详细的关系图:

说明如下:

Object

  • 所有 Java 对象的根类,String继承了Object的一些通用方法,如toString()equals()hashCode()等。

Serializable接口

  • 标记接口,表示一个类的对象可以被序列化和反序列化。String类的对象可以被写入到输出流并从输入流中读取,从而实现序列化和反序列化操作。

Comparable<String>接口

  • 定义了一个类型参数为String的泛型接口,用于定义对象之间的自然顺序。String类实现了这个接口,意味着可以比较两个字符串的字典顺序。通过compareTo方法可以比较两个字符串的大小关系。

CharSequence接口

  • 表示一个字符序列。String类实现了这个接口,提供了一些方法来访问字符串中的字符,如length()返回字符串的长度,charAt(int index)返回指定索引处的字符,subSequence(int start, int end)返回一个子序列。

缺点

由于String的不可变性,在进行大量字符串操作时可能会创建很多中间对象,这可能会影响性能。为了避免这种情况,可以使用StringBuilderStringBuffer类,它们是可变的字符串类,适用于频繁修改字符串的场景。

字符串的特性

字符串的连接

  1. 字符串连接:
    • String c = a + b 进行字符串连接操作。在 Java 中,使用 + 运算符连接两个字符串时,实际上会创建一个新的 String 对象。
    • 这个过程中,Java 会先创建一个 StringBuilder(或 StringBuffer,在单线程环境下通常是 StringBuilder)对象,然后调用 append 方法将 ab 的内容添加到 StringBuilder 中,最后调用 toString 方法将 StringBuilder 转换为 String 对象,并将其赋值给 c
String a = "abc";
String b = "MASU";
String c = a + b;
System.out.println(c); // 输出 "abcMASU"

注意事项

频繁进行字符串连接操作可能会在性能上产生一些开销,特别是在循环中进行大量的字符串连接时。因为每次连接都会创建新的 StringBuilderString 对象。在这种情况下,可以考虑使用 StringBuilderStringBuffer 显式地进行字符串连接操作,以提高性能。

StringBuilder builder = new StringBuilder();
builder.append("abc");
builder.append("MASU");
String c = builder.toString();

StringBuffer

基本介绍

  • StringBuffer是 Java 中用于处理可变字符串的类。与String类不同,String对象是不可变的.
  • StringBuffer允许对字符串进行修改,例如添加、插入、删除字符等操作,且不会产生新的对象(除非重新赋值)。这在需要频繁修改字符串内容的场景中非常有用,能够避免创建大量中间字符串对象,从而提高性能。

StringBuffer 的继承结构图

在这里插入图片描述

  1. 常用方法
    • 追加(append)方法
      • append方法用于在StringBuffer对象的末尾添加各种类型的数据,如字符、字符串、数字等。例如:
       StringBuffer sb = new StringBuffer("Hello");sb.append(" World");System.out.println(sb.toString());//输出"Hello World"
  • 它有多个重载版本,可以接受charintlongfloatdoublebooleanchar[]String等多种类型的参数。
  • 插入(insert)方法
    • 用于在StringBuffer对象的指定位置插入各种类型的数据。例如:
       StringBuffer sb = new StringBuffer("Hello");sb.insert(2, "inserted");System.out.println(sb.toString());//输出"Heinsertedllo"
  • 它的第一个参数是插入的位置索引(从 0 开始),第二个参数是要插入的内容,同样有多个重载版本,可插入不同类型的数据。

  • 删除(delete)方法

    • 可以删除StringBuffer对象中指定位置的字符。例如:

             StringBuffer sb = new StringBuffer("Hello");sb.delete(1, 3);System.out.println(sb.toString());//输出"Hlo"
      
  • 其参数delete(start, end)表示删除从start(包含)到end(不包含)位置的字符。

  • 替换(replace)方法

    • 用于替换StringBuffer对象中指定位置的字符。例如:
       StringBuffer sb = new StringBuffer("Hello");sb.replace(1, 3, "replaced");System.out.println(sb.toString());//输出"Hreplacedlo"
  • 它的参数replace(start, end, str)表示将从start(包含)到end(不包含)位置的字符替换为str
  • 反转(reverse)方法
    • 可以将StringBuffer对象中的字符序列反转。例如:
       StringBuffer sb = new StringBuffer("Hello");sb.reverse();System.out.println(sb.toString());//输出"olleH"
  1. 与 StringBuilder 的比较
    • StringBuilderStringBuffer功能相似,都用于可变字符串的操作。主要区别在于StringBuffer是线程安全的,其内部方法大多是synchronized(同步)的,这使得它在多线程环境下能够正确运行,但性能上会有一定损耗。而StringBuilder不是线程安全的,在单线程环境下性能更好,通常在不需要考虑线程安全的情况下,推荐使用StringBuilder
  2. 容量管理
    • StringBuffer对象有一个容量(capacity)的概念,它表示StringBuffer内部用于存储字符序列的缓冲区大小。当向StringBuffer中添加字符,导致字符序列长度超过当前容量时,StringBuffer会自动扩容。
    • 扩容的策略一般是:新容量 = 旧容量 * 2 + 2。例如,初始容量为 16,当字符序列长度超过 16 时,新容量可能会变为16*2 + 2=34。可以通过capacity方法查看当前容量,如System.out.println(sb.capacity());

StringBuffer常用方法

方法名介绍示例
append(Object obj)将指定对象的字符串表示形式追加到当前StringBuffer对象的末尾。可以接收多种数据类型,如StringcharintdoubleStringBuffer sb = new StringBuffer("abc"); sb.append("def"); // sb的值变为"abcdef"
insert(int offset, Object obj)在当前StringBuffer对象的指定位置(offset)插入指定对象的字符串表示形式。offset表示索引位置,从 0 开始计数StringBuffer sb = new StringBuffer("abc"); sb.insert(1, "x"); // sb的值变为"axbc"
delete(int start, int end)删除当前StringBuffer对象中从start(包括)到end(不包括)之间的字符StringBuffer sb = new StringBuffer("abcde"); sb.delete(1, 3); // sb的值变为"ade"
replace(int start, int end, String str)将当前StringBuffer对象中从start(包括)到end(不包括)之间的字符替换为指定的字符串strStringBuffer sb = new StringBuffer("abcde"); sb.replace(1, 3, "xx"); // sb的值变为"axxde"
reverse()反转当前StringBuffer对象中的字符序列StringBuffer sb = new StringBuffer("abc"); sb.reverse(); // sb的值变为"cba"
substring(int start)返回一个新的String,它包含当前StringBuffer对象从start位置到末尾的字符序列StringBuffer sb = new StringBuffer("abcde"); String sub = sb.substring(2); // sub的值为"cde"
substring(int start, int end)返回一个新的String,它包含当前StringBuffer对象从start(包括)到end(不包括)之间的字符序列StringBuffer sb = new StringBuffer("abcde"); String sub = sb.substring(1, 3); // sub的值为"bc"
capacity()返回当前StringBuffer对象的容量。容量是指用于存储字符序列的内部缓冲区大小,一般初始容量为 16,当内容超过容量时会自动扩容StringBuffer sb = new StringBuffer("abc"); System.out.println(sb.capacity()); // 可能输出16
length()返回当前StringBuffer对象中字符序列的长度StringBuffer sb = new StringBuffer("abc"); System.out.println(sb.length()); // 输出3
setCharAt(int index, char ch)将当前StringBuffer对象中指定索引(index)位置的字符设置为chStringBuffer sb = new StringBuffer("abc"); sb.setCharAt(1, 'x'); // sb的值变为"axc"

StringBuilder

StringBuffer 的继承结构图

在这里插入图片描述

StringBuffer和StringBuilder的比较用表格

比较项目StringBufferStringBuilder
可变性可变,允许通过多种方法(如 append、insert、delete 等)对字符串内容进行修改,修改操作在原对象上进行,不会产生新的对象(除非重新赋值)可变,提供与 StringBuffer 类似的修改方法,如 append、insert、delete 等,也是在原对象基础上进行修改
线程安全性线程安全。其内部大部分方法都使用了synchronized关键字修饰,这使得在多线程环境下,多个线程访问同一个 StringBuffer 对象时可以正确地同步,保证数据的一致性和正确性,但这也导致了一定的性能损耗非线程安全。在单线程环境下,由于不需要进行同步操作,其性能比 StringBuffer 更好。在多线程环境下如果没有正确的外部同步机制,可能会导致数据不一致的问题
性能(单线程)由于同步机制的存在,在单线程频繁操作字符串的场景下,性能稍逊一筹在单线程环境下,特别是频繁进行字符串操作(如大量的 append 操作)时,性能优于 StringBuffer,因为它不需要额外的同步开销
性能(多线程)可以安全地在多线程环境下使用,虽然同步机制会带来性能损失,但保证了数据的准确性在多线程环境下,如果没有外部的同步措施,可能会出现数据错误,不过如果正确地进行外部同步(如使用锁),在性能优化较好的情况下可能会接近或优于 StringBuffer 的性能,但代码复杂度会增加
适用场景适用于多线程环境下对字符串进行修改的场景,例如在多个线程可能同时访问和修改同一个字符串对象的服务器端程序、共享资源处理等情况适用于单线程环境下对字符串进行高效操作的场景,如在一个简单的本地工具程序、临时字符串处理等情况下进行大量的字符串构建或修改操作
初始容量可以通过构造函数指定初始容量,默认容量为 16。如果预估字符串长度变化较大,可以指定合适的初始容量以减少扩容操作与 StringBuffer 类似,可以通过构造函数指定初始容量,默认容量为 16,也能在一定程度上通过合理设置初始容量优化性能
扩容策略当内容长度超过容量时会自动扩容,一般扩容策略是新容量 = 旧容量 * 2 + 2扩容策略与 StringBuffer 相同,当内容长度超过容量时会自动扩容,新容量 = 旧容量 * 2 + 2

相关文章:

Java基础-String Class(字符串类)

String Java String 类概览 String 类是 Java 中最常用的类之一&#xff0c;用于处理字符串。以下是 String 类的主要特性和操作&#xff1a; 特性/操作描述不可变性String 对象一旦创建就不能被修改创建方式使用双引号 “” 或 String 构造函数字符串池Java 维护字符串常量池…...

《Linux服务与安全管理》| 服务进程与网络配置

《Linux服务与安全管理》| 服务进程与网络配置 目录 《Linux服务与安全管理》| 服务进程与网络配置 &#xff08;1&#xff09; 写出查看NetworkManager服务状态的命令。 &#xff08;2&#xff09; 写出查看NetworkManager服务自启动状态的命令。 &#xff08;3&#xff0…...

No.15 笔记 | CSRF 跨站请求伪造

目录 一、基础知识 &#xff08;一&#xff09;cookie 和 session、同源策略 &#xff08;二&#xff09;CSRF 原理 二、CSRF 类型 &#xff08;一&#xff09;GET 类型 &#xff08;二&#xff09;POST 类型 三、CSRF 实例讲解 &#xff08;一&#xff09;真实案例 &am…...

解决linux中pip速度过慢问题

在 Linux 系统下&#xff0c;如果你发现使用 pip 下载 Python 库时速度非常慢&#xff0c;可以考虑以下几种方法来加速下载&#xff1a; 使用 pip 的 -i 选项&#xff1a; 如果你只想临时使用其他镜像&#xff0c;可以在安装时加上 -i 选项&#xff1a; pip install package_n…...

FlinkSQL中 的 双流JOIN

在 Flink SQL 中&#xff0c;流与流的 JOIN 是一种复杂的操作&#xff0c;因为它涉及到实时数据的无界处理。理解 Flink SQL 流与流 JOIN 的底层原理和实现需要从多个角度来分析&#xff0c;包括 状态管理、事件时间处理、窗口机制 以及 内部数据流处理模型 等。下面将从这些角…...

Mysql(五) --- 数据库设计

文章目录 前言1.范式1.1.第一范式1.1.1 定义1.1.2.例子 1.2.第二范式1.2.1 定义1.2.2 例子1.2.3.不满足第二范式可能会出现的问题 1.3.第三范式1.3.1 定义2.3.2 示例 2. 设计过程3. 实体-关系图3.1 E-R图的基本组成3.2 关系的类型3.2.1 一对一关系(1:1)3.2.2 ⼀对多关系(1:N)3.…...

po框架的了解和应用

https://www.cnblogs.com/xiaolehong/p/18458470 笔记 任务:1、通过po框架输入测试报告 2、编写自动化测试框架 3、总结测试讲解稿 自动化测试框架概念: 自动化测试框架是一个集成体系,这个体系中包含测试功能的函数、测试数据源、测试对以及重要的模块。 作用:用于解决或…...

Linux云计算 |【第四阶段】RDBMS2-DAY5

主要内容&#xff1a; PXC概述、部署PXC&#xff08;自动故障恢复测试&#xff09;、存储引擎、读锁/写锁、表锁/行锁、常用的存储引擎介绍 一、PXC概述 PXC&#xff08;Percona XtraDB Cluster&#xff0c;简称PXC集群&#xff09;&#xff0c;是基于Galera的MySQL高可用集群…...

从0开始深度学习(9)——softmax回归的逐步实现

文章使用Fashion-MNIST数据集&#xff0c;做一次分类识别任务 Fashion-MNIST中包含的10个类别&#xff0c;分别为&#xff1a; t-shirt&#xff08;T恤&#xff09;、trouser&#xff08;裤子&#xff09;、pullover&#xff08;套衫&#xff09;、dress&#xff08;连衣裙&…...

Cannot inspect org.apache.hadoop.hive.serde2.io.HiveDecimalWritable 问题分析处理

报错; org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.UnsupportedOperationException: Cannot inspect org.apache.hadoop.hive.serde2.io.HiveDecimalWritable 该问题常见于parquet格式hive表查询时&#xff0c;一般原因为hive表对应数据文件元数据对应格式与…...

电子取证新视角:USB键盘流量提取密码方法研究与实现

0x01 引言 在当今数字化时代&#xff0c;USB设备的广泛使用使得信息安全和电子取证领域面临着新的挑战与机遇。特别是USB键盘&#xff0c;作为一种常见的输入设备&#xff0c;其流量中可能包含用户输入的敏感信息&#xff0c;如密码和其他私人数据。因此&#xff0c;研究USB键…...

Tongweb7049m4+THS6010-6012配置故障轉移+重試机制(by lqw)

使用场景 1.ths代理tongweb多套后端&#xff0c;假如有其中一套tongweb因为服务器重启或者宕机后没有及时启动&#xff0c;导致ths一直轮询在这个出故障的节点上。 2.即使在tongweb重启了&#xff0c;有的应用启动也需要一定的时间&#xff0c;这个时候只是启动了应用端口&…...

在线客服系统网站源码-网页聊天客服实现代码

源码简介 在线客服系统 – 网上客服系统&#xff0c;在线客服系统网站源码。 消息预知功能就是别人在聊天框打字你都能看到 1.新增客服坐席消息互动&#xff0c;客服之间可以互相接收消息&#xff0c;可以智能分配 2.新增消息预知功能&#xff0c;可提前预知访客已输入未发…...

JioNLP:一款实用的中文NLP预处理工具包

一、什么是 JioNLP? JioNLP是一个面向NLP开发者的工具包,提供了常见的中文文本预处理、解析等功能,使用简单、高效准确、无需配置,可极大加快NLP项目的开发进度。 主要特点包括: 代码开源,使用MIT协议功能丰富,涵盖多个NLP预处理需求使用简单,无需复杂配置即可调用准确高效…...

GR-ConvNet论文 学习笔记

GR-ConvNet 文章目录 GR-ConvNet前言一、引言二、相关研究三、问题阐述四、方法A.推理模块B.控制模块C.模型结构D.训练方法E.损失函数 五、评估A.数据集B.抓取评判标准 六、实验A.设置B.家庭测试物体C.对抗性测试物体D.混合物体 七、结果A.康奈尔数据集B.Jacquard数据集C.抓取新…...

windows环境批量删除指定目录下的全部指定文件

写在开头&#xff1a; 1. 涉及文件删除&#xff0c;先在小范围内测试&#xff08;更改D:\扫描文件路径&#xff09; 2. 命令会递归该目录下的所有文件 命令&#xff1a; forfiles /p D:\ /s /m _maven.repositories /c "cmd /c del path"解释&#xff1a; /p D:\ …...

水深探测仪的作用和使用方法

在水域救援的行动里&#xff0c;救援人员时刻面临着复杂多变、充满未知的水域状况。当接到救援任务奔赴现场&#xff0c;那片需要涉足的水域就像一个神秘莫测的异世界&#xff0c;挑战着所有人的认知与勇气。 水深探测仪作为一种专用于测量水域深度的设备&#xff0c;通过声波和…...

Leetcode 搜索插入位置

这段代码的核心思想是 二分查找&#xff0c;用于在一个已经排序的数组中查找目标值的位置。如果目标值存在于数组中&#xff0c;返回它的索引&#xff1b;如果目标值不存在&#xff0c;返回它按顺序应该插入的位置。 算法思想步骤&#xff1a; 定义左右边界&#xff1a; 我们使…...

jsp怎么实现点赞功能

在JSP中实现点赞功能通常涉及前端页面的设计、后端逻辑处理以及数据存储。为了实现点赞功能&#xff0c;你可以使用以下步骤&#xff1a; 前端&#xff08;JSP页面&#xff09;设计 前端部分包括显示点赞按钮&#xff0c;并通过Ajax发送点赞请求&#xff0c;以避免页面刷新。 …...

取消microsoft edge作为默认浏览器 ,修改方法,默认修改不了的原因

将Microsoft Edge或其它浏览器设置为默认浏览器&#xff0c;可以尝试以下方法来解决此问题&#xff1a; 一&#xff0c; 通过浏览器设置修改&#xff1a;打开Microsoft Edge浏览器&#xff0c;单击右上角的“更多”按钮&#xff0c;然后选择“设置”。在设置页面左侧找到“默认…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...