深入 -- 双引号字符串加号(+)拼接 创建了几个对象?_两个字符串相加产生几个对象-程序员宅基地

技术标签: Java面试  Java_提高_源码  Class  String  字符串常量池  

双引号字符串加号(+)拼接 创建了几个对象?

结论先行

双引号字符串 加号(+) 拼接,不论多少,只创建了一个对象


昨天看到一个题目,挺有意思的。

大意是:

String a = "1"+"2"+"3"+"4";

创建了几个对象??


我当时第一反应是1个对象。

为什么呢?

因为 双引号字符串 直接写是在编译器就直接生成一个对象,class在编译的时候直接放入字符串常量池的。

这个知识点,可能时间有点久,自己也不太确定。

找两个同事问了问,给了我一个不一样的答案。

他们认为起码创建了 大于4个对象,底层是通过StringBilder 或 StringBuffer 进行的字符串拼接。

我也是一脸蒙蔽…自己分析看下呗..


分析

我们先看下JDK官方 String API中的说法:

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html



注意下,上面标红的字。

根据 API 中提供的样例,可以看到是 双引号字符串对象相加

这种情况,肯定是StirngBuilder 或 StringBuffer 进行的拼接。

对于这个, 我没有异议。

看一个案例

String a = "1";
String b = "2" + a;
System.out.println(b);

String c = "9" + "8" + "7" + "6";
System.out.println(c);

这里,"2" + a , 内部是调用了StringBuilder 或 StringBuffer 的append。

来看下,反汇编:


字符串"2" 和 对象a,进行 加号(+) 拼接的时候,调用的StringBuilder 的append,没问题....


既然 JDK API 中没有明确说明多个双引号字符串相加是什么情况,我们看下反汇编的结果:


可以看到直接就是 "1234"

再看下编译后的Class文件:

按照同事说的是字符串拼接的话,那应该在Class文件、反汇编中体现出来。

但是,并没有。

在生成的Class文件中,直接就是一个拼接好的字符串。

之后,JVM再去读取Class文件、解析Class文件,类加载,发现这个变量之后,直接放入字符串常量池。


如有问题,欢迎指正

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Simba_cheng/article/details/80781939

智能推荐

LINUXE下执行php 定时任务-程序员宅基地

文章浏览阅读39次。linuxtest.php<?php $fn='/home/root.adminssh/boz/logs';$data=rand(1,9999);$fp=fopen($fn,'wb');fwrite($fp,$data);fclose();?>linux下执行命令/usr/bin/php -f ./test.php转载...

shell 变量匹配-程序员宅基地

文章浏览阅读546次。${var%pattern}${var%%pattern}${var#pattern}${var##pattern}${var%pattern},${var%%pattern} 从右边开始匹配${var#pattern},${var##pattern} 从左边开始匹配${var%pattern} ,${var#pattern} 表示最短匹配,匹配到就停止,非贪婪..._shell匹配tag的变量怎么写

运行shap模型时,出现Visualization omitted, Javascript library not loaded! Have you run `initjs()`-程序员宅基地

文章浏览阅读715次,点赞14次,收藏9次。【代码】运行shap模型时,出现Visualization omitted, Javascript library not loaded!_visualization omitted, javascript library not loaded! have you run `initjs()

Base64编码转为文件_将base64编码变成.7z文件-程序员宅基地

文章浏览阅读505次,点赞3次,收藏3次。在JavaScript中,将Base64编码的字符串转换为文件通常涉及几个步骤。这通常涉及到创建一个Blob对象,然后使用这个Blob对象来创建一个文件。File对象通常用于表示用户选择的文件,但也可以在这里用来表示从Base64字符串创建的文件。// 你的Base64字符串。// 现在你可以使用这个文件对象,比如通过表单上传,或者通过URL.createObjectURL来预览图片等。方法,你可以创建一个指向Blob或File对象的URL,这个URL可以直接用于在。// 示例:创建图片的URL。_将base64编码变成.7z文件

基于 OpenCV 的图像处理与分析应用的设计与实现_具有图像分析设计开发-程序员宅基地

文章浏览阅读1.8k次。图像处理与分析是计算机视觉中的重要应用领域,通过对图像进行处理和分析,可以提取有用的信息和特征,用于解决实际问题。 OpenCV 是一个强大的开源计算机视觉库,提供了丰富的功能和算法,适用于各种图像处理和分析任务。本文将以设计和实现一个基于 OpenCV 的图像处理与分析应用为中心,为你介绍构建这样一个应用的基本原理、方法和实例。_具有图像分析设计开发

ASR6501模组Cortex-M0+ SX1262 PSoC+LoRaWAN节点模块 CubeCell系列AT指令中文手册_sx1262中文手册-程序员宅基地

文章浏览阅读2.2k次。CubeCell系列AT指令中文手册0.版权声明1.摘要2.串口设置3. AT指令语法3.1语法概述3.2 AT指令集基础控制指令(括号中为译者注释,并不会显示)用户AT指令用户AT指令执行逻辑“ 普通LoRa模式”专有指令设置LoRa监听/发送参数接收模式接收数据输出模式选择LoRaWAN模式专有指令设置 DevEui设置 AppEui设置AppKey设置NwkSKey设置 AppSKey设置 DevAddr设置 OTAA / ABP mode配置ADR配置LoRaWAN通道掩码触发OTAA访问设置通讯周_sx1262中文手册

随便推点

鼠标右击没有新建WORD、EXCEL、PPT选项卡解决方案_win11右键新建没有ppt-程序员宅基地

文章浏览阅读1.5k次。鼠标右击没有新建WORD、EXCEL、PPT选项卡解决方案_win11右键新建没有ppt

微信小程序 -- ios 底部小黑条样式问题_uniapp 微信小程序屏幕小黑条-程序员宅基地

文章浏览阅读2.1k次,点赞27次,收藏24次。如图,ios有的机型底部伪home键会显示在按钮之上,导致点击按钮的时候误触。_uniapp 微信小程序屏幕小黑条

c++编写暴力破解密码_怎么用c++破译administrator密码-程序员宅基地

文章浏览阅读760次。打开控制台:windows+R,进入目录路径。三、将两个程序复制到一个文件夹中。_怎么用c++破译administrator密码

社会网络分析能干什么?_社会网络分析用来做什么-程序员宅基地

文章浏览阅读8.5k次,点赞3次,收藏11次。现在来看,社会网络分析可以解决或可以尝试解决下列问题:1-人际传播问题,发现舆论领袖,创新扩散过程;2-小世界理论,六度空间分割理论;3-Web分析,数据挖掘中的关联分析,形成交叉销售,增量销售,也就是啤酒和尿布的故事;4-社会资本,产业链与价值链;5-文本的意义输出,通过追问调查研究文本的关联和意义;6-竞争情报分析;7-语言的关联,符号意_社会网络分析用来做什么

开源软件的总拥有成本指南_使用开源软件需要履行哪些义务-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏5次。使用现成的软件能加速开发进程。然而开源软件(OSS)并不是免费使用的。使用开源软件往往伴随着承担义务和风险,这些都是成本。本指南根据公开信息和我15年的经验总结了使用开源软件进行专业软件开发的成本。_使用开源软件需要履行哪些义务

推荐文章

热门文章

相关标签