字符串相关类

news2024/11/17 2:38:39

文章目录

  • 一、String类
    • String的介绍
    • String实例化
      • 面试题:String s=new String("abc")创建对象,在内存中创建了几个对象?
      • 易错题1
      • 易错题2
    • String常用方法
    • String与char[ ]之间的转换
    • String与byte[ ]之间的转换
  • 二、StringBuffer类、StringBuilder类
    • String、StringBuffer、StringBuilder的异同
      • 问题1:StringBuffer数组长度
      • 问题2:扩容
    • StringBuffer类常用方法(StringBuilder同样适用)
    • String、StringBuffer、StringBuilder的效率从高到低排列

一、String类

String的介绍

String:字符串,用“”引起来表示
1、String声明为final的,不可被继承
2、String实现了Serializable接口,表示字符串是支持序列化的
实现了Comparable接口,表示String可以比较大小
3、String内部定义了final char[ ] value,用于存储字符串数据,final代表数组不可以在被重新赋值,数组元素也不可被修改
4、String:代表一个不可变的字符序列(不可变性)
体现1:当对字符串重新赋值时,需要重新制定内存区域复制,不能在原有的内存区域赋值
体现2:当对现有的字符串进行连接操作时,也需要重新制定内存区域,不能在原有区域进行修改
体现3:当调用String的replace方法对指定字符串或字符进行修改时,也需要重新制定内存区域,不能在原有区域进行修改
5、通过字面量方式(区别于new方式)给一个字符串赋值,此时的字符串声明在字符串常量池中
6、字符串常量池中不会存储相同内容的字符串
在这里插入图片描述
过程描述:通过字面量的定义方式,新建了一个s1,内容为abc,新建了一个字符串s2,内容为abc,在s1内容没有改为hello之前,因为两个字符串存储的内容一样,所以两个字符串的地址值相同,即System.out.println(s1==s2);当s1内容变为hello时,因为字符串的不可变性,并不是将s1原有的存储区域中的内容abc改成hello,而是在内存中重新开辟一个区域,内容为hello,并让s1指向这个新的区域。此时s1内容变为hello,且s1和s2的地址值不再相同

String实例化

1、字面量定义(声明在方法取得字符串常量池中)
2、new+构造器定义(保存在堆空间中,地址值也是堆空间中的)
在这里插入图片描述
描述过程:s1和s2是通过字面量定义的,s3和s4是通过new的方式定义的,s1 = = == ==s2是true前面解释过了,下面几个判断是因为:s3和s4都在堆空间中开辟了新的存储区域,是String的两个实例化的对象,分别是两套内容,对应两个地址,所以s3 = = == ==s4是false;s1、s2中的地址值是方法区中的,s3、s4是堆空间中的,两者地址值肯定不相同,所以s1 = = == ==s4、s2 = = == ==s4都是false。但是两者之间也存在关系:他们中的内容是一样的,都是Java EE,体现在,s3、s4是String类型,有属性value,而value是引用变量,存储的内容是字符串,所以value的内容是存储的字符串的地址值。所以s1、s2在方法区中的地址值其实是保存在s3、s4的属性value中,类似于:
在这里插入图片描述
另:
在这里插入图片描述
是true的原因:相当于用字面量的方式给Person类中的属性name赋值,其中name是String类型的。

面试题:String s=new String(“abc”)创建对象,在内存中创建了几个对象?

两个,一个是new产生的堆空间中的,一个是char [ ]对应的常量池中的数据“abc”

易错题1

在这里插入图片描述

【总结】
1、常量和常量的拼接,结果在常量池中,且常量池中的内容不会有重复的
2、只要其中有一个是变量,结果就在对当中
3、如果拼接的结果调用了intern()方法,返回值在常量池中
在这里插入图片描述
s4在加上final后变成一个常量,根据总结的第一条,常量之间的拼接是发生在常量池的

易错题2

在这里插入图片描述
值传递机制:基本数据类型传的是具体值,引用数据类型传的是地址值。然后change方法中的引用数据类型又是String类型,相当于在change方法中,将类中的String str的地址值传递过来。因为String的不可变性,内容改变后的str指向了一个新的地址值,但是并没有改变原有的str,所以str没变。而char型数组ch不是引用类型,将其中一个元素进行改变,相当于基本数据类型的具体指的修改,会变

String常用方法

