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…...
建设银行秋招指南,备考技巧和考试内容详解
建设银行秋招简介 银行作为非常吃香的岗位,每年都有不少同学通过投递简历,进入笔试,再到面试成功,成功到银行就职,也有相当一部分同学因为信息差,符合条件却没有报名。无法进入银行工作。 建设银行的秋招…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...