字符串讲解

文章目录

  • 字符串
    • 一.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.rhkb.cn/news/126445.html

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

相关文章

Mybatis学习|Mybatis缓存:一级缓存、二级缓存

Mybatis缓存 MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。 MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存 默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地…

centroen 23版本换界面了

旧版本 新版本 没有与操作系统一起打包的ISO文件了,要么先安装系统,再安装Centreon,要么用pve导入OVF文件

Visual Stadio使用技巧

C语言调试技巧 Debug 和 Release 的介绍 Debug:通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试(可调试)。 Release:通常称为发布版本,它往往时进行了各种优化&a…

java实现调用百度地图

这里使用的springbootthymeleaf实现,所以需要有springboot技术使用起来更方便 当然,只使用html加js也可以实现,下面直接开始 首先我们需要去百度地图注册一个AK(百度地图开放平台 | 百度地图API SDK | 地图开发) 找到左…

windows弹出交互式服务检测一键取消bat脚本

现象 脚本命令 新建一个bat文件,将下面的脚本拷贝进去,保存,双击即可 禁用服务:重启电脑的时候不会启动 停止服务:立即停止服务,马上生效的 sc config UI0Detect start disabled net stop UI0Detect

vscode 调试 ROS2

1、在下列目录同层级找到.vscode文件夹 . ├── build ├── install ├── log └── src 2、 安装ros插件 3、创建tasks.json文件,添加下列内容 //代替命令行进行编译 {"version": "2.0.0","tasks": [{"label": &…

CocosCreator3.8研究笔记(六)CocosCreator 脚本装饰器的理解

一、什么是装饰器? 装饰器是TypeScript脚本语言中的概念。 TypeScript的解释:在一些场景下,我们需要额外的特性来支持标注或修改类及其成员。装饰器(Decorators)为我们在类的声明及成员上通过元编程语法添加标注提供了…

Linux基础知识及常见指令

Linux简介及相关概念 什么是Linux? Linux是一个免费开源的操作系统内核,最初由Linus Torvalds于1991年创建。它是各种Linux发行版(通常称为“发行版”)的核心组件,这些发行版是完整的操作系统,包括Linux内…

AUTOSARCAN-Tp协议

目录 一.单帧、首帧、连续帧、流控帧 单帧传输 SF单帧: 多帧传输 FF(首帧): CF(连续帧): FC(流控帧): 一.单帧、首帧、连续帧、流控帧 CAN诊断由发送端…

C中的基本函数

1函数是是什么 1.1维基百科中对函数的定义:子程序 在计算机科学中,子程序是一个大型程序中的某部分代码,由一个或多个语句块组成,他负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。 一般会有输…

浅析安防视频监控平台EasyCVR视频融合平台接入大量设备后是如何维持负载均衡的

安防视频监控平台EasyCVR视频融合平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备…

【C++】学习STL中的list

❤️前言 大家好!,今天为大家带来的一篇博客是关于STL中的list,内容主要包括list的介绍使用、list的模拟实现。以及list与vector的对比。 正文 list的介绍和使用 首先,让我们看看list的文档介绍: list是可以在常数范…

LabVIEW检测润滑油中的水分和铁颗粒

LabVIEW检测润滑油中的水分和铁颗粒 润滑油广泛应用于现代机械设备,由于工作环境日益恶劣,润滑油经常被水分乳化,加速对机械设备的腐蚀。此外,润滑油还受到机械零件摩擦中产生的Fe颗粒的污染,削弱了其机械润滑效果。润…

微服务-gateway基本使用

文章目录 一、前言二、gateway网关1、什么是微服务网关?2、微服务架构下网关的重要性2.1、没有网关2.2、有网关 3、gateway的功能4、gateway实战4.1、依赖配置4.2、添加网关配置4.3、添加网关启动类4.4、查看项目是否启动成功4.5、验证路由配置是否正确 三、总结 一…

设备管理系统的优势是什么?设备管理系统对企业运营管理有什么帮助?

传统的设备报修维护方式存在一些问题,例如指派传递速度慢和故障信息不准确等。然而,使用设备管理系统就可以轻松地解决这些问题,并且报修全流程只需短短的30秒。设备管理系统具有许多优势,首先它支持多种渠道的报修,包…

视频集中存储/直播点播平台EasyDSS点播文件分类功能新升级

视频推拉流EasyDSS视频直播点播平台,集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体,可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 TSINGSEE青犀视频的EasyDSS平台具有点播文件分类展示方法&#xf…

MojoTween:使用「Burst、Jobs、Collections、Mathematics」优化实现的Unity顶级「Tween动画引擎」

MojoTween是一个令人惊叹的Tween动画引擎,针对C#和Unity进行了高度优化,使用了Burst、Jobs、Collections、Mathematics等新技术编码。 MojoTween提供了一套完整的解决方案,将Tween动画应用于Unity Objects的各个方面,并可以通过E…

MySQL——索引

索引在 MySQL 数据库中分三类: B 树索引Hash 索引全文索引 目的:在查询的时候提升效率 b树 参考:https://blog.csdn.net/qq_40649503/article/details/115799935 数据库索引,是数据库管理系统中一个排序的数据结构&#xf…

Linux之Shell概述

目录 Linux之Shell概述 学习shell的原因 shell是什么 shell起源 查看当前系统支持的shell 查看当前系统默认shell Shell 概念 Shell 程序设计语言 Shell 也是一种脚本语言 用途 Shell脚本的基本元素 基本元素构成: Shell脚本中的注释和风格 Shell脚本编…

合宙Air724UG LuatOS-Air LVGL API控件-滑动条 (Slider)

滑动条 (Slider) 滑动条看起来和进度条是有些是有些像,但不同的是滑动条可以进行数值选择。 示例代码 -- 回调函数 slider_event_cb function(obj, event)if event lvgl.EVENT_VALUE_CHANGED then local val (lvgl.slider_get_value(obj) or "0")..&…