1、int length:返回字符串长度
2、char charAt(int index):返回index处的字符
3、boolean isEmpty():判断字符串是否为空
4、String toLowerCase():将String中所有字符转换为小写
String toUpperCase():将String中所有字符转换为大写

【注意】下面的s1并没有被修改
在这里插入图片描述

5、String trim():返回字符串的副本,忽略开头和结尾的若干空格
6、boolean equals(Object obj):比较字符串内容是否相同(严格区分大小写)
boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写
7、String concat(String str):将指定字符串连接到此字符串结尾,等价于“+”
8、int compareTo(String anotherString):比较两个字符串大小(结果是负的,当前调用方法的字符串小,正数大,零相等;涉及到字符串排序)
9、String substring(int beginIndex):返回一个新的字符串,他是从此字符串的beginIndex开始截取
String substring(int beginIndex, int endIndex):返回一个新的字符串,他是从此字符串的beginIndex开始,截取到endIndex(不包含)的一个子字符串。(左闭右开)
10、boolean endsWith(String suffix):测试此字符串是否已制定后缀结束
boolean startsWith(String prefix):测试此字符串是否已制定前缀开始
boolean startsWith(String prefix, int toffset):测试此字符串从指定位置开始的子字符串是否已制定前缀开始
11、boolean contains(CharSequence s):当且仅当此字符串中包含指定的char值序列时,返回true
12、int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):从指定索引开始,返回指定字符串在此字符串中第一次出现处的索引
13、int lastIndexOf(String str):返回子字符串第一次出现出的索引(从末尾开始找)
int lastIndexOf(String str, int fromIndex):返回指定字符串在此字符串中最后一次出现出的索引,从指定索引开始反向搜索(说白了就是从末尾开始搜索)

什么情况下indexOf(String str)和lastIndexOf(String str)返回值相同?
str只有一个或没有时

14、String replace(char oldChar, char newChar):返回一个新的字符串,其中用newChar代替原来的oldChar
String replace(charSequence target, charSequence replacement):返回一个新的字符串,其中用新的字符串replacement代替原来的字符串target
15、String replaceAll(String regex, charSequence replacement):使用给定的字符串replacement替换此字符串匹配给定的正则表达式的子字符串(暂时先了解)
16、String replaceFirst(String regex, charSequence replacement):使用给定的字符串replacement替换此字符串匹配给定的正则表达式的第一个子字符串(暂时先了解)
17、boolean matches(String regex):告知此字符串是否匹配给定的正则表达式
18、String[ ] split(String regex):根据给定正则表达式的匹配拆分此字符串

在这里插入图片描述

String[ ] split(String regex, int limit):根据给定正则表达式的匹配拆分此字符串,最多不超多limit个,如果超过了剩下的全部放到最后一个元素中

String与char[ ]之间的转换

String——>char[ ]:调用String的toCharArray方法

在这里插入图片描述

char[ ]——>String:调用String的构造器

在这里插入图片描述

String与byte[ ]之间的转换

String——>char[ ]:调用String的getbytes方法(使用默认的字符集进行转换)

在这里插入图片描述
sysout中的语句是遍历数组

还可以指定编码集
在这里插入图片描述
byte[ ]——>String:调用String的构造器

在这里插入图片描述
在这里插入图片描述
字符集要一致!!!

二、StringBuffer类、StringBuilder类

String、StringBuffer、StringBuilder的异同

String:不可变的字符序列;底层使用char[ ]存储
StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[ ]存储
StringBuilder:可变的字符序列;jdk5.0新增,线程不安全,效率高;底层使用char[ ]存储

源码分析:
String str=new String();//char[ ] value=new char[0];
String str1=new String(“abc”);//char[ ] value=new char[ ]{‘a’,‘b’,‘c’};
StringBuffer str2=new StringBuffer();//char[ ] value=new char[16],底层创建了一个长度为16的数组

问题1:StringBuffer数组长度

在这里插入图片描述
但是这里求的length实际上是返回数组中的元素个数,所以返回值是0不是16

问题2:扩容

在StringBuffer中如果数据盛不下了,需要扩容底层数组

默认情况下,扩容为原来的2倍+2,并将原有数组中内容复制到扩容后的数组中。

【建议】:尽量使用StringBuffer(int capacity)//指定底层数组容量的构造器;或StringBuilder(int capacity)

StringBuffer类常用方法(StringBuilder同样适用)

