字符串讲解

news2024/11/29 8:55:56

文章目录

  • 字符串
    • 一.String概述
    • 二.创建String对象的两种方式
    • 三.Java的内存模型
    • 四.字符串的比较
    • 五.StringBuilder的基本操做
    • 六.StringJoiner概述
    • 七.字符串相关类的底层原理

字符串

一.String概述

1.String是Java定义好的一个类,定义在java.long包中,所以使用的时候不需要导包

2.Java程序中的所有字符串文字(例如"abc")都被是为此类的对象

3.字符串的内容不可变,它的对象在创建后,不能被更改

4.字符串和任意类型相加得到的结果都是字符串

例如:“abc” + true = “abctrue”

5.常见的对字符串的处理有:

比较,替换,截取,查找,切割,检索,加密,打乱内容,大小写转换

二.创建String对象的两种方式

1.直接赋值

String name = “123”;

2.new

在这里插入图片描述

String str = new String();

String str = new String("abc");

//传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
//需求:修改字符串的内容(注意:字符串内容不可变) abc ---> Qbc
//abc-->{'a','b','c'}-->{'Q','b'.'c'}-->Qbc
char[] chs = {'a','b','c'};
String str = new String(chs);

byte[] bytes = {97,98,99,100};
String str = new String(bytes);
System.out.println(str);//abcd
//这里并不是把数字进行拼接,而是通过数字到ASCII码表里去查对应的字母,然后把字母进行拼接

三.Java的内存模型

在这里插入图片描述

在这里插入图片描述

字符串常量池

在这里插入图片描述

只有通过赋值的方式创建的字符串对象才在串池

从jdk1.7开始串池由方法区转到了堆内存中

在这里插入图片描述

当使用字符串直接赋值时,系统会检查该字符串在串池中是否存在

存在:复用

不存在:创建新的

在这里插入图片描述

在这里插入图片描述

所以,采用直接赋值的方式创建String对象的好处一个是代码简单,一个是节约内存

四.字符串的比较

==号比较(对字符串来说,比较的是地址值)

比较基本数据类型,比较的是数据值

在这里插入图片描述

比较引用数据类型,比较的是地址值

在这里插入图片描述

对字符串来说比较的是内容

在这里插入图片描述

注意:

1.equals()方法,不能比较基本数据类型

只能比较引用数据类型,

默认比较的是地址值

如果想要比较内容,需要对equals()方法进行重写

这里,对字符串来说比较的是内容,原因在于,String类已经对equals()方法重写好了

2.键盘录入的字符串,sc.next();—>是new 出来的

String中常用方法:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

五.StringBuilder的基本操做

StringBuilder可以看成是一个容器,创建之后里面的内容是可变的

作用:提高字符串的操做效率

过去使用String类型进行字符串拼接,就会不断的产生新的内容

比如:

在这里插入图片描述

比如,s1和s2拼接后产生"aaabbb",然后再拿"aaabbb"再和s3进行拼接依次类推,这样的话,会产生一些无用的字符串,占用内存

所以这并不是我们想要的

所以,我们可以采用StringBuilder

达到我们想要的效果,如下

在这里插入图片描述

StringBuilder构造方法:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

StringBuilder常用方法:

在这里插入图片描述

因为StringBuilder是Java已经写好的类,Java在底层对它做了一些特殊处理,打印对象不是地址值而是属性值

六.StringJoiner概述

1.StringJoiner和StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的

2.作用:提高字符串的操做效率,而且代码编写特别简洁,但目前很少有人用

3.JDK8出现的

StringJoiner构造方法:

在这里插入图片描述

在这里插入图片描述

StringJoiner成员方法:

在这里插入图片描述

总结:

1.String

表示字符串的类,定义了很多操做字符串的方法

2.StringBuilder

一个可变的操做字符串的容器

可以高效的拼接字符串,还可以将容器里的内容反转

3.StringJoiner

JDK8出现的一个可变的操做字符串的容器,可以高效,方便的操做字符串,在拼接的时候可以指定间隔符,开始符号,结束符号

七.字符串相关类的底层原理

扩展底层原理1:字符串存储的内存原理

1.直接赋值会复用字符串常量池里面的

2.new出来的不会复用,而是开辟一个新的空间

扩展底层原理2:==比较的是什么

1.基本数据类型:比较数据值

2.引用数据类型:比较地址值

但是,无论比较字符串还是其他引用数据类型都不用==,而是用equals()方法

扩展底层原理3:字符串拼接的底层原理

