JavaSE - Sting类
目录
一. 字符串的定义
二. String类中的常用方法
1. 比较两个字符串是否相等(返回值是boolean类型)
2. 比较两个字符串的大小(返回值是int类型)
3. 字符串查找
(1)s1.charAt(index) index:下标,返回字符串的值
(2)s1.indexOf(ch) 从前往后找,返回ch第一次出现时的下标,没有就返回 -1
(3)s1.indexOf(ch,from) 从下标from开始往后找,返回ch第一次出现时的下标,没有就返回 -1
(4)s1.indexOf(str) 在字符串中找字符串str,找到返回下标
(5)s1.indexOf(str,from) 从from下标开始往后找字符串str,找到返回下标
(6)s1.lastIndexOf(ch) 从后往前找,返回ch第一次出现的下标
(7)s1.lastIndexOf(ch,from) 从from开始往前找,返回ch第一次出现的下标
(8)s1.lastIndexOf(str) 从后往前找字符串str,找到返回第一次出现的下标
(9)s1.lastIndexOf(str,from) 从from开始往前找,找到返回第一次出现的下标
4. 转化
(1)String.valueOf(各种类型的变量) —— 其他类型转化成字符串
(2)字符串转化成其他类型
(3)字符串大小写转化
(4)s1.toCharArray() —— 字符串转字符数组【这个方法很重要】
(5)字符数组转字符串 —— 把数组直接扔过去就变成了字符串
5. 字符串替换 —— 返回的是一个新的字符串
6. 字符串拆分
7. 字符串截取(用的非常多)
8. 字符串的其他方法
(1)s1.trim() —— 去掉字符串左右两边的空格
(2)s1.contains(str) —— 字符串s1中是否包含字符串str,返回true 或 false
(3)s1.endsWith(str) —— 判断字符串s1是否以字符串str结尾,返回true 或 false
(4)s1.startsWith(str) —— 判断字符串s1是否以字符串str开始,返回true 或 false
三. 字符串常量池
1. 字符串常量池
题目一:
题目二:
总结:
2. String类对象实例化底层
(1)
(2)
(3)
总结:
3. intern方法
四. 字符串的不可变性
五. 字符串修改
六. StringBuilder和StringBuffer
1. StringBuilder和StringBuffer的特点:
2. StringBuilder和StringBuffer的方法:
3. String、StringBuilder和StringBuffer的不同点:
4. StringBuilder类型的对象和String类型的对象,如何相互转换?
5. 以下分别创建了多少个对象(常量池里都没有)
七. String类oj题
一. 字符串的定义

1. String类中有两个成员:value数组和hash。String内部并不存储字符串本身,字符串保存在char类型的字符数组value中

2. 字符串不以‘\0’结尾
3. 使用 s1.length() 输出字符串的长度

二. String类中的常用方法
String类中的方法,基本上返回的都是一个新的字符串对象,不是在原来上做出改变
1. 比较两个字符串是否相等(返回值是boolean类型)
(1)比较两个字符串是否相等 —— s1.equals(s2)
(2)忽略大小写比较两个字符串是否相等 —— s1.equalsIgnoreCase(s2)


2. 比较两个字符串的大小(返回值是int类型)


因为String类实现了Comparable<String>接口,所以String一定重写了compareTo方法
(1)比较两个字符串的大小 —— s1.compareTo(s2)
(2)忽略大小写比较两个字符串的大小 —— s1.compareToIgnoreCase(s2)


3. 字符串查找
(1)s1.charAt(index) index:下标,返回字符串的值


(2)s1.indexOf(ch) 从前往后找,返回ch第一次出现时的下标,没有就返回 -1


(3)s1.indexOf(ch,from) 从下标from开始往后找,返回ch第一次出现时的下标,没有就返回 -1


(4)s1.indexOf(str) 在字符串中找字符串str,找到返回下标
(5)s1.indexOf(str,from) 从from下标开始往后找字符串str,找到返回下标


(6)s1.lastIndexOf(ch) 从后往前找,返回ch第一次出现的下标
(7)s1.lastIndexOf(ch,from) 从from开始往前找,返回ch第一次出现的下标
(8)s1.lastIndexOf(str) 从后往前找字符串str,找到返回第一次出现的下标
(9)s1.lastIndexOf(str,from) 从from开始往前找,找到返回第一次出现的下标



4. 转化
(1)String.valueOf(各种类型的变量) —— 其他类型转化成字符串

(2)字符串转化成其他类型


(3)字符串大小写转化
小写转大写:s1.toUpperCase()
大写转小写:s1.toLowerCase()


