String 字符串不可变带来的好处是什么?

news2024/12/29 7:46:34

目录

1. 线程安全(数据安全)

2. 节约内存

3. 提高集合的存取效率


1. 线程安全(数据安全)

众所周知,String 字符串是默认被 final 修饰的,是不可变的,那么首先能想到的一个优点就是线程安全,String 是存放在堆中的,是所有线程所共享的变量,不可变这一特性就可以在多线程的情况下防止出现一个线程对 String 做修改导致另一个线程运行结果出现错误。

举个最简单的例子,A线程和B线程都用到了字符串 s,假如说A线程把 s 做了修改,那么B线程就会因为A做的修改而被迫受到影响,这一点是非常不好的。

2. 节约内存

String 虽然是不可变的,但它却可以重复利用。String 虽然是在堆中,但其实分为两种情况,如果我们使用 String string = "xxx" 的方式来创建字符串,那么被创建出来的字符串对象是存放在堆中的字符串常量池中的,可以重复利用;假如我们使用 String string = new String("xxx") 的方式来创建字符串,那么被创建出来的对象是直接存放在堆中的,无法重复利用。

我用一段代码举例同学们一下子就懂了。

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

运行上述代码,得到如下结果

可以看到,str1 和 str2 都是直接赋值,其实指向的是堆中的同一个字符串对象,运算结果为 true;

而 str3 则是使用 new 对象的方式赋值,并不会引用常量池中已有的 abcdefg 而是会重新在堆中新建一个再指向新的,所以后两次运算都为 false;

所以说,String 虽然不可变,却可以重复利用,在开发过程中,几乎都是使用 String str = "xxx" 创建字符串,然后创建的字符串会被缓存到堆中的字符串常量池中,在同一各项目中不管有多少个人创建字符串,只要字符串内容一样,其实最后都是用的常量池中的同一个字符串对象,大大的降低了内存的消耗。

3. 提高集合的存取效率

上面说到了字符串常量池,同学们也可以理解为缓存池,在缓存池中,不仅缓存了字符串的内容,还缓存了每一个字符串对应的哈希值hashCode。当我们使用 Map 集合存取数据的时候,因为 Map 集合的 Key 基本都是 String 类型,所以在存和取数据的时候,就不需要重复哈希值,直接去缓存池中找就可以,找不到才会去计算。这样一来就极大地提高了 Map 集合存取数据的效率。

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

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

相关文章

NSSCTF 2nd Web 题目复现

php签到 考点&#xff1a; 1.上传表单html的编写 2./. 绕过黑名单&#xff08;在Linux系统下1.php.是一个合法的文件名&#xff0c;系统不会自动把最后的点去掉并把文件当成php文件执行&#xff0c;所以点绕过只在Windows下有用&#xff09; 源代码&#xff1a; <?phpfun…

ICS TRIPLEX T9432 电源模块

电源模块是电子装备中的重要组成部分&#xff0c;用于供给电能以供给装备中的各种电子元件和电路。电源模块具备多种特征&#xff0c;以保证供给稳定、否靠的电源&#xff0c;顺应不同运用的需要。以下是电源模块的一些主要特征&#xff1a; 电压和电流输入&#xff1a; 电源模…

纬创出售印度子公司给塔塔集团,结束iPhone代工业务 | 百能云芯

纬创&#xff08;Wistron&#xff09;董事会于10月27日通过决议&#xff0c;同意以1.25亿美元的价格出售其印度子公司Wistron InfoComm Manufacturing (India) Private Limited&#xff08;WMMI&#xff09;的100%股权给塔塔集团&#xff0c;交割将尽快完成。此举将意味着纬创退…

高效学习之anki新手入门指南(ios端,包括ipad、ihpone设备)————创建、使用、备份、相关资料

文章目录 0 背景0.1 闭环学习0.2 什么是anki 1 开始使用1.1 导入1.2 创建空白组1.3 创建卡片1.3.1 利用anki创建卡片的两种方法1.3.2 复习材料分类 2 操作卡牌&#xff08;位于卡牌界面中“游览”&#xff09;2.1 清空卡牌状态&#xff08;清空之前的“重来”、“困难”、“简单…

电源模块测试用例之电压上升时间测试方案

电压上升时间是电源模块一个非常重要的参数&#xff0c;它直接影响着电路的稳定性。电源模块电压上升过快或过慢都有可能会使系统发生故障&#xff0c;造成设备器件受损。因此&#xff0c;上升时间测试是电源模块测试非常重要的环节。纳米软件电源模块测试系统助力自动化测试&a…

GNN 简介

A Gentle Introduction to Graph Neural Networks A Gentle Introduction to Graph Neural Networks GNN简介 图神经网络&#xff08;GNN&#xff09;是一种基于图结构数据的深度学习模型&#xff0c;用于处理和分析图数据。图数据由节点&#xff08;顶点&#xff09;和边&a…

在Win11上部署ChatGLM3详细步骤

