浅析 String

浅析String

  • 一、创建字符串
  • 二、字符串与常量池
  • 三、字符串的不可变性
  • 四、字符串的拼接
  • 五、StringBuilder和StringBuffer

一、创建字符串

    //三种常用的构造字符串的方式public static void main(String[] args) {String str1 = "hello";String str2 = new String("world");char[] chars = {'a','b','c'};String str3 = new String(chars);}

注意: String是引用类型,内部并不存储字符串本身。通过查看String类的实现源码可以发现,字符串实际由两部分value数组、hash值组成,字符串实际保存在char类型的数组中:

二、字符串与常量池

📝以下程序输出的结果是什么?在此过程中创建了几个String对象?

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

分析: 双引号引起来的内容时存放在字符串常量池的,在直接赋值时,如果在字符串常量池中存在就直接返回常量池中字符串的引用,如果不存在则先在字符串常量池中创建一份。如果通过new创建字符串对象,同样会按照如上步骤检查常量池,只不过最后返回的是通过new创建的字符串对象。

最后我们说结论:此过程中str1会在常量池创建1个字符串对象,str2创建0个字符串对象,str3在堆区创建1字符串个对象。且str1==str2str1!=str3.

具体过程如下草图:

总结:

直接赋值产生10个字符串对象,使用newString()赋值时产生21字符串对象。赋值时先看字符串常量池,如果字符串常量池中没有,就在常量池中创建一个,如果有,前者直接赋值则直接引用,后者使用new String()在堆内存中还需创建一个实例对象(此时引用变量指向的是堆内存中创建的实例对象,而不是常量池中的实例对象)。

字符串常量池的作用:

“池” 是编程中的一种常见的, 重要的提升效率的方式。 对于字符串常量池来说,每次使用相同字面类型的常量时,Java会首先在字符串常量池中查找是否存在该常量的实例,如果存在则直接返回引用,避免重复创建新的实例,从而提高程序的运行速度并节省内存

三、字符串的不可变性

1.String类在设计时就是不可改变的,String类实现描述中已经说明了。

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

为什么 String 要设计成不可变的?

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

四、字符串的拼接

上面我们说String被设计成不可变类型,那么字符串的拼接该怎么解释呢?

    public static void main(String[] args) {String str="hello";str+="world";System.out.println(str);}

