深入理解【 String类】
目录
1、String类的重要性
2、常用方法
2、1 字符串构造
2、2 String对象的比较
2、3 字符串查找
2、4字符转换
数值和字符串转换:
大小写转化:
字符串转数组:
格式转化:
2、5 字符串替换
2、6字符串拆分
2、7 字符串截取
3、String字符串的不可变性
4、 认识StringBuffer和StringBuilder
4、1StringBuffer
4、2StringBuilder
1、String类的重要性
在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类。
在开发和校招笔试中,字符串也是常客,而且在面试中也频繁被问到,比如:String、StringBuff和StringBulider之间的区别等。
2、常用方法
2、1 字符串构造
String类提供的构造方法常用的是以下三种:
- 使用常量字符串构造
- 直接newString类对象
- 使用字符数组进行构造
 public class Test {public static void main(String[] args) {//1、使用常量字符串构造String str1="Hello";//2、直接newString类对象String str2=new String("Hello");//3、使用字符数组进行构造char[] array={'H','e','l','l','o'};String str3=new String(array);}
} 
 
【注意】
1、String类是引用类型,内部并不储存字符串本身
2、Java中""引起来的也是String类对象
2、2 String对象的比较
1、==比较是否为同一个对象
对于内置类型,==是比较变量的值,而引用类型==比较的是引用中的地址。
 String str1="Hello";
String str2=new String("Hello");
System.out.println(str1==str2);//结果为false
 
 
2、boolean equals(Obeject anObeject)方法,比较内容是否相同
String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,按照如下规则进行比较,比如:str1.equals(str2)
 String str1="Hello";
String str2=new String("Hello");
String str3="world";
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//false
 
 
3、int compareTo(String s)方法:按照字典序比较
与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:
- 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
- 如果前K个字符相等,返回两串字符串长度差值
4、int compareTolgnoreCase(String str)方法:与compareTo方法相同,但忽略大小写比较
 String str1="abc";
String str2=new String("ABC");
String str3="Abdef";
System.out.println(str1.compareToIgnoreCase(str2));//0
System.out.println(str1.compareToIgnoreCase(str3));//-1
System.out.println(str2.compareToIgnoreCase(str3));//-1 
 
2、3 字符串查找
| 方法 | 功能 | 
| char charAt(int index) | 返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException异常 | 
| int indexOf(int ch) | 返回ch第一次出现的位置,没有返回-1 | 
| int indexOf(int ch, int fromIndex) | 从fromIndex位置开始找ch第一次出现的位置,没有返回-1 | 
| int indexOf(String str) | 返回str第一次出现的位置,没有返回-1 | 
| int indexOf(String str, int fromIndex) | 从fromIndex位置开始找str第一次出现的位置, 没有返回-1 | 
| int lastIndexOf(int ch) | 从后往前找,返回ch第一次出现的位置,没有返回-1 | 
| int lastIndexOf(int ch, int fromIndex) | 从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1 | 
| int lastIndexOf(String str) | 从后往前找,返回str第一次出现的位置,没有返回-1 | 
| int lastIndexOf(String str, int fromIndex | 从fromIndex位置开始找,从后往前找str第一次出现的位置, 没有返回-1 | 
 String str1="Hello,world,Hello";//长度为17System.out.println(str1.charAt(6));//w
System.out.println(str1.indexOf('o'));//4
System.out.println(str1.indexOf('l',8));//9
System.out.println(str1.indexOf("Hello"));//0
System.out.println(str1.indexOf("Hello",0));//0
System.out.println(str1.lastIndexOf('l'));//15
System.out.println(str1.lastIndexOf('l',16));//15
System.out.println(str1.lastIndexOf("Hello"));//12
System.out.println(str1.lastIndexOf("Hello",10));//0
 
 
上述方法都是实例方法
2、4字符转换
数值和字符串转换:
- valueOf用于将其他形式转化为字符串,有许多重载方法。

代码演示:
public class Student {String name;int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';} }public class Test {public static void main(String[] args) {String str1=String.valueOf(123);String str2=String.valueOf(true);String str3=String.valueOf(new Student("lisi",18));System.out.println(str1);//123System.out.println(str2);//trueSystem.out.println(str3);//Student{name='lisi', age=18}} }
大小写转化:
- 大写转小写toLowerCase()
- 小写转大写toUpperCase()
String str1="Hello"; String str2="World"; //小写转大写 System.out.println(str1.toUpperCase());//HELLO //大写转小写 System.out.println(str2.toLowerCase());// world
字符串转数组:
- toCharArray()
 String str1="Hello";
char[]array = str1.toCharArray();for (int i = 0; i < array.length; i++) {System.out.println(array[i]);} 
 
格式转化:
- format
 String s=String.format("%d-%d-%d",2024,7,5);
System.out.println(s);//2024-7-5 
 
2、5 字符串替换
使用一个指定的新的字符串替换已有的字符串数,可用方法如下:
| 方法 | 功能 | 
| String replaceAll(String regex, String replacement) | 替换所有的指定内容 | 
| String replaceFirst(String regex, String replacement) | 替换收个内容方法 | 
代码示例:
  String str1="Helloworld";System.out.println(str1.replace("H","h"));
System.out.println(str1.replaceFirst("l","L")); 
 
【注意】由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串.
2、6字符串拆分
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
 可用方法如下:
| 方法 | 功能 | 
| String[] split(String regex) | 将字符串全部拆分 | 
| String[] split(String regex,int limit) | 将字符串以定义的格式,拆分为limit组 | 
代码实例:

【注意】
有些特殊字符作为分隔符无法正确切分,需要加上转义。
- " | "、" * "、 "+"都得加上转义字符,前面加上"\\"
- " \ "前面要加上" \\\\"
- 如果有多个分隔符,用" | "作为连字符
2、7 字符串截取
从一个完整的字符串之中截取部分内容,可用方法
| 方法 | 功能 | 
| String substring ( int beginindex ) | 从指定索引截取到结尾 | 
| String substring(int bwginindex ,int endindex ) | 截取部分内容 | 
【注意】
- 索引从0开始
- 注意前闭后开的用法 substring( , 】
3、String字符串的不可变性
String类是一种不可变对象,字符串中内容是不可改变的。这是因为
1、String类在设计时就是不可改变的


String类中的字符实际保存在内部维护的value字符数组中,该图还可以看出:
- String类被final修饰,表明该类不能被继承
- value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。
2. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象
” 字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。”
这种说法是错误的,不是因为String类自身,或者其内部value被final修饰而不能被修改。
 final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的。
4、 认识StringBuffer和StringBuilder
4、1StringBuffer
StringBuffer类是Java提供的一个可变字符串序列类,在java.lang包中定义。它与String类相似,但有一个重要的区别:String类是不可变的,即创建后不能更改其内容,而StringBuffer类则可以在原地修改字符串。
 需要注意的是,由于StringBuffer是为了线程安全而设计的。在多线程环境下,建议使用线程安全的StringBuffer类,以确保数据的一致性。
4、2StringBuilder
StringBuilder类是Java提供的一个可变字符串序列类,与StringBuffer类类似,但不同的是StringBuilder不是线程安全的。StringBuilder类位于java.lang包中。
以下是StringBuilder类的一些重要特性:
 在单线程环境下,通过使用StringBuilder类,我们可以方便地进行字符串的动态操作和修改,并能够高效地处理字符串操作的需求。
面试题:String、StringBuffer和StringBuilder的异同?
相同点:底层都是通过char数组实现的
不同点:String对象一旦创建,其值是不能修改的,如果要修改,会重新开辟内存空间来存储修改之后的对象;而StringBuffer和StringBuilder对象的值是可以被修改的;
StringBuffer几乎所有的方法都使用synchronized实现了同步,线程比较安全,在多线程系统中可以保证数据同步,但是效率比较低;而StringBuilder 没有实现同步,线程不安全,建议在单线程中使用 StringBuilder,效率比较高。
如果我们在实际开发过程中需要对字符串进行频繁的修改,不要使用String,否则会造成内存空间的浪费;当需要考虑线程安全的场景下使用 StringBuffer,如果不需要考虑线程安全,追求效率的场景下可以使用 StringBuilder。
相关文章:
 
深入理解【 String类】
目录 1、String类的重要性 2、常用方法 2、1 字符串构造 2、2 String对象的比较 2、3 字符串查找 2、4字符转换 数值和字符串转换: 大小写转化: 字符串转数组: 格式转化: 2、5 字符串替换 2、6字符串拆分 2、7 字符串…...
 
Nacos 2.x 系列【20】集群部署
文章目录 1. 前言2. 部署服务端2.1 准备工作2.2 集群节点配置2.3 鉴权配置2.4 配置数据源2.5 配置 IP2.6 配置端口2.7 启动集群 3. 部署模式3.1 直连模式3.2 地址服务器模式3.2.1 地址服务器3.2.2 配置 3.3 VIP 模式(推荐)3.3.1 Nginx3.3.1 域名 1. 前言…...
 
LeetCode刷题记录:(15)三角形最小路径和
知识点:倒叙的动态规划 题目传送 解法一:二维动态规划【容易理解】 class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n triangle.size();if (n 1) {return triangle.get(0).get(0);}// dp[i][j]:走到第i层第…...
【大数据面试题】35 Spark 怎么做优化?
一步一个脚印,一天一道大数据面试题 博主希望能够得到大家的点赞收,藏支持!非常感谢~ 点赞,收藏是情分,不点是本分。祝你身体健康,事事顺心! Spark 如何做优化一直是面试过程中常问的问题。那么这次也仅以此篇文章总结梳理,希望对大家有帮助。 通用优化 Spark 一般遇…...
 
2024年保安员职业资格考试题库大数据揭秘,冲刺高分!
186.安全技术防范是一种由探测、()、快速反应相结合的安全防范体系。 A.保安 B.出警 C.延迟 D.监控 答案:C 187.安全技术防范是以()和预防犯罪为目的的一项社会公共安全业务。 A.预防灾害 B.预防损失 C.预防失…...
怎么搭建个人博客教程,附云主机选购指南
一、搭建个人博客教程 1. 规划博客内容与技术栈 确定博客主题:首先明确博客的定位和主题,这将影响后续的技术选择和内容规划。选择技术栈:根据个人偏好和技术背景,选择合适的建站技术。例如,可以使用WordPress&#…...
 
使用Llama3/Qwen2等开源大模型,部署团队私有化Code Copilot和使用教程
目前市面上有不少基于大模型的 Code Copilot 产品,部分产品对于个人开发者来说可免费使用,比如阿里的通义灵码、百度的文心快码等。这些免费的产品均通过 API 的方式提供服务,因此调用时均必须联网、同时需要把代码、提示词等内容作为 API 的…...
C语言_结构体初阶(还未写完)
结构体的声明 1. 什么是结构?结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量 数组:一组相同类型元素的集合 结构体:一组不一定相同类型元素的集 2. 结构的声明 struct tag //tag根据实际情况给名字…...
MyBatis-Plus:快速入门
1. 概念 MyBatis-Plus(简称 MP)是一个MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。其突出的特性如下: * **无侵入**:只做增强不做改变,引入它不会对现有…...
 
【高级篇】第9章 Elasticsearch 监控与故障排查
9.1 引言 在现代数据驱动的应用架构中,Elasticsearch不仅是海量数据索引和搜索的核心,其稳定性和性能直接影响到整个业务链路的健康度。因此,建立有效的监控体系和掌握故障排查技能是每一位Elasticsearch高级专家的必备能力。 9.2 监控工具:洞察与优化的利器 在Elastics…...
【前端】上传和下载zip文件,有进度条(el-progess)
文章目录 上传下载进度条 场景:要上传一个zip,调用接口,然后下载一个zip。调用接口的接口响应要显示在进度条中。 上传 上传用的是input原生控件,在页面中隐藏。accept"application/zip"限制只能上传zip。 点击button…...
2024年软件测试面试题,精选100+,附答案+文档
🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 Part1 1、你的测试职业发展是什么? 测试经验越多,测试能力越高。所以我…...
在vue项目的.gitignore文件忽略不想要提交到git仓库的文件
在Vue项目中,使用.gitignore文件来忽略不需要提交到Git仓库的文件是一个常见的做法。.gitignore文件包含了一系列的规则,这些规则告诉Git哪些文件或目录应该被忽略。以下是一些Vue项目中常用的.gitignore文件示例和具体规则说明: 示例 .gitig…...
 
时序(流式)图谱数据仓库AbutionGraph功能介绍-Streaming Graph OLAM Database
AbutionGraph是一款端到端的流式数据实时分析的图谱数据库,实时(流式写入实时、高QPS决策分析实时、流式预处理实时)表现在: 构建实时查询QPS响应时长与历史数据量无关的图模型;接入流式数据并实时更新图计算指标&…...
 
windows实现Grafana+Loki+loki4j轻量级日志系统,告别沉重的ELK
文章目录 Loki下载Loki下载安装Loki添加Loki数据源springboot日志推送 Loki下载 下载地址:https://github.com/grafana/loki/releases/ 找到loki-windows-amd64.exe.zip点击开始下载,我这里下载的2.9.9版本 Loki下载 下载地址:https://gr…...
 
跟《经济学人》学英文:2024年06月01日这期 The side-effects of the TikTok tussle
The side-effects of the TikTok tussle tussle:美 [ˈtəsəl] 激烈扭打;争夺 注意发音 side-effects:副作用;(side-effect的复数) As the app’s future hangs in the balance, the ramifications of …...
Ubuntu安装PostgreSQL
Ubuntu(在线版) 更新软件源 sudo apt-get update 添加PostgreSQL官方数字签名 wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - 将地址添加到系统的软件包源列表中 echo "deb http://apt.postgresql.org/pub/repos/a…...
【HarmonyOS NEXT】鸿蒙如何让List组件不满一屏时,还要能滑动和回弹
当List组件不满一屏时,还要能滑动和回弹,就向系统设置 - 移动网络 页面一样 List设置如下属性: .edgeEffect(EdgeEffect.Spring, {alwaysEnabled: true}) edgeEffect edgeEffect(value: EdgeEffect, options?: EdgeEffectOptions) 设置边缘滑动效果。…...
JDK-SPI-服务提供者接口
归档 GitHub: JDK-SPI-服务提供者接口 SPI 源码说明 java.util.ServiceLoader /*** 服务加载器:给定接口,查找实现类。实现可迭代接口 */ public final class ServiceLoader<S> implements Iterable<S> {/*** 返回 ServiceLoader 实例 *…...
 
【docker】容器内配置环境变量
背景: 我要把下面的环境变量写到bash脚本里,起名叫environment_start.sh。 目的: 用于每次进入容器dev_into.sh的时候,让系统获取到环境变量。 操作步骤: 先在容器外找个合适的位置写环境变量bash脚本,…...
 
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
 
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
 
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
 
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
 
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
