【Java SE】带你在String类世界中遨游!!!

在这里插入图片描述
🌹🌹🌹我的主页🌹🌹🌹
🌹🌹🌹【Java SE 专栏】🌹🌹🌹
🌹🌹🌹上一篇文章:带你走近Java的抽象类与接口🌹🌹🌹

文章目录

  • 1. String类的重要性
    • 2. String类常用方法
    • 2.1 字符串构造
    • 2.2 String对象的比较
    • 2.3 字符串查找
    • 2.4 转化
    • 2.5 字符串替换
    • 2.6 字符串拆分
    • 2.7 字符串截取
    • 2.8 字符串的不可变性
    • 2.11 字符串修改
      • 3.StringBuilder和StringBuffer
    • 3.1 StringBuilder的介绍

1. String类的重要性

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

2. String类常用方法

2.1 字符串构造

String类提供的构造方式非常多,常用的就以下三种:
1.使用常量串构造,也称字符串赋值

String str = "hello";

2.直接newString对象

 String str1 = new String("hello,world");

3.使用字符数组进行构造

char[] array = {'1','2','3','4'};
String str2 = new String(array);

将数组名作为形参传到String的构造函数之后,调用了数组的复制方法copyof,然后返回的类型是String类型。
在这里插入图片描述
【注意】

  1. String是引用类型,内部并不存储字符串本身,在String类的实现源码中,String类实例变量如下:
    在这里插入图片描述
    字符串中的内容实际存储在value[]数组当中。

字符串是引用类型,并不直接存储字符串的内容,而是存储的是引用变量的地址。
以下代码和画图演示可以证明:

 public static void main(String[] args) {My_String.fun();String str1 = new String("1234");String str2 = new String("12");String str3 = str1;System.out.println(str1.length());System.out.println(str3.isEmpty());}

str1的引用变量的地址赋值给了str3,此时的str3引用变量存储的是str1的地址,这样也可以通过str3引用变量来指向str1中的字符串的内容。
上述的打印结果分别是4,和false则可以证明这个结论。
在这里插入图片描述
结果显示,结论正确。
就接下来看看画图演示:
在这里插入图片描述
2. 在Java中“”引起来的也是String类型对象。

System.out.println(str1.length());System.out.println(str3.isEmpty());System.out.println("hello".length());

在这里插入图片描述

2.2 String对象的比较

字符串的比较是常见操作之一,比如:字符串排序。Java中总共提供了4中方式:

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

对于简单类型""是比较数值的大小,而对于引用类型“”是比较引用变量的地址。

  public static void main(String[] args) {//简单类型int a = 10;int b = 10;//引用类型String str1 = new String("abcdefg");String str2 = new String("abcdefg");//比较简单类型System.out.println(a == b);//true  false//比较引用类型System.out.println(str1 == str2);}}

在这里插入图片描述

结果显示:在基本类型中比较的是数值,而在引用类型当中比较的是地址。
2. boolean equals(Object anObject) 方法:按照字典序比较:
比较返回类型为boolean类型,相同则返回true不相同则返回false
字典序:字符大小的顺序,字符大小:字符返回的ASCII值。
String类重写了父类Object中equals方法,Object中equals默认按照==比较:

 public boolean equals(Object obj) {return (this == obj);}

因为object中equals默认按照==比较,所以我们要在String类中重写equals方法:

//在String中重写的equals方法:
public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}

接下来我们来通过str1.equals(str2)比较引用类型的内容:

public static void main(String[] args) {String str1 = new String("abcdefg");String str2 = new String("abcdefg");String str3 = new String("ABCDEFG");System.out.println(str1.equals(str2));System.out.println(str1.equals(str3));}

