String的理解

news2025/1/24 11:47:37

1.+号

1. 1 + 号连接符的实现原理

StringBuilder(或者StringBuffer)的apend方法拼接,然后toString方法返回新的字符串

1.2 +号的特殊情况

1.2.1 当"+"两端均为编译期确定的字符串常量时,编译器会进行相应的优化,直接将两个字符串常量拼接好

System.out.println("Hello" + "World");

反编译后

System.out.println("HelloWorld");

1.2.2 对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中 (如果是final修饰的方法,那么只能运行期间确定,则跟此处的result不一致)

String s0 = "ab";

final String s1 = "b";

String s2 = "a" + s1;

System.out.println((s0 == s2)); //result = true

2.String.intern方法

intern 方法是一个native方法,intern方法会从字符串常量池中查询当前字符串是否存在,如果存在,就直接返回当前字符串;如果不存在就会将当前字符串放入常量池中,之后再返回常量池中当前字符串的对象引用

3.总结

public static void main(String[] args) {

String s1 = "AB";

String s2 = new String("AB");

String s3 = "A";

String s4 = "B";

String s5 = "A" + "B";

String s6 = s3 + s4;

System.out.println(s1 == s2);

System.out.println(s1 == s5);

System.out.println(s1 == s6);

System.out.println(s1 == s6.intern());

System.out.println(s2 == s2.intern());

}

------

输出:

false

true

false

true

false

解析:真正理解此题目需要清楚以下几点

1)直接使用双引号声明出来的String对象会直接存储在常量池中;

2)String对象的intern方法会得到字符串对象在常量池中对应的引用,如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用;

3) 字符串的+操作其本质是创建了StringBuilder对象进行append操作,然后将拼接后的StringBuilder对象用toString方法处理成String对象,这一点可以用javap -c命令获得class文件对应的JVM字节码指令就可以看出来。

 

还有一个有意思的点,String类中的hashCode并不是final修饰,如果并发情况下,多个线程同时对同一个字符串进行hashCode计算的话,是会重复进行计算的。

为啥不对字符串的hash值加final或者是进行volatile呢?

其实hashCode本身方法进行了简单缓存,这样还比较高效。

volatile本身的read是有开销的,并发条件下如果对同一个String进行hashCode计算的话,不同线程计算出来的结果都是一样的,重复计算不会造成其他安全问题,没必要为了这些小概率时间给hash值加上同步volatile语义。

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

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

相关文章

springboot项目外卖管理 day05-新增与删除套餐

文章目录 一、新增菜品1.1、需求分析1.2、数据模型setmealsetmeal_dish 1.3、代码开发-梳理交互过程1.3.1、下拉框展示1.3.2、菜品窗口展示1.3.3、新增套餐 2、套餐分页查询 一、新增菜品 1.1、需求分析 套餐就是菜品的集合。 后台系统中可以管理套餐信息,通过新…

solr快速上手:常用查询语法(八)

0. 引言 solr作为搜索引擎,就像我们使用mysql一样,在日常业务中,更多接触的则是各类操作语法,所以今天,我们再来学习solr的常用查询语法,为大家在工作中最基本的solr查询打下基础。 solr快速上手&#xff…

ia write 自定义 导出模板

https://github.com/yangyang5214/github-plus.iatemplate 使用了点个 star 吧) 在原有的 GitHub 模板基础上,增加了 封面页面和页脚。 封面页面 展示文章标题 作者 时间。高端大气~ 增加页脚,显示 page/pageCount 加载 通过…

做策划有这些特质才能成为行业大咖,看看你符合几个

这个问题确实很重要,策划也不是职业也不是适合所有人的! 首先,从性格方面来说吧。 有些人就是适合说话,有些人就是适合埋头苦干,还有一些人有强大的学习能力和逻辑思维。所以就是适合做创意类、创作类、策划类、统筹…

百度翻译API使用教程(前端+后端)

1.资格获取 首先我们需要登录百度翻译开放平台,获取开发者资格: 访问 百度翻译开放平台 然后进行注册(如果有百度账号的话可以直接登录) 注册成功后点击“产品服务”: 跳转到通用文本API界面: 在页面底…

怎么自学电脑编程

首要之首:不要急于选择一种语言 新手们有一个常见的错误就是犹豫于判断哪种编程语言是做好的、最该先学的。 我们有很多的选择,但你不能说那种语言最好。 我们应该理解:说到底,什么语言并不重要。 重要的是理解数据结构、控制逻辑…

C语言——修改控制台背景色和字体颜色

C语言——修改控制台背景色和字体颜色 方法一&#xff1a;system(“color NUM1NUM2”) system("color NUM1NUM2");可以用库函数system(“color NUM1NUM2”)实现 需要头文件 <stdlib.h> NUM1,NUM2均为16进制数 NUM1控制控制台背景色&#xff0c;NUM2控制前…

大数据驱动的实时文本情感分析系统:构建高效准确的情感洞察【上进小菜猪大数据】