023年10月27日&#xff0c;智谱AI于2023中国计算机大会&#xff08;CNCC&#xff09;上&#xff0c;推出了全自研的第三代基座大模型ChatGLM3及相关系列产品&#xff0c;这也是智谱AI继推出千亿基座的对话模型ChatGLM和ChatGLM2之后的又一次重大突破。此次推出的ChatGLM3采用了…

【计算机网络】浏览器的通信能力

1. 用户代理 浏览器可以代替用户完成http请求&#xff0c;代替用户解析响应结果&#xff0c;所以我们称之为用户代理 user agent。 浏览器两大核心能力&#xff1a; 自动发送请求的能力自动解析响应的能力 1.1 自动发送请求的能力 用户在地址栏输入了一个url地址&#xff0…

Mac 上安装 Emscripten

背景&#xff1a;Web 端需要使用已有的 C 库&#xff0c;需要将 C 项目编译成 WebAssembly(.wasm) 供 js 调用。 Emscripten 可以将 C 编译成 .wasm 一、下载源码 # 下载 emsdk 源码 git clone https://github.com/emscripten-core/emsdk.git# 下载完成后进入到 emsdk 项目根…

voco品牌入华三周年,以“妙趣重生”之姿共绘酒店永续发展新风向

入华三年高速发展&#xff0c;乘酒店存量市场之潮&#xff0c;用艺术诠释绿色环保&#xff0c;趣享可持续旅程 2023年10月30日&#xff0c;西安 – 近日&#xff0c;洲际酒店集团旗下高端酒店品牌voco迎来进入大中华市场三周年&#xff0c;并于西安经开voco酒店举办周年庆典&a…

回收废品抢派单小程序开源版开发

回收废品派单抢派单小程序开源版开发 在这个废品回收抢单派单小程序开源版开发中&#xff0c;我们将构建一个专业且富有趣味性的平台&#xff0c;以深度的模式来重塑废品回收体验。 我们将提供一个会员注册功能&#xff0c;用户可以通过小程序授权注册和手机号注册两种方式快…

chatgpt账号,官方账号获取

有需要帮助可以联系我&#xff0c;我可以帮助获取&#xff08;有偿&#xff09;。

vue页面el-tab控件标签栏加入按钮功能

vue页面el-tab控件标签栏加入按钮功能 显示效果为&#xff1a; <el-tabs v-model"activeName" type"border-card" style"margin-right:5px"><el-tab-pane label"模型管理" name"first"><span slot"l…

安装Pytorch的详细步骤

若为安装Anaconda的友友&#xff0c;可以移步到这篇文章&#xff0c;先安装anaconda&#xff1a; https://blog.csdn.net/mariodf/article/details/134119941 一、anaconda创建虚拟环境 1、首先输入&#xff1a; conda env list 可以查看当前的虚拟环境&#xff1a; 2、创…

Linux网络基础2 -- 应用层相关

一、协议 引例&#xff1a;编写一个网络版的计算器 1.1 约定方案&#xff1a;“序列化” 和 “反序列化” 方案一&#xff1a;客户端发送形如“11”的字符串&#xff0c;再去解析其中的数字和计算字符&#xff0c;并且设限&#xff08;如数字和运算符之间没有空格; 运算符只…

jenkins详细安装教程

这里写目录标题 一、Jenkins安装与部署1-1、Jenkins的简介1-2、下载需要的软件1-2-1 jekins.war1-2-2 tomcat安装方式 1-3、使用11版本的jdk1-4、开启jenkins1-5、获取密码1-5 修改镜像(可改可不改) 二、卸载Jenkins 一、Jenkins安装与部署 1-1、Jenkins的简介 Jenkins是一个…

vue封装个日历,样式参考vant

vue封装个日历&#xff0c;样式参考vant 结果展示 <template><div class"report"><Header title"工作日历" :isShowLeft"true" onClickBack"goBack" /><div class"report-content"><van-icon …

Vue 菜单导航栏,轮播图

导航菜单栏结构和样式代码实现 一级导航栏 views/HomeView.vue <template><div><Shortcut></Shortcut><Header></Header><div class"inner"><Navigation></Navigation></div><div>我是主页&l…

多人协作使用git如何解决冲突?

什么情况会产生冲突 git merge XXX(合并分支时的冲突)&#xff1a; 当你尝试将一个分支的更改合并到另一个分支时&#xff0c;如果两个分支都修改了相同的文件的相同部分&#xff0c;Git 将无法自动解决冲突&#xff0c;因此会发生冲突。你需要手动解决这些冲突&#xff0c;然后…

外汇天眼:在2023年Expo上探索金融科技的未来!

从2020年初至2022年年底&#xff0c;全球范围内爆发的新冠疫情蔓延&#xff0c;对各国经济造成了严重冲击&#xff0c;导致贸易活动几近停滞&#xff0c;国际人员流动受限&#xff0c;产业链陷入危机。为应对这一局面&#xff0c;美欧经济体采取了前所未有的扩张性财政和货币政…