认识String类

认识String类

前面我们学习了类和对象,这一小节咱们来谈String类


目录

  • 认识String类
  • 前言
  • 一、String类的创建方式
  • 二、String引用类型的特点及方法
    • 1.存储内容
    • 2.String对象的比较
    • 3.字符串查找
    • 在这里插入图片描述
    • 4.转换
    • (一)数字转为为字符串
    • (二)字符串转化为数字
    • (三)大小写转换
    • 5.替换、拆分和截取
    • (一)替换:replace/replaceAll 和 replaceFirst
    • (二)拆分:spilt
    • (三)截取:subString
  • 三、字符串的不可变性
  • 四、StringBuilder 和 StringJoiner
  • 总结


前言

在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类。


提示:以下是本篇文章正文内容,下面案例可供参考

一、String类的创建方式

1.直接赋值法

	String str1 = "abc";

2.new一个对象

//	空参构造 str3引用了一个空白字符String str3 = new String();	
//	有参构造 String str2 = new String("Hello world");

这种创建方式类似与之前学的类中的构造方法

3.字符数组构造字符串

	char[] arr = {'a','b','c','d'};String ret = new String(arr);

二、String引用类型的特点及方法

1.存储内容

代码如下(示例):

  public static void main(String[] args) {//直接赋值法String s1 = "abc";String s2 = "abc";System.out.println(s1 == s2);//new 创建一个对象String s3 = new String("abc");String s4 = new String("abc");System.out.println(s3 == s4);}

运行结果为
在这里插入图片描述
为什么是这个结果?
下面我们看内存图
在这里插入图片描述
原因是 先直接复值定义了s1这个字符串,编译器会在串池里面找是否存在这个字符串的内容 不存在就在串池里面放上这个字符串的内容 并且把这个地址分配给栈区的变量s1,同理 s2 的内容与s1相同就直接把这个地址给到s2

在引用数据类型中
栈内存区里面存的是方法名 和局部变量及其内容的地址
而在堆内存区中存的是 new出来的对象 和 串池

串池里面存储的内容是直接赋值的字符串也叫常量字符串,这个里面的内容不可更改!
总的就是
在这里插入图片描述
下面是new出来的对象
在这里插入图片描述
new出来的是一个新对象 s1和s2 里面存的是地址
看图即可
在这里插入图片描述
在这里插入图片描述

2.String对象的比较

1. ==比较是否引用同一个对象

注意:对于内置类型,== 比较的是变量中的值;对于引用类型 ==比较的是引用中的地址。
基本类型

int a = 10;
int b = 20;
int c = 10;
// 对于基本类型变量,==比较两个变量中存储的值是否相同
System.out.println(a == b); // false
System.out.println(a == c); // true

引用类型

// 对于引用类型变量,==比较两个引用变量引用的是否为同一个对象
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = new String("world");
String s4 = s1;
System.out.println(s1 == s2); // false
System.out.println(s2 == s3); // false
System.out.println(s1 == s4); // true

2. boolean equals(Object anObject) 方法:按照字典序比较

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

public static void main(String[] args) {
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = new String("Hello");
// s1、s2、s3引用的是三个不同对象,因此==比较结果全部为false
System.out.println(s1 == s2); // false
System.out.println(s1 == s3); // false
// equals比较:String对象中的逐个字符
// 虽然s1与s2引用的不是同一个对象,但是两个对象中放置的内容相同,因此输出true
// s1与s3引用的不是同一个对象,而且两个对象中内容也不同,因此输出false
System.out.println(s1.equals(s2)); // true
System.out.println(s1.equals(s3)); // false

3. int compareTo(String s) 方法: 按照字典序进行比较
与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:

  1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
  2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("ac");
String s3 = new String("abc");
String s4 = new String("abcdef");
System.out.println(s1.compareTo(s2)); // 不同输出字符差值-1
System.out.println(s1.compareTo(s3)); // 相同输出 0
System.out.println(s1.compareTo(s4)); // 前k个字符完全相同,输出长度差值 -3
}

4. int compareToIgnoreCase(String str) 方法
与compareTo方式相同,但是忽略大小写比较

public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("ac");
String s3 = new String("ABc");
String s4 = new String("abcdef");
System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1
System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0
System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同,输出长度差值 -3
}

