JavaSE - Sting类

news2024/9/28 21:29:01

目录

一. 字符串的定义

二. 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.coloradmin.cn/o/808579.html

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

相关文章

【React Native】学习记录(二)——路由搭建和常见的开发技巧

模拟器设置成中文 在开发过程中发现&#xff0c;两个模拟器都不能输入中文&#xff0c;所以需要配置一下。 先说一下安卓&#xff0c;在弹出的输入框中查看设置&#xff0c;设置一下对应的languages即可&#xff1a; 在苹果模拟器中&#xff0c;跟苹果手机一样&#xff0c;打…

Python web实战 | 用Docker部署Django项目

1. Docker与Django 为什么要使用Docker来部署Django项目&#xff1f;这是因为Docker提供了一个独立、一致的环境&#xff0c;让开发者可以在任何地方运行他们的应用程序&#xff0c;而不用担心环境配置问题。这就像是你有一个可以装下所有工具和材料的宝箱&#xff0c;无论你走…

Linux内存回收入口

概述 内存回收主要是有kswapd异步回收和direct reclaim同步回收两种入口&#xff0c;其中逻辑非常复杂&#xff0c;本文主要只概要描述不同回收场景下内核设计的主要思想&#xff0c;源码细节不同版本有不少区别&#xff0c;具体的分析后续会有专门的文章分析。 页面回收常识&…

【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

文章目录 前言声明和初始化扩容时机源码分析go1.17go1.18内存对齐 总结 前言 在 Go 语言中&#xff0c;有一个很常用的数据结构&#xff0c;那就是切片&#xff08;Slice&#xff09;。 切片是一个拥有相同类型元素的可变长度的序列&#xff0c;它是基于数组类型做的一层封装…

【LeetCode】二叉树的前序,中序,后序遍历

此题用递归做比较容易&#xff0c;然后根据前中后的遍历特点&#xff1a; 前序是根左右&#xff0c; 中序是左根右&#xff0c; 后序是左右根。 前序遍历&#xff1a;做题入口 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer…

IntersectionObserver实现小程序长列表优化

IntersectionObserver实现小程序长列表优化 关于 IntersectionObserver 思路 这里以一屏数据为单位【一个分页的10条数据&#xff0c;最好大于视口高度】&#xff0c; 监听每一屏数据和视口的相交比例&#xff0c;即用户能不能看到它 只将可视范围的数据渲染到页面上&#x…

2025年卡脖子技术清零?甚至计划推动鸿蒙欧拉比肩全球领先水平

深圳市工业和信息化局近日发布了推动开源鸿蒙欧拉产业创新发展的行动计划&#xff0c;以推动鸿蒙欧拉在2023至2025年期间成为全球领先操作系统&#xff0c;并构建全球信息技术体系&#xff0c;实现我国操作系统技术创新和自主发展目标。 该计划旨在加强操作系统技术能力&#x…

造个轮子--用Python写个语法解析器

文章目录 前言选型针对人群目标技术实现本文目标 效果实现字符指针错误类型语法解析交互 前言 目的纯粹&#xff0c;基于Python做一个简单的新的简单的编程语言。一方面是开拓视野&#xff0c;另一方面是作为毕设的临时过渡方案&#xff08;没错&#xff0c;先前提到的算法平台…

抖音短视频矩阵系统源码:SEO优化开发解析

抖音短视频矩阵系统源码是一个基于抖音短视频平台的应用程序。它允许用户上传和观看短视频&#xff0c;以及与其他用户交互。SEO优化开发解析是指对该系统进行搜索引擎优化的开发解析。 一、 在进行SEO优化开发解析时&#xff0c;可以考虑以下几点&#xff1a; 关键词优化&…

【Python数据分析】Python常用内置函数(一)

&#x1f389;欢迎来到Python专栏~Python常用内置函数&#xff08;一&#xff09; ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文…

在撰写公文时,要注意使用正确的格式和样式

在撰写公文时&#xff0c;注意使用正确的格式和样式&#xff0c;以符合公文的规范要求是非常重要的。 公文是一种正式文书&#xff0c;需要遵循一定的格式和样式要求&#xff0c;以符合公文的规范和标准。在撰写公文时&#xff0c;需要注意以下几点&#xff1a; 1.文字排版&…

day46-Quiz App(测试题计分)

50 天学习 50 个项目 - HTMLCSS and JavaScript day46-Quiz App&#xff08;测试题计分&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" conte…

【matlab】机器人工具箱快速上手-动力学仿真(代码直接复制可用)

动力学代码&#xff0c;按需修改参数 各关节力矩-关节变量的关系曲线&#xff1a; %%%%%%%%SCARA机器人仿真模型 l[0.457 0.325]; L(1) Link(d,0,a,l(1),alpha,0,standard,qlim,[-130 130]*pi/180);%连杆1 L(2)Link(d,0,a,l(2),alpha,pi,standard,qlim,[-145 145]*pi/180);%连…

代理模式--静态代理和动态代理

1.代理模式 定义&#xff1a;代理模式就是代替对象具备真实对象的功能&#xff0c;并代替真实对象完成相应的操作并且在不改变真实对象源代码的情况下扩展其功能&#xff0c;在某些情况下&#xff0c;⼀个对象不适合或者不能直接引⽤另⼀个对象&#xff0c;⽽代理对象可以在客户…

华为OD机试真题 Java 实现【最长公共后缀】【2023 B卷 100分】,等于白送

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明4、再输入5、再输出 七、机考攻略 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff…

【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

文章目录 前言数组声明以及初始化函数参数 切片声明以及初始化函数参数 总结 前言 在 Go 语言中&#xff0c;数组和切片看起来很像&#xff0c;但其实它们又有很多的不同之处&#xff0c;这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用…

LBERT论文详解

论文地址&#xff1a;https://arxiv.org/abs/2105.07148 代码地址&#xff1a;https://github.com/liuwei1206/LEBERT 模型创新 LEBRT采用句子中的词语对&#xff08;论文中称为Char-Word Pair&#xff09;的特征作为输入作者设计Lexicon adapter&#xff0c;在BERT的中间某一…

Codeforces Round 839 (Div. 3)E题解

文章目录 [Permutation Game](https://codeforces.com/contest/1772/problem/E)问题建模问题分析1.分析一个玩家想要获胜的关键2.分析阻塞元素的类别3.分析阻塞元素的类别对于局面的影响代码 Permutation Game 问题建模 给定一个长度为n的排列&#xff0c;排列的每个元素都被阻…

CentOS 7安装PostgreSQL 15版本数据库

目录 一、何为PostgreSQL&#xff1f; 二、PostgreSQL安装 2.1安装依赖 2.2 执行安装 2.3 数据库初始化 2.4 配置环境变量 2.5 创建数据库 2.6 配置远程 2.7 测试远程 三、常用命令 四、用户创建和数据库权限 一、何为PostgreSQL&#xff1f; PostgreSQL是以加州大学…

DGNN Survey

Dynamic Graph Definition G ( V , E , X ) G (V, E, X) G(V,E,X) V v 1 , v 2 , . . . , v m V {v_1, v_2, ..., v_m} Vv1​,v2​,...,vm​ E e i , j E {e_{i, j}} Eei,j​ , e i , j ( v i , v j , f i , j ) e_{i,j} (v_i, v_j, f_{i,j}) ei,j​(vi​,vj​,fi,j​…