1.等号右边没有变量

在这里插入图片描述

触发字符串的优化机制,在编译的时候已经是最终结果了

等同于 String s = “abc”;

2.等号右边有变量

在这里插入图片描述

在JDK8以前都是在堆内存中创建一个StringBuilder容器,然后将变量和字符串进行拼接,然后调用toString()方法转为String对象

一个"+"号,堆内存中有两个对象

在这里插入图片描述

JDK8字符串拼接的底层原理

先去预估最终字符串的长度,并创建一个数组,数组里存放最终字符串的元素,最终把数组转为字符串

在这里插入图片描述

但是这里的预估也是需要时间的,比如有多行变量都需要进行拼接

在这里插入图片描述

则每一行都需要进行预估,然后创建数组,创建字符串对象

所以得出结论:如果有多个字符串变量进行拼接,不要直接"+",因为在底层会创建很多的对象,浪费时间,降低性能

所以使用StringBuilder-append()/StringJoiner-add()

扩展底层原理4:StringBuilder提高效率原理图

所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存

StringBuilder的容量是有上限的

在这里插入图片描述

扩展底层原理5:StringBuilder源码分析

StringBuilder在刚开始创建的时候,底层会创建一个字节数组

默认容量:16

长度:实际装了多少

容量:最多能装多少

添加"abc",实际存储的是他们的ASCII码值

在这里插入图片描述

如果添加的数据长度超过16,则扩容

扩容:老容量 * 2 + 2

如果添加的数据超过老容量 * 2 + 2,则以实际数据长度为准

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

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

相关文章

群晖 NAS WebDAV服务手机ES文件浏览器远程访问【无公网IP内网穿透】

📱 iOS开发上架主页 在强者的眼中,没有最好,只有更好。我们是移动开发领域的优质创作者,同时也是阿里云专家博主。 ✨ 关注我们的主页,探索iOS开发的无限可能! 🔥我们与您分享最新的技术洞察和实…

解除百度安全验证

使用chrome浏览器用百度浏览时,一直弹百度安全验证: 在设置里进行重置: 然后重启浏览器就可以了。

算法通过村第六关-树青铜笔记|中序后序

文章目录 前言1. 树的常见概念2. 树的性质3. 树的定义与存储方式4. 树的遍历方式5. 通过序列构建二叉树5.1 前中序列恢复二叉树5.2 中后序列恢复二叉树 总结 前言 提示:瑞秋是个小甜心,她只喜欢被爱,不懂的去爱人。 --几米《你们 我们 他们》…

uni-app 之 表格设置

uni-app 之 表格设置 image.png <view style"padding: 3%; border: #1296db;"><table style"width: 100%; border-collapse: collapse; "><tr style"height: 50px;border: 2px solid;border-color: #F7F7F7;"><td style&qu…

企业架构LNMP学习笔记26

通过Keepalived可以实现主服务器整机不可用&#xff0c;实现VIP的切换。保证用户可以通过VIP进行访问服务。但是实际上&#xff0c;往往不是服务器整机不可用&#xff0c;只是对应的服务或者软件不可用。 比如说&#xff0c;nginx提供的web的服务&#xff0c;nginx进程关闭。 …

什么是JVM常用调优策略?分别有哪些?

目录 一、JVM调优 二、堆内存大小调整 三、垃圾回收器调优 四、线程池调优 一、JVM调优 Java虚拟机&#xff08;JVM&#xff09;的调优主要是为了提高应用程序的性能&#xff0c;包括提高应用程序的响应速度和吞吐量。以下是一些常用的JVM调优策略&#xff1a; 堆内存大小…

【系统设计系列】数据库

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemarti…

8路编码器脉冲计数器或16路DI高速计数器,Modbus RTU模块 YL69-485 可识别正反转

特点&#xff1a; ● 编码器解码转换成标准Modbus RTU协议 ● 可用作编码器计数器或者转速测量 ● 支持8个编码器同时计数&#xff0c;可识别正反转 ● 也可以设置作为16路独立DI高速计数器 ● 编码器计数值支持断电自动保存 ● DI输入和电源之间3000V隔离 ● 通过RS-4…

奇舞周刊第 505 期:实践指南-前端性能提升 270%!

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 实践指南-前端性能提升 270% 当我们疲于开发一个接一个的需求时&#xff0c;很容易忘记去关注网站的性能&#xff0c;到了某一个节点&#xff0c;猛地发现&#xff0c;随着越来越多…