3.字符串查找

在这里插入图片描述

这些方法不需要记忆,需要用到死自行查找即可
=========下面我们将来演示部分代码,便于记忆

1. charAt 用于遍历字符串 获取其中每一个字符,返回值为 char
2. indexof用于查找字符串中的某一个字符所在的索引(字符数组下标)返回值为 int
传两个参表示从某个范围开始依次寻找,还可以传进一个字符串

  public static void main(String[] args) {String s = "abcdefacefg";System.out.println(s.charAt(4));// eSystem.out.println(s.indexOf('c'));//2System.out.println(s.indexOf('c',5));//7System.out.println(s.indexOf("def"));//3}

4.转换

(一)数字转为为字符串

方法:String.valueOf(基本类型数据);

  		int n = 123;double d = 12.34;boolean flag = true;String s1 = String.valueOf(n);String s2 = String.valueOf(d);String s3 = String.valueOf(flag);System.out.println(s1);System.out.println(s2);System.out.println(s3);

此时s1,s2,s3 中存储的就是字符串;

(二)字符串转化为数字

包装类型.parse+对应的类型(“字符串”)
parse 的中文意思是解析

int data1 = Integer.parseInt("1234");
double data2 = Double.parseDouble("12.34");
System.out.println(data1);
System.out.println(data2);

其中Integer 是int的包装 是引用类型 ,Double是double的包装 是引用类型

(三)大小写转换

方法:toUpperCase and toLowerCase

public static void main(String[] args) {
String s1 = "hello";
String s2 = "HELLO";小写转大写
System.out.println(s1.toUpperCase());
大写转小写
System.out.println(s2.toLowerCase());
}

当然还有更多其他转换 请大家自己总结~~!

5.替换、拆分和截取

(一)替换:replace/replaceAll 和 replaceFirst

		String s1 = "aabbccbbeeff";String s2 = s1.replace("b","g");String s3 = s1.replaceFirst("b","g");把字符串中的某个字符所有变成另一个字符System.out.println(s2);结果为 aaggccggeeff把字符串中的某个字符出现的第一次字符变成另一个字符System.out.println(s2);结果为 aagbccbbeeff

注意:这里返回的是一个新的字符串,s1不变

(二)拆分:spilt

String str = "hello world hello world" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
System.out.println(s);
}

运行结果:
在这里插入图片描述
拆分还可以构成重载 以下表示以“ ”的分割 分成两组

String str = "hello world hello world" ;
String[] result = str.split(" ",2) ;
for(String s: result) {
System.out.println(s);
}

注意这里返回的是字符串数组,拆分方法根据实际需求区实现不同方法

(三)截取:subString

String str = "helloworld" ;
System.out.println(str.substring(5));//从指定索引截取到结尾
System.out.println(str.substring(0, 5));//截取部分内容

运行结果:
在这里插入图片描述

  1. 索引从0开始
  2. 注意前闭后开区间的写法, substring(0, 5) 表示 左闭右开 的规则

三、字符串的不可变性

String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,是因为:
1. String类在设计时就是不可改变的,String类实现描述中已经说明了
在这里插入图片描述
String类中的字符实际保存在内部维护的value字符数组中,该图还可以看出:

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

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

为什么 String 要设计成不可变的?(不可变对象的好处是什么?)

  1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑写时拷贝的问题了.
  2. 不可变对象是线程安全的.
  3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中

四、StringBuilder 和 StringJoiner