上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货。 随着互联网的快速发展和大数据技术的不断成熟&#xff0c;用户推荐系统在各个应用领域变得越来越重要。本文将介绍如何利用大数据技术构建一个实时用户推荐系统。我们将通过结合Ap…

基本算法温习:打印金字塔

最终结果图如下&#xff1a; 想达到这个结果&#xff0c;通常的做法是通过拼结两个三角型达到&#xff0c;但是实际上还有最右边的第三个三角型没有处理&#xff0c;这个拼结的方法总让人看起来有一点不完美的感觉&#xff0c;于是我自创了一个思路&#xff0c;一气合成&#x…

【数据结构】七大排序算法(超详细)

欢迎来到南方有乔木的博客&#xff01;&#xff01;&#xff01; 博主主页&#xff1a;点击点击&#xff01;戳一戳&#xff01;&#xff01; 博主名:南方有乔木 博主简介&#xff1a; 一名在校大学生&#xff0c;正在努力学习Java语言编程。穷且意坚&#xff0c;不坠青云之志&…

uniapp和springboot微信小程序开发实战:后端架构搭建之封装WEB接口返回对象

文章目录 前言本节所需依赖工具类实现测试代码运行结果总结前言 作为开发者,开发的接口请求返回数据类型有很多种。比如返回字符串,返回对象,返回集合数组等情况,每个人开发者都有自己喜欢的方式或风格。所以在一个项目开发的时候架构师会定义好返回对象,给前端返回数据格…

redis基本数据类型001String

String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象 一个Redis中字符串value最多可以是512M 应用场景 需要存储常规数据的场景 缓存 session、token、图片地址、序列化后的对象(相比较于 Hash 存储更节省内存)。 需要计数的场景 举…

Singer混沌映射与莱维飞行改进灰狼算法

目录 一、灰狼算法 二、改进策略 2.1 混沌初始化种群 2.2 非线性收敛因子 三、引入莱维飞行 四、运行结果 从改进运行结果来看&#xff0c;效果非常好&#xff0c;在、、等极易陷入局部最优的测试函数上都取到了最优值&#xff0c;收敛速度也得到极大提升。 一、灰狼算法…

数学模型:Python实现整数规划

上篇文章&#xff1a;线性规划 文章摘要&#xff1a;整数规划的Python实现。 参考书籍&#xff1a;数学建模算法与应用(第3版)司守奎 孙玺菁。 PS&#xff1a;只涉及了具体实现并不涉及底层理论。学习底层理论以及底层理论实现&#xff1a;可以参考1.最优化模型与算法——基于P…

谷粒商城学习笔记(三):简介-项目微服务划分图

目录 一、微服务划分图二、前后端分离三、网关四、业务微服务群五、第三方服务六、服务治理七、状态监控八、数据层 一、微服务划分图 二、前后端分离 这个项目是基于前后端分离的开发&#xff0c;需要创建一些前端项目&#xff0c;admin-vue是面向工作人员的后台管理系统&…

论文笔记--SimCSE: Simple Contrastive Learning of Sentence Embeddings

论文笔记--SimCSE: Simple Contrastive Learning of Sentence Embeddings 1. 文章简介2. 文章概括3 文章重点技术3.1 对比学习 Contrastive Learning3.2 Unsupervised SimCSE3.3 Supervised SimCSE3.4 Anisotropy3.5 Alignment and Uniformity 4. 文章亮点5. 原文传送门6. Refe…

Spring中Aop实现日志功能

文章目录 前言1.环境搭建2.设计日志记录表3.aop需要引入aspectj依赖4.日志实体类设计5.自定义日志BusiLog注解6.定义日志切面6.1 此处只使用了环绕通知6.2 Aspect中有5种通知 7.业务中使用注解8.测试8.1 测试查询8.2 测试删除 前言 上篇分享了jdk动态代理以及cglib代理&#x…

SQL注入总结

Sql注入定义&#xff1a; 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行的sql命令的目的。 sql注入分类&#xff1a; 基于联合查询 基于错误回显 基于盲注&#xff0c;分时间盲注和布尔型的盲注 基于user-agen…

NIN(Network In Network)

目录 论文信息摘要批注 主要工作1. MLPCONV结构1.1为什么11卷积层可以代替MLP层1.2 批注2. Global Average Pooling(GAP)3、NIN网络结构NIN论文解读及个人理解NIN网络的代码实现&#xff08;pytorch&#xff09; 参考文献 论文信息 论文名称&#xff1a;Network In Network 论…

SQL注入—报错注入

0x00 背景 SQL注入长期位于OWASP TOP10 榜首&#xff0c;对Web 安全有着很大的影响&#xff0c;黑客们往往在注入过程中根据错误回显进行判断&#xff0c;但是现在非常多的Web程序没有正常的错误回显&#xff0c;这样就需要我们利用报错注入的方式来进行SQL注入了。这篇文章会讲…