为什么Python在数据分析行业备受欢迎?优势在哪?

在今天的数据驱动世界中&#xff0c;数据分析已经成为各行业的核心工作之一。数据分析的应用场景非常广泛&#xff0c;例如金融、医疗、教育、电商、社交等领域。数据分析师是一种专门从事数据分析的职业&#xff0c;他们需要掌握一定的编程技能和统计知识&#xff0c;以及对数…

JavaScript实现广告倒计时和跳过广告

倒计时和跳过广告 最近打开手机上的app&#xff0c;映入眼帘的都是一个几秒的广告&#xff0c;带有倒计时&#xff0c;当然如果不喜欢的话可以点击跳过&#xff0c;跳过广告其实质应该就是关闭广告。以前用JavaScript做过一个定时关闭的广告&#xff0c;于是把代码完善了一下&…

作为数据分析师,如何能把AI工具和数据分析工作更好的结合?

​ 做为数据分析师&#xff0c;如果能够学会把AI工具应用到实际的数据分析工作当中&#xff0c;可以把一些重复性很强的工作交给AI来完成&#xff0c;这样数据分析师在提升效率的过程中能够去有更多的时间考虑具有创意的工作。 数据分析师&#xff0c;在使用AI工具完成数据分…

Android相机-架构3

目录 引言 1. Android相机的整体架构 2. 相机 HAL 2.1 AIDL相机HAL 2.2 相机 HAL3 功能 3. HAL子系统 3.1 请求 3.2 HAL和相机子系统 3.2.1 相机的管道 3.2.2 使用 Android Camera API 的步骤 3.2.3 HAL 操作摘要 3.3 启动和预期操作顺序 3.3.1 枚举、打开相机设备…

Java(二)数据类型与变量以及运算符

数据类型与变量以及运算符 二、数据类型与变量&#xff08;重要&#xff09;2.数据类型2.1 基本数据类型 1.变量与常量1.1常量&#xff08;字面常量&#xff09;1.2变量数据类型小总结 三、运算符1.运算符号&#xff08;重要&#xff09;1.1计算运算符1.2增量运算符1.3 自增或自…

AUTOSARCAN-Tp协议

目录 一.单帧、首帧、连续帧、流控帧 单帧传输 SF单帧&#xff1a; 多帧传输 FF&#xff08;首帧&#xff09;&#xff1a; CF&#xff08;连续帧&#xff09;&#xff1a; FC&#xff08;流控帧&#xff09;&#xff1a; 一.单帧、首帧、连续帧、流控帧 CAN诊断由发送端…

数据库服务器是什么意思?数据库服务器有哪些?

数据库服务器是什么意思?现在市场上有很多的服务器的类型&#xff0c;比如数据库服务器&#xff0c;但是很多人对数据库服务器是什么意思?数据库服务器有哪些并不是很熟悉&#xff0c;那么&#xff0c;聚名企服为您详解一下。 一&#xff1a;数据库服务器是什么意思 数据库服…

Vue框架--Vue列表渲染(2)

1.列表过滤 所谓的列表过滤其实就是对数据做一个筛选。实现这一个列表过滤代码可以有两种方式来做: 使用watch监视来实现,如下: 使用计算属性conputed实现,代码如下所示:这里适合使用计算属性实现。

ArcGIS 10.7安装教程!

软件介绍&#xff1a;ArcGIS是一款专业的电子地图信息编辑和开发软件&#xff0c;提供一种快速并且使用简单的方式浏览地理信息&#xff0c;无论是2D还是3D的信息。软件内置多种编辑工具&#xff0c;可以轻松的完成地图生产全过程&#xff0c;为地图分析和处理提供了新的解决方…

Java从入门到精通-数组(二)

4.数组的基本操作 数组的基本操作包括遍历数组、填充替换数组元素、对数组进行排序、复制数组以及查询数组中的元素。 • 4.1 遍历数组 遍历数组是访问数组中所有元素的过程&#xff0c;通常使用循环完成。 使用 for 循环遍历数组&#xff1a; int[] numbers {1, 2, 3, 4…

vue 部署到本机IIS 部署 SPA 应用

安装 URL Rewrite Works With: IIS 7, IIS 7.5, IIS 8, IIS 8.5, IIS 10 URL Rewrite : The Official Microsoft IIS Site 目前公司的 Web 项目是 SPA 应用&#xff0c;采用前后端分离开发&#xff0c;所以有时也会倒腾 Vue 框架。 在 Devops 实践中&#xff0c;容器部署成…