两者可以看成是一个容器,创建之后里面的内容是可变的
因此实现拼接的效率逼string高,从而提高了字符串的效率
在这里插入图片描述StringBuilder的构造方法

在这里插入图片描述

StringBuilder sb1 = new StringBuilder(); 
StringBuilder sb2 = new StringBuilder("abc");

StringBuilder和StringJoiner的常用方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

提示:这里对文章进行总结:

  1. String
    表示字符串的类,定义了很多操作字符串的方法

  2. StringBuilder
    一个可变的操作字符串的容器。
    可以高效的拼接字符串,还可以将容器里面的内容进行反转。

  3. StringJoiner
    JDK8出现的一个可变的操作字符串的容器,可以高效,方便的拼接字符串。
    在这里插入图片描述

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

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

相关文章

阿里云原生:如何熟悉一个系统

原文地址:https://mp.weixin.qq.com/s/J8eK-qRMkmHEQZ_dVts9aQ?poc_tokenHMA-_mWjfcDmGVW6hXX1xEDDvuJPE3pL9-8uSlyY 导读:本文总结了熟悉系统主要分三部分:业务学习、技术学习、实战。每部分会梳理一些在学习过程中需要解答的问题,这些问题…

集成学习 | 集成学习思想:Stacking思想

目录 一. Stacking 思想 一. Stacking 思想 Stacking(或stacked generalization),是指训练一个模型用于组合(combine)其他各个模型 Stacking有两层第一层是不同的基学习器(classifiers/regressors)第二层是用于组合基学习器的元学习&#xf…

Reactor Netty

在springframework 里面,我们只有connection id。但是在底层的reactor netty,我们除了connection id还有local address and remote address HTTP/1 HTTP/2

Qt creator构建DLL库

文章目录 一、构建DLL库二、隐式调用DLL库 一、构建DLL库 Qt creator创建DLL项目。 实现功能函数。 运行代码,debug目录下会有.dll和.lib文件。 二、隐式调用DLL库 QT新建控制台项目。将.lib文件和与之关联的头文件赋值到项目文件夹。 3. 添加头文件和外部依赖库…

GuLi商城-商品服务-API-三级分类-网关统一配置跨域

参考文档: https://tangzhi.blog.csdn.net/article/details/126754515 https://github.com/OYCodeSite/gulimall-learning/blob/master/docs/%E8%B0%B7%E7%B2%92%E5%95%86%E5%9F%8E%E2%80%94%E5%88%86%E5%B8%83%E5%BC%8F%E5%9F%BA%E7%A1%80.md 谷粒商城-day04-完…

[数据结构初阶]二叉树

各位读者老爷好,鼠鼠我现在浅浅介绍一些关于二叉树的知识点,在各位老爷茶余饭后的闲暇时光不妨看看,鼠鼠很希望得到各位老爷的指正捏! 开始介绍之前,给各位老爷看一张风景照,有读者老爷知道在哪里吗&#x…

003- AutoCoder 使用Web版大模型,性感的Human As Model 模式

这是下面这篇文章的继续。 002- 用 AutoCoder 添加和修改代码 前面我们提到,如何解决你没有API版大模型,或者你的API版大模型太弱,而你只有Web版本的诸如 Kimi/GPT4 的情况下,改如何让AutoCoder帮助你完成编程? 我们有…

Excel数字乱码怎么回事 Excel数字乱码怎么调回来

在日常工作中,Excel是我们最常使用的数据处理软件之一,它强大的功能使得数据处理变得既简单又高效。然而,用户在使用Excel时偶尔会遇到数字显示为乱码的问题,这不仅影响了数据的阅读,也大大降低了工作效率。那么&#…

会员中心微服务

文章目录 1.环境配置1.创建会员中心模块2.检查父子模块的pom.xml1.父模块注意:如果父模块中的依赖显示not found,原因是子模块并没有引用,不用在意 2.子模块 3.pom.xml 引入相关依赖(别忘记刷新maven)4.application.ym…