(4)s1.toCharArray() —— 字符串转字符数组【这个方法很重要】


(5)字符数组转字符串 —— 把数组直接扔过去就变成了字符串


5. 字符串替换 —— 返回的是一个新的字符串
(1)s1.replace('oldChar','newChar') 字符oldChar全部替换成newChar
(2)s1.replace(" "," ") 字符串全部替换
(3)s1.replaceAll(" "," ") 字符串全部替换
(4)s1.replaceFirst(" "," ") 替换第一个出现的


6. 字符串拆分
(1)s1.split(拆分符号)
(2)s1.split(拆分符号,拆分成几份)【拆分成几份,即数组中有几个元素,当然不能拆也不能硬拆】


特殊:. \ | * + 等 都得加上转义字符
如: . 【\ 去转义这个 . 了,那么这个 \ 怎么办,还得需要一个 \ 来转义】所以是 \\.
【每个\都需要\去转义,s2里面就有两个\,所以是 \\\\】


\不可能单独存在,因为它会和后面形成转义,就不是\了,只能\\这样存在。\\其实就是一个\。
要是想以一个\进行拆分,可以下面这样,因为是拆分失败,就只能把s1的内容原样输出啦。


如果一个字符串中有多个分隔符,可以用"|"作为连字符


多次拆分:


7. 字符串截取(用的非常多)
(1)s1.substring(index) —— 从index下标开始截取
(2)s1.substring(beginIndex,endIndex) —— 从beginIndex截取到endIndex,左闭右开


8. 字符串的其他方法
(1)s1.trim() —— 去掉字符串左右两边的空格


(2)s1.contains(str) —— 字符串s1中是否包含字符串str,返回true 或 false


(3)s1.endsWith(str) —— 判断字符串s1是否以字符串str结尾,返回true 或 false
(4)s1.startsWith(str) —— 判断字符串s1是否以字符串str开始,返回true 或 false
三. 字符串常量池
1. 字符串常量池
字符串常量池,是存放在堆中的一块区域。底层是一个StringTable的哈希表
只要是双引号引起来的,首先会去字符串常量池检查有没有相同的 ,如果字符串常量池中有,拿常量池的,如果没有,就把字符串存到常量池中,常量池中只存一份。
如:
题目一:


对于s1来说,常量池中没有“hello”这个字符串,所以会在常量池中存一份。给s2赋值“hello”时,常量池中已经存在该字符串了,取的是常量池的同一份,所以结果为true。
题目二:


对于s1来说,常量池中没有“hello”这个字符串,所以会在常量池中存一份。同时,自己new了一个String对象,value中存的是常量池的“hello”的地址(0x12)。给s2赋值“hello”时,常量池中已经存在该字符串了,所以不会再存一遍了,同时,自己又new 了一个String对象,value中存的还是0x12。只不过,s1和s2都是新new了String对象,里面存的是新的地址,所以结果为false。但是,它们value中存的值都是相同的,都指向同一份“hello”。
总结:
构造字符串时,最好不要new一个对象,直接使用字符串常量给引用变量赋值就行,由于字符串常量池的存在,直接赋值的效率更高,而且更节省空间。
2. String类对象实例化底层
(1)


(2)


(3)
会将字符数组ch拷贝一份


总结:
(1)会存到常量池
(2)会存到常量池,堆上还会new一个String对象
(3)堆上new一个数组,对数组进行一次拷贝,然后new一个String对象,让value数组指向拷贝好的数组。
3. intern方法
该方法的作用是当常量池不存在这个对象的时候,会将创建的此对象添加到常量池中。

没用intern之前,s1的对象并不在常量池之中,而是拷贝的ch指向的字符数组。如下图:

所以要想输出true,s1的对象需要在常量池中存一份。

s1调用intern,会将s1所指的对象放到常量池中。那么给s2赋值“abc”时,常量池中已经有"abc"对象了,所以用的是同一份,如下图:

四. 字符串的不可变性

字符串是不可变的,对字符串进行操作,不会在原字符串上进行改变,而是会返回一个新的字符串对象。
五. 字符串修改
字符串是不能修改的,每次修改都会创建新的对象,效率非常低下。


我们通过汇编可以看到,这几行代码,其实创建了许多StringBuilder对象去拼接字符串
还原出来就是下面这个代码:

六. StringBuilder和StringBuffer
StringBuilder和StringBuffer new对象调用构造方法时,会在原来字符串的基础上后面多16个空格。
调用StringBuilder类中的toString方法后,返回一个新的对象,count就是字符串的长度,这个新对象没有多余的16个空格啦。于是StringBuilder就变成String类了。
1. StringBuilder和StringBuffer的特点:
(1)是一个类
(2)不能直接赋值,需要new对象