1、StringBuffer append(xxx):提供了很多append方法,用于字符串的拼接
2、StringBuffer delete(int start, int end):删除指定位置的内容(左闭右开)
3、StringBuffer replace(int start, int end, String str):把[start, end)位置替换为str
4、StringBuffer insert(int offset, xxx):提供了很多append方法,用于字符串的插入
5、StringBuffer reverse():将当前字符序列反转
6、public int indexOf(String str)
7、public String subString(int start, int end)
8、public int length()
9、public char charAt(int n)
10、public void setCharAt(int n, char ch)

总结:
增:append
删:delete
改:setCharAt、replace
查:charAt
插:insert
遍历:for+charAt

String、StringBuffer、StringBuilder的效率从高到低排列

StringBuilder > StringBuffer > String

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

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

相关文章

如何将NACOS作为配置中心

新建一个命名空间 点击创建配置 关键点1:Data ID的命名规则: 前面我们演示了在 nacos 控制台新建一个 DataID 为 cloud-producer-server-dev.yaml 的数据集,那么这个 Data ID 是什么呢?Data ID 是配置集的唯一标识,一个…

CSS初级教程(字体)【第七天】

文章目录【1】CSS 字体【2】CSS 字体样式【3】CSS 字体大小【4】CSS 谷歌字体【5】CSS 字体属性【6】所有 CSS 字体属性CSS上回学习链接 CSS初级教程 颜色【第一天】 CSS初级教程 背景【第二天】 CSS初级教程 边框【第三天】 CSS初级教程 边距、高度、宽度【第四天】 CSS初级教…

ChatGPT的注册和使用教程

1 简介在时下热门话题AI作画之外,最近一个名叫ChatGPT的聊天机器人又掀起了一股人工智能的热潮。已有无数人投入到对它的测试研究之中,想探清它到底无所不能到何种地步。据悉,已有超过百万人与机器人聊天,甚至导致网站一度崩溃。那…

URDF与RVIZ

#来自赵虚左的资料&#xff0c;视频 创建功能包urdf01_rviz&#xff0c;依赖rviz xacro(比较简单使用) <launch> <!-- 设置参数 --> <param name"robot_description" textfile"$(find urdf01_rviz)/urdf/urdf/demo01_helloworld.urdf"…

Docker软件安装文档

软件安装文档 文章目录软件安装文档虚拟机安装系统死锁问题JDK11安装Docker安装Docker-Compose安装MySQL安装MySQL8安装Docker-Compose安装MySQL8MySQL5.7安装Nacos安装Docker安装Nacos单机Docker-Compose安装Nacos集群OpenResty安装Redis安装Docker安装单机RedisDocker-Compos…

【Unity3D】点选物体、框选物体、绘制外边框

1 需求描述 点选物体&#xff1a;点击物体&#xff0c;可以选中物体&#xff0c;按住 Ctrl 追加选中&#xff0c;选中的物体设置为红色。框选物体&#xff1a;拖拽鼠标&#xff0c;屏幕上会出现滑动框&#xff0c;滑动框内的物体会被选中&#xff0c;选中的物体设置为红色。绘…

Vue中自定义指令是什么?有哪些应用场景?

一、什么是指令 开始之前先学习一下指令系统这个词 指令系统是计算机硬件的语言系统&#xff0c;也叫机器语言&#xff0c;它是系统程序员看到的计算机的主要属性。因此指令系统表征了计算机的基本功能决定了机器所要求的能力 在vue中提供了一套为数据驱动视图更为方便的操作&…

【C语言进阶】qsort函数详解以及它的模拟实现

目录一、qsort函数介绍二、qsort函数参数介绍2.1&#xff1a;void* base2.2&#xff1a;size_t num2.3&#xff1a;size_t size2.4&#xff1a;int(* compar)(const void *,const void *)三、实际应用3.1&#xff1a;利用qsort函数对整型数组排序3.2&#xff1a;利用qsort函数对…

2023年1月9日:fastadmin在列表操作列区域添加按钮及控制已有按钮显示