【Node.js】全局变量和全局 API

node 环境中没有 dom 和 bom ,此外 es 基本上都是可以正常使用的。 如果一定要使用 dom 和bom,可以借助第三方库 jsdom 帮助我们实现操作。npm i jsdom 实例: const fs require(node:fs) const {JSDOM} require(jsdom)const dom new JS…

scrapy爬虫框架

scrapy爬虫框架 一、scrapy的概念作用和工作流程1、scrapy的概念2、scrapy框架的作用3、scrapy的工作流程(重点)3.1 回顾之前的爬虫流程3.2 改写上述流程3.3 scrapy的流程3.4 scrapy的三个内置对象3.5 scrapy中每个模块的具体作用 二、scrapy的入门使用1…

Spring Boot1

SpringBoot概述 Spring Boot是Spring提供的一个子项目,用于快速构建Spring应用程序 SpringBoot特性 起步依赖 本质上就是一个Maven坐标,整合了完成一个功能所需要的所有坐标 自动配置 遵循约定大于配置的原则,再boot程序启动后&#xff0…

学习Python的第一天(下载Python环境和工具Pycharm)

下载工具 PyCharm Community Edition 2023.3.4 下载环境 Python3.10.4 目录 1.环境Python下载 1.1 Python环境变量下载网址: 1.2 下载步骤 2.工具Pycharm下载 2.1 pycharm下载网址 2.2 pycharm下载步骤 1.环境Python下载 1.1 Python环境变量下载网址: Python Releas…

C# WPF编程-控件

C# WPF编程-控件 概述WPF控件类别包括以下控件:背景画刷和前景画刷字体文本装饰和排版字体继承字体替换字体嵌入文本格式化模式鼠标光标 内容控件Label(标签)Button(按钮) 概述 在WPF领域,控件通常被描述为…

java常用编程算法——方法递归概述及猴子吃桃案例

前言: 接触到了递归算法,整理下笔记。打好基础,daydayup! 方法递归 方法调用自身的形式称为方法递归,是编程时常用的一种算法 递归的形式 递归有两种情况:1,直接递归;2,间接递归&…

阿里CICD流水线Docker部署,将阿里镜像私仓中的镜像部署到服务器中

文章目录 阿里CICD流水线Docker部署,将阿里镜像私仓中的镜像部署到服务器中一、CICD流水线的初步使用可以看我之前的两篇文章二、添加部署任务,进行Docker部署,创建一个阿里的试用主机1、选择主机部署,并添加服务主机2、创建免费体…

dash 初体验(拔草)

Dash简介 Dash 是一个高效简洁的 Python 框架,建立在 Flask、Poltly.js 以及 React.js 的基础上,设计之初是为了帮助前端知识匮乏的数据分析人员,以纯 Python 编程的方式快速开发出交互式的数据可视化 web 应用。 搭建环境 在学习 Dash 的…

Redis的String类型为什么重新设计使用了SDS数据结构呢

Redis 选择重新设计其 String 类型的底层数据结构,采用 SDS(Simple Dynamic String)而不是直接使用 C 语言标准库提供的原生字符串(char*)的原因主要包括以下几点: O(1) 时间复杂度获取长度: 在…

极简自建web视频会议,私有云,rtmp/rtsp/webrtc一键参会直播会议互动方案

随着视频互动深入工作日常,很多客户需要自建一个会议,监控的交互平台,目前外面不管是开源还是非开源的平台,都是极为复杂,一般linux安装库关联部署复杂,非技术人员根本没办法使用,不方便集成部署…

区块链技术下的新篇章:DAPP与消费增值的深度融合

随着区块链技术的持续演进,去中心化应用(DAPP)正逐渐受到人们的瞩目。DAPP,这种在分布式网络上运行的应用,以其去中心化、安全可靠、透明公开的特性,为用户提供了更为便捷和安全的消费体验。近年来&#xf…