![]()
new对象调用这个构造方法,会在原来字符串的基础上多16个空格,字符串变长了。
(3)StringBuilder和StringBuffer是可变的,拼接后返回的还是这个对象,不会产生新的对象


有返回值,却不需要接收。因为返回的还是这个对象(this),在自身进行了修改。
(4)StringBuilder重写了toString方法,StringBuffer也重写了toString方法


System.out.println(stringBuilder);
首先,会调用StringBuilder重写的toString方法,返回String类型的一个新对象。(假设起名s1)
【调用StringBuilder类中的toString方法:count就是字符串的长度,这个新对象没有多余的16个空格啦】
然后,s1会调用String类中的toString方法,返回this。
所以,最后输出的是字符串“hello”。
2. StringBuilder和StringBuffer的方法:
append:字符串拼接
delete:删除指定范围内的字符,左闭右开
reverse:字符串逆置
3. String、StringBuilder和StringBuffer的不同点:
(1)String的内容不可修改,StringBuilder和StringBuffer的内容可以修改
(2)StringBuffer和StringBuilder大部分功能是相似的
(3)StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作

synchronized: 多线程情况下,用来保证线程的安全
4. StringBuilder类型的对象和String类型的对象,如何相互转换?
(1)StringBuilder转String: 调用StringBuilder中的toString方法

(2)String转StringBuilder: 利用StringBuilder的构造方法或append方法

5. 以下分别创建了多少个对象(常量池里都没有)
数组的那个对象不分开算,整体算一个对象