列表操作列区域添加按钮 buttons: [{name: detail,title: __(详情),classname: btn btn-xs btn-primary btn-dialog,icon: fa fa-list,url: audit/detail,callback: function (data) {Layer.alert("接收到回传数据&#xff1a;" JSON.stringify(data), {title: &q…

【nvivo11plus教程】01_nvivo介绍、案例与批注

1、查看nvivo版本2、nvivo是如何支持质性研究的3、nvivo的项目介绍4、建立nvivo项目(1)建立项目(2)文件夹(3)新建分类(4)建立备忘录5、案例(1)建立案例(2)案例节点分类的变量设置(3)归类案例6、批注7、备忘录链接1、查看nvivo版本 2、nvivo是如何支持质性研究的 是一个迭代的过…

MATLAB算法实战应用案例精讲-【数据分析】时许异常检测

前言 时间序列异常检测的目的就是在时间序列中寻找不符合常见规律的异常点,无论是在学术界还是工业界这都是一个非常重要的问题。企业的运维场景中有海量的运维指标数据,如果单纯依靠人力来发现并定位异常,将是十分低效的,所以如果可以开发一个智能运维系统对于异常波动自…

MAC地址

目录MAC地址广播信道的数据链路层必须使用地址&#xff08;MAC&#xff09;IEEE 802局域网的MAC地址格式IEEE 802局域网的MAC地址发送顺序单播MAC地址举例广播MAC地址举例多播MAC地址举例MAC地址 使用点对点信道的数据链路层不需要使用地址使用广播信道的数据链路层必须使用地址…

加解密与HTTPS(6)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;随着成本的下降&#xff0c;主流网站都已经开始使用HTTPS了。但有了可信机构颁发的证书&#xff0c;网站就真的绝对安全了吗&#xff1f;以之前出现过的上大学被冒…

多任务系统概述

一个例子&#xff1a; int Main(void) { TargetInit(); //初始化目标板OSInit(); //初始化操作系统 OSTaskCreate(Task0,&StackTask0[StackSizeTask0 - 1],PrioTask0); // 创建一个任务Uart_Printf("Ready to start OS\n"); OSStart(); //运行操作系统return 0…

AtCoder Beginner Contest 284(A~E)

比赛名称&#xff1a;AtCoder Beginner Contest 284 比赛链接&#xff1a;AtCoder Beginner Contest 284 A - Sequence of Strings 输入若干字符串&#xff0c;再把这些字符串按输入顺序倒序输出 #include <bits/stdc.h> using namespace std; signed main() {ios::sy…

年终盘点(二)丨2022计讯物联荣誉资质大盘点

峥嵘岁月&#xff0c;奋力前行。2022年&#xff0c;计讯物联积极发扬实干精神&#xff0c;聚力做强做精做专物联网产业&#xff0c;全面助力数字化转型升级&#xff0c;以硬核的实力揽获多项殊荣。 每一项荣誉的背后是计讯领导的的正确指导与全力支持&#xff0c;更是全体计讯人…

综合项目 旅游网【2. 优化servlet】没有指定的js文件读不到文件 错误

优化servlet目的减少Servlet的数量&#xff0c;现在是一个功能一个Servlet&#xff0c;将其优化为一个模块一个Servlet&#xff0c;相当于在数据库中一张表对应一个Servlet&#xff0c;在Servlet中提供不同的方法&#xff0c;完成用户的请求。如何解决测试时控制台中文乱码&…

VS2019+Opencv3.4+Win10配置详解

一.下载opencv 官网&#xff1a;Releases - OpenCV 不同版本vs对应不同版本的opencv,其中高版本vs可以配置低版本vc&#xff0c;低版本不能配置高版本vc。 windows系统直接下载Windows版本就可以&#xff08;下载的文件是一个exe文件&#xff0c;运行相当于解压缩&#xff0…

1143汉诺塔

题目描述汉诺塔问题是这样的&#xff1a;有3根柱子A,B,C&#xff0c;其中A柱上有64个盘子&#xff0c;盘子大小不等&#xff0c;大的在下&#xff0c;小的在上。要求把这64个盘子从A柱移到C柱上&#xff0c;在移动过程中可以借助B柱&#xff0c;每次只允许移动一个盘子&#xf…

什么是 Java 泛型?怎样使用 Java 泛型?

目录 1、为什么使用泛型&#xff1f; 2、什么是泛型类&#xff1f;如何定义一个泛型类&#xff1f; 泛型的命名约定 3、什么是泛型方法&#xff1f;如何定义一个泛型方法&#xff1f; 4、什么是有界类型参数&#xff1f;如何定义有界类型参数&#xff1f; &#xff08;1&…