我们将上面的代码进行编译,其实它的底层实现如下:

    public static void main4(String[] args) {//上述代码的底层实现:String str = "hello";StringBuilder stringBuilder = new StringBuilder();stringBuilder.append(str);stringBuilder.append("abc");str = stringBuilder.toString();System.out.println(str);}

所以,每次字符串的拼接底层都会创建一个StringBuilder对象,最后通过toString再返回一个新的String对象,可以想象如果在一个循环中使用字符串的拼接,那么它的效率将会非常低。话说回来,上面提到了StringBuilder,他究竟是什么?下面我们详细介绍:

五、StringBuilder和StringBuffer

由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilderStringBuffer类。与String类的不同就是,在这些类中的对字符串修改的方法都是直接对原字符串进行修改,最后返回的都是修改后的原字符串。

此外,StringBuffer和StringBulider方法都是一样的,区别是StringBuffer被synchronized(锁)修饰,(线程安全)用在多线程情况下。单线程下一般用StringBuilder,因为频繁的加锁和释放锁也是需要耗费系统资源的。

(1)String、StringBuffer、StringBuilder的区别

  1. String的内容不可修改,StringBuffer与StringBuilder的内容可以修改。
  2. StringBuffer与StringBuilder大部分功能是相似的。
  3. StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作

(2)三者之间的转换

  1. StringBuffer或StringBuilder转String:调用toString方法
  2. String转StringBuffer或StringBuilder:利用它们的构造方法或append()方法

经典例题: 在不考虑常量池之前是否存在的情况下,以下总共创建了多少个String对象?

String str = new String("ab"); // 会创建多少个对象
String str = new String("a") + new String("b"); // 会创建多少个对象
//答案:2 5

解析:

对于代码 String str = new String(“ab”); 会创建两个String对象。首先,"ab"字面量会在字符串常量池中创建一个String对象,然后通过调用new String()构造函数创建第二个String对象。

对于代码 String str = new String(“a”) + new String(“b”); 会创建五个String对象。首先,字面量 “a” 和 “b” 分别会在字符串常量池中创建两个String对象。接着,通过 new String() 构造函数创建了另外两个String对象。最后,通过字符串拼接操作符 + 进行连接时,会创建一个新的String对象,其值为拼接结果 “ab”。

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

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

相关文章

Python导出SqlServerl数据字典为excel

sql代码 SELECTtableName D.name ,tableIntroduce isnull(F.value, ),sort A.colorder,fieldName A.name,catogary B.name,bytes A.Length,lengths COLUMNPROPERTY(A.id, A.name, PRECISION),scales isnull(COLUMNPROPERTY(A.id, A.name, Scale), 0),isOrNotNull Cas…

springboot 对接 minio 分布式文件系统

1. minio介绍 Minio 是一个基于Go语言的对象存储服务。它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象…

Qt能跨多少个平台?Qt能支持多少个平台?

2023年8月5日,周日下午 目录 Qt所支持的平台更多关于Qt支持的信息 Qt所支持的平台 图中显示的平台都支持。 想要更详细的平台支持信息可以查看:Supported Platforms | Qt 5.15 更多关于Qt支持的信息 Qt - 支持的平台及语言

MongoDB 入门

1.1 数据库管理系统 在了解MongoDB之前需要先了解先数据库管理系统 1.1.1 什么是数据? 数据(英语:data),是指未经过处理的原始记录。 一般而言,数据缺乏组织及分类,无法明确的表达事物代表的意…

服务器中了malox勒索病毒后怎么办怎么解决,malox勒索病毒解密数据恢复

服务器遭受Malox勒索病毒攻击后,快速解密并恢复数据至关重要,以便减少更大的经济损失。近期,新的一波malox勒索病毒正在肆虐,我们收到很多企业的求助,企业的服务器数据库遭到了malox勒索病毒攻击,导致系统内…

如何使用win10专业版系统自带远程桌面公司内网电脑,从而实现居家办公?

使用win10专业版自带远程桌面公司内网电脑 文章目录 使用win10专业版自带远程桌面公司内网电脑 在现代社会中,各类电子硬件已经遍布我们身边,除了应用在个人娱乐场景的消费类电子产品外,各项工作也离不开电脑的帮助,特别是涉及到数…

09. Docker Compose

目录 1、前言 2、安装Docker Compose 2.1、Docker Compose版本 2.2、下载安装 3、初试Docker Compose 3.1、传统方案部署应用 3.2、使用编排部署应用 3.3、其他命令 3.3.1、ps 3.3.2、images 3.3.3、depends_on 3.3.4、scale 4、小结 1、前言 随着应用架构的不段…

Python爬虫异常处理心得:应对网络故障和资源消耗

作为一名专业的爬虫代理,我知道在爬取数据的过程中,遇到网络故障和资源消耗问题是再正常不过了。今天,我将与大家分享一些关于如何处理这些异常情况的心得和技巧。不论你是在处理网络不稳定还是资源消耗过大的问题,这些技巧能够帮…

uniapp微信小程序 401时重复弹出登录弹框问题

APP.vue 登陆成功后,保存登陆信息 if (res.code 200) {uni.setStorageSync(loginResult, res)uni.setStorageSync(token, res.token);uni.setStorageSync(login,false);uni.navigateTo({url: "/pages/learning/learning"}) }退出登录 toLogout: func…

离线数仓-项目介绍

1. 系统架构 2. 介绍流程 公司的困难数据的来源 业务日志 Flume采集日志数据 选型 ETL flume内存不够,通过ganglia监控器发现 提高吞吐量,batchSize kafka 高效读写 提高吞吐量 kafka挂了 kafka丢数问题 数据重复问题 数据乱序问题 消费策略…

深度学习部署:FastDeploy部署教程(CSharp版本)

FastDeploy部署教程(CSharp版本) 1. FastDeploy介绍 FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具, 支持云边端部署。提供超过 🔥160 Text,Vision, Speech和跨模态模型📦开箱即用的部署体验&#xf…

消息队列常见问题(1)-如何保障不丢消息

目录 1. 为什么消息队列会丢消息? 2. 怎么保障消息可靠传递? 2.1 生产者不丢消息 2.2 服务端不丢消息 2.3 消费者不丢消息 3. 消息丢失如何快速止损? 3.1 完善监控 3.2 完善止损工具 1. 为什么消息队列会丢消息? 现在主流…

支付模块功能实现(小兔鲜儿)【Vue3】

支付 渲染基础数据 支付页有俩个关键数据,一个是要支付的钱数,一个是倒计时数据(超时不支付商品释放) 准备接口 import request from /utils/httpexport const getOrderAPI (id) > {return request({url: /member/order/$…

PyTorch深度学习实战(10)——过拟合及其解决方法

PyTorch深度学习实战(10)——过拟合及其解决方法 0. 前言1. 过拟合基本概念2. 添加 Dropout 解决过拟合3. 使用正则化解决过拟合3.1 L1 正则化3.2 L2 正则化 4. 学习率衰减小结系列链接 0. 前言 过拟合 (Overfitting) 是指在机器学习中,模型…

android studio内存分析之Memory profiler的使用

目录 Android Studio中内存分析工具Memory profiler的使用1. 打开Memory Profiler2. 工具使用3. 内存选项说明4. 内存性能分析器概览5. 内存计算方式6. 查看内存分配7. 捕获java/kotlin方式查看内存分配8. 堆转储文件导入和导出 内存性能分析器中的泄漏检测 Android Studio中内…

【ArcGIS Pro二次开发】(58):数据的本地化存储

在做村规工具的过程中,需要设置一些参数,比如说导图的DPI,需要导出的图名等等。 每次导图前都需要设置参数,虽然有默认值,但还是需要不时的修改。 在使用的过程中,可能会有一些常用的参数,希望…

Sentinel 2.0 微服务零信任的探索与实践

作者:涯客、十眠 从古典朴素的安全哲学谈起 网络安全现状 现在最常见的企业网络安全架构便是在企业网络边界处做安全防护,而在企业网络内部不做安全防范。这确实为企业的安全建设省了成本也为企业提供了一定的防护能力。但是这类比于现实情况的一个小…

单通道 6GSPS 16位采样DAC子卡模块--【资料下载】

FMC147是一款单通道6.4GSPS(或者配置成2通道3.2GSPS)采样率的12位AD采集、单通道6GSPS(或配置成2通道3GSPS)采样率16位DA输出子卡模块,该板卡为FMC标准,符合VITA57.4规范,该模块可以作为一个理想…

力扣:54. 螺旋矩阵(Python3)

题目: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 来源:力扣(LeetCode) 链接:力扣 示例: 示例 1: 输入:matrix [[1,…

手机便签内容不见了怎么恢复正常?

在日常生活和工作中,很多人都需要随手记录事情,例如家庭琐事、孩子相关的事情、指定时间需要完成的工作任务、会议安排等。当我们需要随时随地记录事情的时候,手机便签应用就是非常不多的选择,我们直接打开手机上的便签APP就可以新…