在这里插入图片描述
通过重写equals方法,我们就可以用字典序来比较字符串的大小了。
在比较字符串的大小的时候:
第一步:我们通过字典序来比较。
第二步:当字典序相同的时候,我们可以通过字符串的长度来比较。
3. int compareTo(String s) 方法: 按照字典序进行比较:
这个和equals不同的是,返回类型不是boolean类型而是int类型,比较方式:

  1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
  2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
 public static void main(String[] args) {String str1 = new String("abcdefg");String str2 = new String("abcdefg");String str3 = new String("ABCDEFG");System.out.println(str1.compareTo(str2));System.out.println(str1.compareTo(str3));}

在这里插入图片描述
4. int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较:

public static void main(String[] args) {String str1 = new String("abcdefg");String str2 = new String("abcdefg");String str3 = new String("ABCDEFG");String str4 = new String("zhangsan");System.out.println(str1.compareToIgnoreCase(str2));System.out.println(str1.compareToIgnoreCase(str3));System.out.println(str1.compareToIgnoreCase(str4));}

在这里插入图片描述

2.3 字符串查找

字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法:

  1. public char charAt(int index)从字符串中拿到一个字符。

在String类中的方法是这么实现的。
在这里插入图片描述
自己来实现一下这个方法:

public static void main(String[] args) {String str1 = new String("abcdef");char ch = str1.charAt(0);//'a'char ch1 = str1.charAt(1);//'b'char ch2 = str1.charAt(-1);//抛异常char ch3 = str1.charAt(6);//抛异常System.out.println(ch);System.out.println(ch1);System.out.println(ch2);System.out.println(ch3);}
  1. int indexOf(int ch) 返回字符的下标,找不到就返回-1,从头开始一个一个找。
    我们来实现一下这个方法:
public static void main(String[] args) {String str1 = new String("abcdef");System.out.println(str1.indexOf('a'));System.out.println(str1.indexOf('b'));System.out.println(str1.indexOf('z'));}

在这里插入图片描述
3. int indexOf(int ch, intfromIndex) 从指定位置开始找这个字符,找到返回下标,找不到就返回-1。
我们来实现这个方法:

 public static void main(String[] args) {String str = new String("hello");System.out.println(str.indexOf('l', 3));}

在这里插入图片描述
4. int indexOf(String str) 从头开始在字符串A找字符串B,找到了返回字符串A中字符串B的第一个下标,比如:字符串A"hello",字符串B"llo"则返回"llo"在字符串A的下标,找不到就返回-1.
我们来实现这个方法:|

 public static void main(String[] args) {String str = new String("hello");System.out.println(str.indexOf("llo"));System.out.println(str.indexOf("all"));}

在这里插入图片描述
5 . int indexOf(String str, intfromIndex) 在指定位置从字符串A中找字符串B,找到还是一样返回字符串A中字符串B的第一个下标。找不到返回-1.
我们来实现这个方法:

public static void main(String[] args) {String str = new String("hello");System.out.println(str.indexOf("llo", 2));System.out.println(str.indexOf("llo", 4));}

在这里插入图片描述
6. int lastIndexOf(int ch) 从字符串最后的位置找目标字符,找到就返回其下标,找不到就返回-1.
我们来实现这个方法:

 public static void main(String[] args) {String str = new String("hello");System.out.println(str.lastIndexOf('o'));System.out.println(str.lastIndexOf('a'));}

在这里插入图片描述
**【注意】**这个找到的下标还是从前往后数的下标,而不是从后往前数的。
7. int lastIndexOf(int ch, intfromIndex) 这个是从指定位置,往后找这个字符,找到返回其下标,找不到就返回-1.
我们来实现这个方法:

 public static void main(String[] args) {String str = new String("hello");System.out.println(str.lastIndexOf('l', 4));System.out.println(str.lastIndexOf('l', 1));

在这里插入图片描述
8. int lastIndexOf(String str) 从后往前在字符串A中找字符串B,找到了返回字符串A中字符串B的第一个下标,找不到就返回-1.
我们来实现这个方法:

 public static void main(String[] args) {String str = new String("hello");System.out.println(str.lastIndexOf("llo"));System.out.println(str.lastIndexOf("lle"));

在这里插入图片描述
9. int lastIndexOf(String str, intfromIndex) 从指定位置从后往前在字符串A中找字符串B,找到了返回字符串A中字符串B的第一个下标,找不到就返回-1.
我们来实现这个方法:

  public static void main(String[] args) {String str = new String("hello");System.out.println(str.lastIndexOf("llo", 4));System.out.println(str.lastIndexOf("llo", 1));

在这里插入图片描述

2.4 转化

1. 数值和字符串转化

public static void main(String[] args) {//数字转字符串String str = String.valueOf(123);System.out.println(str);//字符串转数字Integer ii = Integer.valueOf("123");System.out.println(ii);}

字符串转化其他类型,构成了一个重载方法:String.valueOf()
在这里插入图片描述
其他类型转化String类型:
Integer.valueOf()
Float.valueOF()

2. 大小写转换

public static void main(String[] args) {String str = new String("abc");String str1 = new String("ABC");//小写转化为大写System.out.println(str.toUpperCase());//大写转化小写System.out.println(str1.toLowerCase());}

在这里插入图片描述
3. 字符串转数组
字符串转化数组
toCharArray()

 public static void main(String[] args) {String str ="abc";char[] chars = str.toCharArray();System.out.println(Arrays.toString(chars));}

在这里插入图片描述
数组转化为字符串

 public static void main(String[] args) {char[] chars = {'1','2','3'};String str = new String(chars);System.out.println(str);}

4.格式化
String.format()

public static void main(String[] args) {String s = String.format("%d-%d-%d", 2019, 9,14);System.out.println(s);}

2.5 字符串替换

使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:
1.String replaceAll(String regex, String replacement) 替换所有指定的内容
String regex:被替换的内容
String replacement:替换的内容

public static void main(String[] args) {String str = "helloworld";System.out.println(str.replaceAll("l", "+"));}

2.String replaceFirst(String regex, String replacement) 替换首个内容
String regex:在被替换的内容中出现第一次的内容
String replacement:替换的内容

 public static void main(String[] args) {String str = "helloworld";System.out.println(str.replaceFirst("l", "+"));
}

在这里插入图片描述
注意事项: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串.

2.6 字符串拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
可用方法如下:
1.String[] split(String regex) 将字符串全部拆分,将字符串拆分,用字符串数组来接收。
String regex:以指定的格式拆分

public static void main(String[] args) {String str = "hello world java SE";String[] ret = str.split(" ");for (String s:ret) {System.out.println(s);}}

2.String[] split(String regex, int limit) 将字符串以指定的格式,拆分为limit组
String regex:以指定的格式拆分
int limit:拆分几组

public static void main(String[] args) {String str = "hello world java SE";String[] ret = str.split(" "2);for (String s:ret) {System.out.println(s);}}

注意事项:

  1. 字符"|“,”*“,”+"都得加上转义字符,前面加上 “\” .
  2. 而如果是 “” ,那么就得写成 “\\” .
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

2.7 字符串截取

从一个完整的字符串之中截取出部分内容。可用方法如下:
1.String substring(int beginIndex) 从指定位置截取到结尾
int beginIndex:指定位置

String str = "helloworld" ;
System.out.println(str.substring(5));

2.String substring(int beginIndex, int endIndex) 截取部分内容
int beginIndex:截取的开始位置
int endIndex: 截取的结束位置

String str = "helloworld" ;
System.out.println(str.substring(0, 5));

注意事项:

  1. 索引从0开始
  2. 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标

2.8 字符串的不可变性

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

  1. String类被final修饰,表明该类不能被继承
  2. value被修饰被final修饰,只能引用当前初始化好的对象不能引用其他对象,但是其引用空间中的内容可以修改。
    2. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象

最后总结一下:字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。这种说法是错误的。
字符串不可变的原因有两点:
1.String类被final修饰,表明该类不能被继承
2.value被修饰被final修饰,只能引用当前初始化好的对象不能引用其他对象,但是其引用空间中的内容可以修改

2.11 字符串修改

注意:尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下。
我们通过拼接符“+”确实可以对字符串进行修改,但是这样的效率太慢了。

public static void main(String[] args) {
String s = "hello";
s += " world";
System.out.println(s); // 输出:hello world
}

但是这种方式不推荐使用,因为其效率非常低,中间创建了好多临时对象。
关于这些临时变量怎么可以看到,我们可以通过反汇编的方式可以看到:
在这里插入图片描述
在这里插入图片描述
根据上面的图片我们可以看到有两个新的类:StringBuilder和StringBuffer
在这两个类中字符串是可以改变的。
接下来我们来看看这两个类把!

3.StringBuilder和StringBuffer

3.1 StringBuilder的介绍

由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大部分功能是相同的,这里介绍 StringBuilder常用的一些方法:
在这里插入图片描述
在这里插入图片描述
从上述方法可以看出:String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可以修改。频繁修改字符串的情况考虑使用StringBuilder。
这些方法我就不一一解释了,和上述String类方法差不多。
结尾:
希望大家可以给我点点关注,点点赞,你们的支持就是我的最大鼓励。🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹

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

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

相关文章

ubuntu22.04系统下载程序和依赖,并拷贝到指定路径下

脚本1 apt install aptitude apt-get -d install xxx #xxx是待下载的安装包 mv /var/cache/apt/archives/* /home/tuners/1apt install aptitude apt-get -d install xxx mv /var/cache/apt/archives/*.deb /home/tuners/1 xxx 为程序包名称 /home/tuners/1为保存程序包的…

PM2 在线和离线部署uvicorn和fastapi项目过程

PM2介绍 PM2 is a daemon process manager that will help you manage and keep your application online 24/7 PM2是一个后台进程管理工具,能帮助管理应用和维持应用7*24小时运行。 PM2在线安装 npm install pm2 -gPM2离线安装(适用于内网) 参见 如何离线安装pm2…

git-4

1.在GitHub上创建个人仓库 现在仓库中有LICENSE文件,但本地没有这个文件,该怎么办呢?往下看 2.把本地仓库同步到GitHub 3.不同人修改了不同文件如何处理? 两个人在同一个分支上,两个人修改了不同文件 其中一人&…

案例研究|北京交通大学基于DataEase开展多场景校园数据分析与展示

北京交通大学是教育部直属,教育部、交通运输部、北京市人民政府和中国国家铁路集团有限公司共建的全国重点大学,是国家“211工程”“985工程优势学科创新平台”“双一流”建设高校。 多年来,北京交通大学积极发挥信息技术赋能学校人才培养、…

基于springboot实现乒乓球预约管理系统项目【项目源码】

基于springboot实现乒乓球预约管理系统演示 系统的开发环境 浏览器:IE 8.1(推荐6.0以上) 开发使用语言:JAVA JDK版本:JDK_8 数据库管理系统软件:Mysql 运行平台:Windows 7 运行环境&#…

【hacker送书第6期】深入理解Java核心技术

第6期图书推荐 内容简介作者简介精彩书评参与方式 内容简介 《深入理解Java核心技术:写给Java工程师的干货笔记(基础篇)》是《Java工程师成神之路》系列的第一本,主要聚焦于Java开发者必备的Java核心基础知识。全书共23章&#xf…

关于鸿蒙网络请求的问题

https://developer.huawei.com/consumer/cn/forum/topic/0204136145853212268?fid0102683795438680754 鸿蒙OS 代码 import http from ohos.net.http;export const httpUtils (url: string, data: any) > {return new Promise((resolve, reject) > {let httpRequest …

鸿蒙开发已成新趋势

随着华为鸿蒙操作系统的快速崭露头角,鸿蒙开发已然成为当前技术领域的热门新趋势。本文将深入探讨鸿蒙开发的重要性和独特优势,并详细介绍一些关键的鸿蒙开发技术和工具,以及它们对开发者个人和整个行业带来的深远影响。 首先,鸿蒙…

【Apifox】测试工具自动编写接口文档

在开发过程中,我们总是避免不了进行接口的测试, 而相比手动敲测试代码,使用测试工具进行测试更为便捷,高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman,他还拥有一个非常nb的功能, 在接…

Table和HashBasedTable的使用案例

------------------- 1.普通使用 package org.example.testhashbasedtable;import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table;import java.util.Map;public class TestHashBasedTable {public static void main(String[] args) {Ta…

福州大学《嵌入式系统综合设计》 实验八:FFMPEG视频编码

一、实验目的 掌握使用算能平台进行视频编码的流程,包括开发主机环境与云平台的配置,视频编码程序的编写与理解,代码的编译、运行以及学习使用码流分析工具分析视频压缩码流等。 二、实验内容 搭建实验开发环境,编译并运行编码…

小诺2.0开源版工程启动

小诺是一款开源的前后端开发框架,同若依、SpringBladex一样可作为私活、外包脚手架。 开源地址:Snowy: 最新:💖国内首个国密前后分离快速开发平台💖,采用Vue3AntDesignVue3 ViteSpringBootMpHuToolSaToke…

YOLOv5算法进阶改进(6)— 更换主干网络之ResNet18

前言:Hello大家好,我是小哥谈。ResNet18是ResNet系列中最简单的一个模型,由18个卷积层和全连接层组成,其中包含了多个残差块。该模型在ImageNet数据集上取得了很好的表现,成为了深度学习领域的经典模型之一。ResNet18的优点是可以解决深度神经网络中梯度消失的问题,使得性…

【Seata源码学习 】篇五 注册分支事务

【Seata源码学习 】篇五 分支事务注册 1.远程服务调用绑定XID 回到事务模版方法类TransactionalTemplate中 beginTransaction(txInfo, tx);Object rs;try {// Do Your Business// 执行执行拦截器链路rs business.execute();} catch (Throwable ex) {// 3. The needed busine…

Diffusion:通过扩散和逆扩散过程生成图像的生成式模型

在当今人工智能大火的时代,AIGC 可以帮助用户完成各种任务。作为 AIGC 主流模型的 DDPM,也时常在各种论文中被提起。DDPM 本质就是一种扩散模型,可以用来生成图片或者为图片去噪。 扩散模型定义了一个扩散的马尔科夫过程,每一步逐…

Day01 嵌入式 -----流水灯

一、简单介绍 嵌入式系统中的流水灯是一种常见的示例项目,通常用于演示嵌入式系统的基本功能和控制能力。流水灯由多个发光二极管(LED)组成,这些LED按照一定的顺序依次点亮和熄灭,形成一种像水流一样的流动效果。 二、…

VsCode连接远程Linux编译环境的便捷处理

1.免输登录密码 免输命令的正确方法是使用公钥和私鈅在研发设备,和linux服务器上校验身份。公钥和私钥可在windows系统上生成。公钥要发送到linux服务器。私钥需要通知给本地的ssh客户端程序,相关的操作如下: 生成 SSH Key: 打开…

uniapp小程序项目连接微信客服【最新/最全教程】

目录 文档微信官网文档图片微信小程序客服配置官网 效果图聊天地址手机微信电脑端 微信聊天功能实现微信小程序后台添加客服微信号以及配置代码实现参考最后 文档 微信官网文档 微信官网文档 图片 微信小程序客服配置官网 微信小程序客服配置官网 效果图 聊天地址 地址 手…

解决PDF预览时,电子签章、日期等不显示问题

文章目录 问题描述问题排查问题解决 问题描述 在预览PDF时,部分签章或控件没有显示。如下图: 正确应该要这样: 问题排查 根据网上搜索,排查,我先看看,pdf.worker.js 里的这三行代码,是否已经注…

将原生Spring项目中某些配置文件中的易变内容参数化

😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…