认识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));// e
        System.out.println(s.indexOf('c'));//2
        System.out.println(s.indexOf('c',5));//7
        System.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出现的一个可变的操作字符串的容器,可以高效,方便的拼接字符串。
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Swift 结构化并发之全局 Actor 趣谈

概览 在 Swift 结构化并发构成的体系中,一个称为“演员”(Actor)的成员扮演了非常重要的角色,它被用来隔离和同步执行中的数据。 除了普通 Actor 以外,还有一个全局“演员”(Global Actor)的概念,它是做什么的?又有什么与众不同的长处呢? 在本篇博文中,您将学到如…

【Swagger】接口文档生成

文章目录 一、前后端分离开发流程二、YApi导入接口文档三、Swagger3.1 介绍3.2 使用步骤3.2.1 导入 knife4j 的maven依赖3.2.2 在配置类中加入 knife4j 相关配置3.2.3 配置类中设置静态资源映射3.2.4 访问测试 3.3 常用注解3.4 全局参数设置 四、YApi 与 Swagger 一、前后端分离…

网络安全实训Day8

写在前面 网络工程终于讲完了。这星期到了网络安全技术部分。 网络安全实训-网络安全技术 网络安全概述 信息安全:所有保障计算机硬件、系统、软件、数据不因有意或无意的行为导致的服务中断、数据损坏或丢失等安全事件的保障技术 网络安全:基于计算机…

Spark Stage

Spark Stage 什么是Stage Spark中的一个Stage只不过是物理执行计划其中的一个步骤,它是物理执行计划的一个执行单元。一个Job会被拆分为多组Task,每组任务被称为一个Stage,可以简单理解为MapReduce里面的Map Stage, Reduce Stag…

Oracle 使用OGG(Oracle GoldenGate) 实现19c PDB与MySQL5.7 数据同步

OGG 是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增删改变化。 OracleMysqlIP address192.168.80.100192.168.80.16DB version19.2.05.7host nametempmysql OS version: CentOS 7.9 一,Oracle 服务…

文件上传二—WEB攻防-PHP应用文件上传中间件CVE解析第三方编辑器已知CMS漏洞

演示案例: PHP-中间件-上传相关-Apache&NginxPHP-编辑器-上传相关-第三方处理引用PHP-CMS源码-上传相关-已知识别到利用 #PHP-中间件-上传相关-Apache&Nginx 复现漏洞环境:vulhub (部署搭建看打包视频) 由于PHP搭建常用中…

深度学习(过拟合 欠拟合)

过拟合: 深度学习模型由于其复杂性,往往容易出现过拟合的问题。以下是一些深度学习中常见的过拟合原因和解决方法: 1. 数据量不足:深度学习模型通常需要大量的数据来进行训练,如果数据量不足,模型容易过度…

Python界面库Flet(1)介绍和快速使用

Python界面库Flet(1)快速上手使用 Author:Once Day Date:2024年3月19日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: Pyt…

Collection与数据结构 数据结构预备知识(二):包装类与泛型

1.包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类.可以把包装类理解为基本数据类型所对应的引用数据类型. 1.1基本数据类型与对应的包装类 基本数据类型包装类byteByteshortShortintIntegerlongLong…

基于springboot+vue的旅游网站

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【wails】(10):研究go-llama.cpp项目,但是发现不支持最新的qwen大模型,可以运行llama-2-7b-chat

1,视频演示地址 2,项目地址go-llama.cpp 下载并进行编译: git clone --recurse-submodules https://github.com/go-skynet/go-llama.cpp cd go-llama.cpp make libbinding.a项目中还打了个补丁: 给 编译成功,虽然有…

C#新语法(持续更新)

文章目录 顶级语句全局using 指令Using资源管理文件范围的命名空间声明可空的引用类型记录(record)类型 顶级语句 C#9.0中直接在C#文件中直接编写入口方法的代码,不用类,不用Main。同一个项目中只能有一个文件具有顶级语句。顶级语句中可以直接使用await…

Mysql数据库深入理解

目录 一、什么是数据库 二、Mysql基本架构图 1.Mysql客户端/服务器架构 2.客户端与服务器的连接过程 3.服务器处理客户端请求 4.一条查询SQL执行顺序 4.1连接器 4.2查询缓存 4.3解析器 4.4执行器 4.4.1预处理阶段 4.4.2优化阶段 4.4.3执行阶段 5.一条记录如何存…

汇丰:当前的美股是泡沫吗?

汇丰认为,当前的风险资产并不构成泡沫,更类似于2017年的市场环境,风险资产有望继续稳步上升。 隔夜美股飙涨,标普创三个月最大周涨,纳指收盘创历史新高。结合去年以来的强劲表现,有观点认为由科技股支撑的…

网络安全笔记-day7,共享文件服务器

文件共享服务器 准备阶段 打开虚拟机win2003 创建文件 D:. —share   –down   |  test1.txt   |   —up     01xxx.txt     02xxx.txt 配置IP win2003 192.168.1.10 255.255.255.0 winxp 192.168.1.20 255.255.255.0 创建共享文件夹 创建共享&#xff1…

freeRTOS动态内存heap4源码分析

1 前言 随着功能安全的推广,动态内存分配在RTOS领域的用武之地将越来越小。但heap4毕竟是为RTOS量身打造,相对简单,作为堆内存管理的入门学习,仍是很不错的选择。 1.1 标准c库动态内存函数的弊端 对于标准C库的malloc和free函数&…

阿里云2核4G服务器优惠价格30元、165元和199元1年,轻量和ECS

阿里云2核4G服务器租用优惠价格,轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月,活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图: 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

安装mysql8.0.36遇到的问题没有developer default 选项问题

安装mysql8.0.36的话没有developer default选项,直接选择customer就好了,点击next之后通过点击左边Available Products里面的号和中间一列的右箭头添加要安装的产品,最后会剩下6个 安装完成后默认是启动了,并且在电脑注册表注册了…

零基础-MySQL数据库的基本操作

①MYSQL数据库基本操作-DDL 1.DDL的解释 DDL(Data Definition Language),数据定义语言,包括以下内容: 对数据库的常用操作 对表结构的常用操作 修改表结构 2.对数据库的常用操作 功能SQL查看所有的数据库show d…

【leetcode热题】 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出: []解法一 题…