深入理解【 String类】

目录

1、String类的重要性

2、常用方法 

2、1 字符串构造

2、2 String对象的比较

2、3 字符串查找 

 2、4字符转换

数值和字符串转换:

大小写转化:

 字符串转数组:

格式转化: 

2、5 字符串替换

2、6字符串拆分 

 2、7 字符串截取

3、String字符串的不可变性 

4、 认识StringBuffer和StringBuilder

4、1StringBuffer

4、2StringBuilder


1、String类的重要性

在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类
在开发和校招笔试中,字符串也是常客,而且在面试中也频繁被问到,比如:String、StringBuff和StringBulider之间的区别等。

2、常用方法 

2、1 字符串构造

String类提供的构造方法常用的是以下三种:

  1. 使用常量字符串构造
  2. 直接newString类对象
  3. 使用字符数组进行构造
public class Test {public static void main(String[] args) {//1、使用常量字符串构造String str1="Hello";//2、直接newString类对象String str2=new String("Hello");//3、使用字符数组进行构造char[] array={'H','e','l','l','o'};String str3=new String(array);}
}

【注意】

1、String类是引用类型,内部并不储存字符串本身

2、Java中""引起来的也是String类对象

2、2 String对象的比较

1、==比较是否为同一个对象

对于内置类型,==是比较变量的值,而引用类型==比较的是引用中的地址。

String str1="Hello";
String str2=new String("Hello");
System.out.println(str1==str2);//结果为false

2、boolean equals(Obeject anObeject)方法,比较内容是否相同

String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,按照如下规则进行比较,比如:str1.equals(str2)

String str1="Hello";
String str2=new String("Hello");
String str3="world";
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//false

3、int compareTo(String s)方法:按照字典序比较

与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:

  1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
  2. 如果前K个字符相等,返回两串字符串长度差值

4、int compareTolgnoreCase(String str)方法:与compareTo方法相同,但忽略大小写比较

String str1="abc";
String str2=new String("ABC");
String str3="Abdef";
System.out.println(str1.compareToIgnoreCase(str2));//0
System.out.println(str1.compareToIgnoreCase(str3));//-1
System.out.println(str2.compareToIgnoreCase(str3));//-1

2、3 字符串查找 

字符串查找方法
方法功能
char charAt(int index)

返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException异常

int indexOf(int ch)返回ch第一次出现的位置,没有返回-1

int indexOf(int ch, int fromIndex)

从fromIndex位置开始找ch第一次出现的位置,没有返回-1

int indexOf(String str) 返回str第一次出现的位置,没有返回-1
int indexOf(String str, int fromIndex)

从fromIndex位置开始找str第一次出现的位置,

没有返回-1

int lastIndexOf(int ch) 从后往前找,返回ch第一次出现的位置,没有返回-1
int lastIndexOf(int ch, int fromIndex)

从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1

int lastIndexOf(String str)从后往前找,返回str第一次出现的位置,没有返回-1
int lastIndexOf(String str, int fromIndex

从fromIndex位置开始找,从后往前找str第一次出现的位置,

没有返回-1

String str1="Hello,world,Hello";//长度为17System.out.println(str1.charAt(6));//w
System.out.println(str1.indexOf('o'));//4
System.out.println(str1.indexOf('l',8));//9
System.out.println(str1.indexOf("Hello"));//0
System.out.println(str1.indexOf("Hello",0));//0
System.out.println(str1.lastIndexOf('l'));//15
System.out.println(str1.lastIndexOf('l',16));//15
System.out.println(str1.lastIndexOf("Hello"));//12
System.out.println(str1.lastIndexOf("Hello",10));//0

上述方法都是实例方法 

 2、4字符转换

数值和字符串转换:

  • valueOf用于将其他形式转化为字符串,有许多重载方法。

代码演示: 

public class Student {String name;int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
public class Test {public static void main(String[] args) {String str1=String.valueOf(123);String str2=String.valueOf(true);String str3=String.valueOf(new Student("lisi",18));System.out.println(str1);//123System.out.println(str2);//trueSystem.out.println(str3);//Student{name='lisi', age=18}}
}

大小写转化:

  • 大写转小写toLowerCase()
  • 小写转大写toUpperCase()
String str1="Hello";
String str2="World";
//小写转大写
System.out.println(str1.toUpperCase());//HELLO
//大写转小写
System.out.println(str2.toLowerCase());// world

 字符串转数组:

  • toCharArray()
String str1="Hello";
char[]array = str1.toCharArray();for (int i = 0; i < array.length; i++) {System.out.println(array[i]);}

格式转化: 

  • format
String s=String.format("%d-%d-%d",2024,7,5);
System.out.println(s);//2024-7-5

2、5 字符串替换

使用一个指定的新的字符串替换已有的字符串数,可用方法如下:

方法功能
String replaceAll(String regex, String replacement) 替换所有的指定内容
String replaceFirst(String regex, String replacement) 替换收个内容方法

代码示例: 

String str1="Helloworld";System.out.println(str1.replace("H","h"));
System.out.println(str1.replaceFirst("l","L"));

【注意】由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串.

2、6字符串拆分 

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
可用方法如下:

方法功能
String[] split(String regex)将字符串全部拆分
String[] split(String regex,int limit)将字符串以定义的格式,拆分为limit组

代码实例:

 【注意】

有些特殊字符作为分隔符无法正确切分,需要加上转义。

  1. " | "、" * "、 "+"都得加上转义字符,前面加上"\\"
  2. " \ "前面要加上" \\\\"
  3. 如果有多个分隔符,用" | "作为连字符

 2、7 字符串截取

 从一个完整的字符串之中截取部分内容,可用方法

方法功能
String substring ( int beginindex )从指定索引截取到结尾
String substring(int bwginindex ,int endindex )截取部分内容

【注意】

  1. 索引从0开始
  2. 注意前闭后开的用法 substring(  ,  】

3、String字符串的不可变性 

String类是一种不可变对象,字符串中内容是不可改变的。这是因为

1、String类在设计时就是不可改变的

String类中的字符实际保存在内部维护的value字符数组中,该图还可以看出:

  1. String类被final修饰,表明该类不能被继承
  2.  value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。

2. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象 

” 字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。”
这种说法是错误的,不是因为String类自身,或者其内部value被final修饰而不能被修改。
final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的。

4、 认识StringBuffer和StringBuilder

4、1StringBuffer

StringBuffer类是Java提供的一个可变字符串序列类,在java.lang包中定义。它与String类相似,但有一个重要的区别:String类是不可变的,即创建后不能更改其内容,而StringBuffer类则可以在原地修改字符串。
需要注意的是,由于StringBuffer是为了线程安全而设计的。在多线程环境下,建议使用线程安全的StringBuffer类,以确保数据的一致性。

4、2StringBuilder

StringBuilder类是Java提供的一个可变字符串序列类,与StringBuffer类类似,但不同的是StringBuilder不是线程安全的。StringBuilder类位于java.lang包中。

以下是StringBuilder类的一些重要特性:
单线程环境下,通过使用StringBuilder类,我们可以方便地进行字符串的动态操作和修改,并能够高效地处理字符串操作的需求

面试题:String、StringBuffer和StringBuilder的异同?

相同点:底层都是通过char数组实现的
不同点:

String对象一旦创建,其值是不能修改的,如果要修改,会重新开辟内存空间来存储修改之后的对象;而StringBuffer和StringBuilder对象的值是可以被修改的;

StringBuffer几乎所有的方法都使用synchronized实现了同步,线程比较安全,在多线程系统中可以保证数据同步,但是效率比较低而StringBuilder 没有实现同步,线程不安全,建议在单线程中使用 StringBuilder,效率比较高。

如果我们在实际开发过程中需要对字符串进行频繁的修改,不要使用String,否则会造成内存空间的浪费;当需要考虑线程安全的场景下使用 StringBuffer,如果不需要考虑线程安全,追求效率的场景下可以使用 StringBuilder。

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

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

相关文章

vue项目创建+eslint+Prettier+git提交规范(commitizen+hooks+husk)

# 步骤 1、使用 vue-cli 创建项目 这一小节我们需要创建一个 vue3 的项目&#xff0c;而创建项目的方式依然是通过 vue-cli 进行创建。 不过这里有一点大家需要注意&#xff0c;因为我们需要使用最新的模板&#xff0c;所以请保证你的 vue-cli 的版本在 4.5.13 以上&#xff…

ELK日志系统和Filebeat采集器的学习总结

ELK是ElasticSerach、Logstash、Kina Logstash负责采集数据&#xff0c;Logstash有三个插件&#xff0c;input、filter、output&#xff0c;filter插件作用是对采集的数据进行处理&#xff0c;过滤的&#xff0c;因此filter插件可以选&#xff0c;可以不用配置。 ElasticSear…

Android super.img结构及解包和重新组包

Android super.img结构及解包和重新组包 从Android10版本开始&#xff0c;Android系统使用动态分区&#xff0c;system、vendor、 odm等都包含在super.img里面&#xff0c;编译后的最终镜像不再有这些单独的 image&#xff0c;取而代之的是一个总的 super.img. 1. 基础知识 …

npm安装依赖报错——npm ERR gyp verb cli的解决方法

1. 问题描述 1.1 npm安装依赖报错——npm ERR! gyp verb cli npm MARN deprecated axiosQ0.18.1: critical security vuLnerability fixed in v0.21.1. For more information, npm WARN deprecated svg001.3.2: This SVGO version is no Longer supported. upgrade to v2.x.x …

第二节:如何使用thymeleaf渲染html(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;今天来学习如何使用thymeleaf渲染html。该模板运用不广泛&#xff0c;所以本节内容了解既可。 第一步&#xff1a;创建html文件。 在模板templates目录下创建一个html文件。 编写代码如下&#xff1a; <!DOCTYPE html> <…

雷电模拟器报错remount of the / superblock failed: Permission denied remount failed

报错截图 解决方法 打开设置 设置配置system.vmdk可写入 解决

【MySQL】mysql访问

mysql访问 1.引入MySQL 客户端库2.C/C 进行增删改3.查询的处理细节4.图形化界面访问数据库4.1下载MYSQL Workbench4.2MYSQL Workbench远程连接数据库 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&a…

在Apache HTTP服务器上配置 TLS加密

安装mod_ssl软件包 [rootlocalhost conf.d]# dnf install mod_ssl -y此时查看监听端口多了一个443端口 自己构造证书 [rootlocalhost conf.d]# cd /etc/pki/tls/certs/ [rootlocalhost certs]# openssl genrsa > jiami.key [rootlocalhost certs]# openssl req -utf8 -n…

【C++】哈希表 ---开散列版本的实现

你很自由 充满了无限可能 这是很棒的事 我衷心祈祷你可以相信自己 无悔地燃烧自己的人生 -- 东野圭吾 《解忧杂货店》 开散列版本的实现 1 前言2 开散列版本的实现2.1 节点设计2.2 框架搭建2.3 插入函数2.4 删除函数2.5 查找操作2.6 测试 Thanks♪(&#xff65;ω&#x…

也说字母U:房子到底是什么?

​ 不记得是第几期了&#xff0c;湖南卫视有档很火的音乐节目叫《歌手》&#xff0c;那一期是最终是韩磊夺得了冠军&#xff0c;他有一杀手锏&#xff0c;叫《向天再借五百年》&#xff0c;他要不夺冠&#xff0c;好像大家也对不起对这首歌的印象&#xff0c;因为他是多少人的记…

创建本地仓库

一、新建挂载目录 二、将挂载本地镜像挂载到目录 三、配置yum仓库 一、新建挂载目录 mkdir /BenDiCangKu 二、将挂载本地镜像挂载到目录 1、先连接本地光盘 2、挂载光盘 mount /dev/sr0 /BenDiCangKu 3、查看挂载 由此可见挂载成功 三、配置yum仓库 1、新建yum仓库文件…

HumbleBundle7月虚幻捆绑包30件军事题材美术模型沙漠自然环境大逃杀模块化建筑可定制武器包二战现代坦克飞机道具丧尸士兵角色模型20240705

HumbleBundle7月虚幻捆绑包30件军事题材美术模型沙漠自然环境大逃杀模块化建筑可定制武器包二战现代坦克飞机道具丧尸士兵角色模型202407051607 这次HumbleBundle捆绑包是UE虚幻军事题材的&#xff0c;内容非常多。 有军事基地、赛博朋克街区、灌木丛景观环境等 HB捆绑包虚幻…

相关技术 太阳能热水器循环水泵制作技术

网盘 https://pan.baidu.com/s/1oAKwUEGkKnEgxE-F4znKow?pwdidxd 双温区蓄能供热型太阳能热水系统及其工作方法.pdf 双罐叠压节能恒温型太阳能热水机组.pdf 基于傅科电流的循环式风能热水器.pdf 基于太阳能利用的建筑冷热电联产系统及工作方法.pdf 基于太阳能和热泵的双蓄式热…

护航端侧大模型平稳健康发展,百度大模型内容安全Lite版正式发布

6月28日&#xff0c;WAVE SUMMIT深度学习开发者大会 2024 “智变应用、码动产业”平行论坛在北京召开。与会&#xff0c;百度大模型内容安全Lite版正式发布&#xff0c;可面向低算力和超低算力的终端大模型提供离线场景下的一站式安全解决方案&#xff0c;为各类终端大模型平稳…

AI大模型对话(上下文)缓存能力

互联网应用中&#xff0c;为了提高数据获取的即时性&#xff0c;产生了各种分布式缓存组件&#xff0c;比如Redis、Memcached等等。 大模型时代&#xff0c;除非是免费模型&#xff0c;否则每次对话都会花费金钱来进行对话&#xff0c;对话是不是也可以参照缓存的做法来提高命…

QT C++(QT控件 QLabel,QLCDNumber,QProgressBar,QCalendarWidget)

文章目录 1. QLabel2. QLCDNumber3. QProgressBar4. QCalendarWidget 1. QLabel QLabel常见属性&#xff1a; text&#xff1a;QLabel中的文本textFormat&#xff1a;文本中的格式 Qt::PlainText:纯文本Qt::RichText:富文本&#xff0c;支持html标签Qt::MarkdownText markdow…

文件打开的系统错误分析流程

当用户出现“Open file failed”错误时&#xff0c;手动产生dump文件。 &#xff08;1&#xff09;打开资源管理器&#xff0c;选择AppNameXXX.exe进程&#xff0c;右击鼠标选择“创建转储文件” (2) 生成转储文件 3.获取用户转储文件 4.用Visual studio2015打开dump文件分析…

基于Oauth2.0的OpenFeign远程调用

目录 前言 1.引入openfeign相关依赖 2.开启openFeign远程调用&#xff0c;在启动类头加上注解即可 3. 提供远程调用接口&#xff0c;接口名称必须与controler名称保持一致 4.远程调用关键代码 4.1 注入restTemplate 4.2 配置拦截器 4.3 设置请求头 4.4 获取请求结果 4.5 远…

Hadoop3:Yarn的Tool接口案例

一、需求 依然以wordcount案例为基础&#xff0c;进行开发 我们知道&#xff0c;用hadoop自带的example.jar执行wordcount 命令如下 hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount -D mapreduce.job.queuename…

vue3 滚动条滑动到元素位置时,元素加载

水个文 效果 要实现的思路就是&#xff0c;使用IntersectionObserver 检测元素是否在视口中显示&#xff0c;然后在通过css来进行动画载入。 1.监控元素是否视口中显示 const observer new IntersectionObserver((entries) > {entries.forEach((entry) > {if (entry.i…