(1):2个,常量池一个,new了一个
(2):6个,常量池2个(“a”和“b”),new的两个,它们两个拼接生成了一个StringBuilder对象,最后,赋值给String类型,会调用StringBuilder的toString方法,toString方法会返回一个新的String对象,即又new了一个对象。总共6个。
七. String类oj题
1. 字符串中的第一个唯一字符
2. 最后一个单词的长度
3. 检测字符串是否为回文
Character类的静态方法:
Character.isDigit(char c) —— 判断字符c是否是数字字符
Character.isletter(char c) —— 判断字符c是否是字母字符
Character.isLowerCase(char c) —— 判断字符c是否是小写字母字符
Character.isUpperCase(char c) —— 判断字符c是否是大写字母字符
Character.isLetterorDigit(char c) —— 判断字符c是否是字母或数字字符
相关文章:
JavaSE - Sting类
目录 一. 字符串的定义 二. String类中的常用方法 1. 比较两个字符串是否相等(返回值是boolean类型) 2. 比较两个字符串的大小(返回值是int类型) 3. 字符串查找 (1)s1.charAt(index) index:下标&…...
zotero+overleaf插入参考文献
zotero导出参考献bib文件 overleaf上传此biib文件 后续添加package,输出参考文献,添加引用参考http://t.csdn.cn/bC245 默认导出的bib文件信息臃肿,使用插件设置,安装过程参考http://t.csdn.cn/4HcBm…...
C语言每天一练----输出水仙花数
题目:请输出所有的"水仙花数" 题解:所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。 例如, 153是水仙花数, 因为153 1 * 1 * 1 5 * 5 * 5 3 * 3 * 3" #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h&g…...
Linux-Shell
1.什么是Bash shell(壳) Bash Shell是一个命令解释器,它在操作系统的最外层,负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给操作系统,并将处理后的结果输出至屏幕。 通过xshell连接,就是打开了一…...
Python读取csv、Excel文件生成图表
简介 本文章介绍了通过读取 csv 或 Excel 文件内容,将其转换为折线图或柱状图的方法,并写入 html 文件中。 目录 1. 读取CSV文件 1.1. 生成折线图 1.1.1. 简单生成图表 1.1.2. 设置折线图格式 1.2. 生成柱状图 1.2.1. 简单生成图表 1.2.2. 设置柱…...
虚拟机中Linux的IP地址配置详解
目录 第一章、虚拟机中Linux的IP地址配置详解1.1)什么是IP地址1.2)如何查看自己电脑ip地址1.3)虚拟机NAT模式中Linux的IP地址设置有什么要求 第二章、使用Linux中的编辑命令进行网卡信息文件的配置 友情提醒 先看文章目录,大致了…...
Codeforces Round 889 (Div. 2) 题解
晚上睡不着就来总结一下叭~(OoO) 赛后榜(希望不要被Hack...Orz) 终榜!!! 瞬间的辉煌(呜呜呜~) 先不放图了。。怕被dalaoHack...呜呜呜~ 总结 7.29半夜比赛,本来是不想打的,感觉最近做的题太多…...
系统学习Linux-MySQL用户权限管理(三)
一、用户权限管理概述 数据库用户权限管理是数据库系统中非常重要的一个方面,它用于控制不同用户访问和操作数据库的权限范围。数据库用户权限管理可以保护敏感数据和数据库结构,确保只有被授权的用户才可以操作和使用数据库,防止数据被修改…...
【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境4
7、使用串口工具 (1)连接硬件 连接 Type C 线, 一端电脑一端开发板 查看设备是否已经正确识别: 在 Windows 下可以打开设备管理器来查看 如果没有发现设备, 需要确认有没有装驱动以及接触是否良好 (2&a…...
阿里云NVIDIA A100 GPU云服务器性能详解及租用费用
阿里云GPU服务器租用费用表包括包年包月、一个小时收费以及学生GPU服务器租用费用,阿里云GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡,GPU云服务器gn6i可享受3折,阿里云百科分享阿里云GPU服务器租用表、GPU一个小时多少…...
数字身份、分布式存储、跨链技术等将如何推动Web3数据的发展?
Web3数据是基于区块链技术、去中心化、可信任的数据,具有较高的安全性和可信度。随着Web3.0时代的到来,Web3数据将会在金融、物联网、医疗、教育、政务等领域发挥重要的作用。其中,数字身份、分布式存储、跨链技术等将会是Web3数据发展的重要…...
Ubuntu 新增2T 硬盘,配置自动挂载
Ubuntu 台式机内存太小了,增加了一块 2T 的硬盘,记录下配置过程: 查看硬盘信息 可以看出,我电脑当前有三块硬盘: (1) /dev/nvme0n1 系统盘,256 G,分了两个区 /dev/nvme0n…...
Windows下安装HBase
Windows下安装HBase 一、HBase简介二、HBase下载安装包三、环境准备3.1、 JDK的安装3.2、 Hadoop的安装 四、HBase安装4.1、压缩包解压为文件夹4.2、配置环境变量4.3、%HBASE_HOME%目录下新建临时文件夹4.4、修改配置文件 hbase-env.cmd4.4.1、配置JAVA环境4.4.2、set HBASE_MA…...
在家构建您的迷你 ChatGPT
这篇文章分为三个部分;他们是: 什么是指令遵循模型?如何查找遵循模型的指令构建一个简单的聊天机器人废话不多说直接开始吧!!! 什么是指令遵循模型? 语言模型是机器学习模型,可以根…...
Cisco IOS操作(红茶三杯CCNA)
Cisco路由器组件 CPU:执行指令RAM:断电内容丢失 运行操作系统运行配置文件IP路由表ARP缓存数据包缓存区 ROM:保存开机自检软件,存储路由器的启动引导程序 bootstrap指令基本的自检软件迷你版IOS 非易失RAM(NVRAM&#…...
在Linux中用strsignal函数输出对各种信号的描述
2023年7月29日,周六上午 目录 函数原型Linux有多少种信号使用示例 函数原型 #include <string.h>char* strsignal(int signum);strsignal函数接受一个整数参数signum,表示信号的编号。 用于把信号编号转换成一个简短的对这个信号编号的描述。 L…...
分布式文件存储与数据缓存 Redis高可用分布式实践(上)
一、Reids概述 1.1 为什么要使用NoSQL 单机Mysql的美好年代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。 遇到问题: 随着用户数的…...
chatglm2外挂知识库问答的简单实现
一、背景 大语言模型应用未来一定是开发热点,现在一个比较成功的应用是外挂知识库。相比chatgpt这个知识库比较庞大,效果比较好的接口。外挂知识库大模型的方式可以在不损失太多效果的条件下获得数据安全。 二、原理 现在比较流行的一个方案是langcha…...
从0到1开发go-tcp框架【1-搭建server、封装连接与业务绑定、实现基础Router、抽取全局配置文件】
从0到1开发go-tcp框架【1-搭建server、封装连接与业务绑定、实现基础Router】 本期主要完成对Server的搭建、封装连接与业务绑定、实现基础Router(处理业务的部分)、抽取框架的全局配置文件 从配置文件中读取数据(服务器监听端口、监听IP等&a…...
建设银行秋招指南,备考技巧和考试内容详解
建设银行秋招简介 银行作为非常吃香的岗位,每年都有不少同学通过投递简历,进入笔试,再到面试成功,成功到银行就职,也有相当一部分同学因为信息差,符合条件却没有报名。无法进入银行工作。 建设银行的秋招…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
起重机起升机构的安全装置有哪些?
起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...
