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是否是字母或数字字符

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

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

相关文章

基于RK3588+AI的边缘计算算法方案:智慧园区、智慧社区、智慧物流

RK3588 AI 边缘计算主板规格书简介 关于本文档 本文档详细介绍了基于Rockchip RK3588芯片的AI边缘计算主板外形、尺寸、技术规格&#xff0c;以及详细的硬件接口设计参考说明&#xff0c;使客户可以快速将RK3588边缘计算主板应用于工业互联网、智慧城市、智慧安防、智慧交通&am…

Python 进阶(四):日期和时间(time、datetime、calendar 模块)

❤️ 博客主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;Python 入门核心技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; 文章目录 1. time模块1.1 获取当前时间1.2 时间休眠1.3 格式化时间 2. datetime模块2.1 获取当前…

EXCEL数据自动web网页查询----高效工作,做个监工

目的 自动将excel将数据填充到web网页&#xff0c;将反馈的数据粘贴到excel表 准备 24KB的鼠标连点器软件&#xff08;文末附链接&#xff09;、Excel 宏模块 优势 不需要编程、web验证、爬虫等风险提示。轻量、稳定、安全。 缺点 效率没那么快 演示 宏环境 ht…

Go语法入门 + 项目实战

&#x1f442; Take me Hand Acoustic - Ccile Corbel - 单曲 - 网易云音乐 第3个小项目有问题&#xff0c;不能在Windows下跑&#xff0c;懒得去搜Linux上怎么跑了&#xff0c;已经落下进度了.... 目录 &#x1f633;前言 &#x1f349;Go两小时 &#x1f511;小项目实战 …

《Kubernetes故障篇:unable to retrieve OCI runtime error》

一、背景信息 1、环境信息如下&#xff1a; 操作系统K8S版本containerd版本Centos7.6v1.24.12v1.6.12 2、报错信息如下&#xff1a; Warning FailedCreatePodSandBox 106s (x39 over 10m) kubelet (combined from similar events): Failed to create pod sandbox: rpc error: …

【SAP Abap】记录一次SAP长文本内容通过Web页面完整显示的应用

【SAP Abap】记录一次SAP长文本内容通过Web页面完整显示的应用 1、业务背景2、实现效果3、开发代码3.1、拼接html3.2、显示html3.3、ALV导出Excel 1、业务背景 业务在销售订单中&#xff0c;通过长文本描述&#xff0c;记录了一些生产备注信息&#xff0c;如生产标准、客户要求…

CentOS7安装jenkins

一、安装相关依赖 sudo yum install -y wget sudo yum install -y fontconfig java-11-openjdk二、安装Jenkins 可以查看官网的安装方式 安装官网步骤 先导入jenkins yum 源 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo…

索引的数据结构

索引的数据结构 部分资料来自B站尚硅谷-宋红康老师 1. 为什么使用索引 使用索引是为了加快数据库的查询速度和提高数据库的性能。索引是数据库表中的一种数据结构&#xff0c;它可以帮助数据库快速定位并检索所需的数据。 当数据库表中的数据量较大时&#xff0c;如果没有索…

ELK + Fliebeat + Kafka日志系统

参考&#xff1a; ELKFilebeatKafka分布式日志管理平台搭建_51CTO博客_elk 搭建 ELK 日志分析系统概述及部署&#xff08;上&#xff09;-阿里云开发者社区 ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch , Logstash, Kibana , 它们都是开源软件。…

Verilog语法学习——LV6_多功能数据处理器

LV6_多功能数据处理器 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 描述 根据指示信号select的不同&#xff0c;对输入信号a,b实现不同的运算。输入信号a…

解决使用@Field注解配置分词器失效问题(Spring Data Elasticsearch)

问题复现&#xff1a;插入数据时&#xff0c;实体类配置的Field注解没有生效 实体类&#xff1a; package cn.aopmin.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import…

浅谈深度神经网络

Deep neural networks are completely flexible by design, and there really are no fixed rules when it comes to model architecture. -- David Foster 前言 神经网络 (neural network) 受到人脑的启发&#xff0c;可模仿生物神经元相互传递信号。神经网络就是由神经元组成…

docker配置文件挂载(容器数据管理)

目录 数据卷&#xff08;容器数据管理&#xff09;什么是数据卷数据集操作命令创建和查看数据卷挂载数据卷案例案例-给nginx挂载数据卷案例-给MySQL挂载本地目录 总结 数据卷&#xff08;容器数据管理&#xff09; 在之前的nginx案例中&#xff0c;修改nginx的html页面时&#…

如何利用Requestly提升前端开发与测试的效率

痛点 B站最牛的Python接口自动化测试进阶教程合集&#xff08;真实企业项目实战&#xff09; 前端测试 在进行前端页面开发或者测试的时候&#xff0c;我们会遇到这一类场景&#xff1a; 在开发阶段&#xff0c;前端想通过调用真实的接口返回响应在开发或者生产阶段需要验证前…

热备盘激活失败导致raid5阵列崩溃的服务器数据恢复案例

服务器数据恢复环境&#xff1a; 一台Linux Redhat操作系统服务器上有一组由5块硬盘组建的raid5阵列&#xff0c;包含一块热备盘。上层部署一个OA系统和Oracle数据库。 服务器故障&#xff1a; raid5阵列中的1块磁盘离线&#xff0c;硬盘离线却没有激活热备盘&#xff0c;直到…

IntelliJ IDEA 2023.2 主要更新了什么?(图文版)

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Spring 6【数据校验Validation、JSR 303 和 Hibernate 实现】(十三)-全面详解(学习总结---从入门到深化)

目录 数据校验Validation 2.JSR 303 和 Hibernate 实现 数据校验Validation 1.数据校验介绍 数据校验分为客户端数据校验和服务端数据校验。都是为了保证数据完整性的。 客户端数据校验直接使用客户端脚本校验即可。例如在B/S模型项目中&#xff0c;可以选择使用JavaScript…

CS144学习笔记(1):Internet and IP

1.网络应用 网络应用可以在世界范围内交换数据&#xff0c;例如你可以通过浏览器读取出版社服务器提供的文章。网络应用的基本模型&#xff1a;两台主机各自在本地运行一个程序&#xff0c;程序通过网络来通信。 最常用的通信模型使用双向可靠字节流&#xff0c;通信的两台主机…

实战:Docker+Jenkins+Gitee构建CICD流水线

文章目录 前言Jenkins部署创建Jenkins docker-compose配置maven源启动Jenkins容器安装插件Gitee ssh公匙配置与测试项目提交 Jenkins创建流水线写在最后 前言 持续集成和持续交付一直是当下流行的开发运维方式&#xff0c;CICD省去了大量的运维时间&#xff0c;也能够提高开发…

ElasticSearch基本使用--ElasticSearch文章一

文章目录 官网学习必要性elasticsearch/kibana安装版本数据结构说明7.x版本说明ElasticSearch kibana工具测试后续我们会一起分析 官网 https://www.elastic.co/cn/ 学习必要性 1、在当前软件行业中&#xff0c;搜索是一个软件系统或平台的基本功能&#xff0c; 学习Elastic…