String的几个常见面试题及其解析

String s3 = new String("a") + new String("b")会不会在常量池中创建对象?

答案:不会,首先需要解释“+”字符串拼接的理解。

采用 + 运算符拼接字符串时:
  1. 如果拼接的都是字符串直接量,则在编译时编译器会将其直接优化为一个完整的字符串,和你直接写一个完整的字符串是一样的,所以效率非常的高。
  2. 如果拼接的字符串中包含变量,则在编译时编译器采用StringBuilder对其进行优化,即自动创建StringBuilder实例并调用其append()方法,将这些字符串拼接在一起,效率也很高。但如果这个拼接操作是在循环中进行的,那么每次循环编译器都会创建一个StringBuilder实例,再去拼接字符串,相当于执行了 new StringBuilder().append(str).toString(),所以此时效率很低。

所以 字符串常量池中有没有"ab"的创建,主要在于StringBuilder.toString()方法中创建String对象的构造方法与new String("ab")的构造方法不同。toString()调用的构造方法是直接复制StringBuilder数组中的值,并没有使用到字面量"ab",字符串中常量池中不会创建字符串"ab"

也许你会问为啥

new String(value, 0, count);

为啥没有在字符串常量池中创建

这里又引出一个面试题

new String("abc") 是去了哪里,仅仅是在堆里面吗?

执行这句话时,JVM会先使用常量池来管理字符串直接量,即将"abc"存入常量池。然后再创建一个新的String对象,这个对象会被保存在堆内存中。并且,堆中对象的数据会指向常量池中的直接量。

输出为false ,false

注意我的用词在执行这段话的时候字符串常量才会存入常量池,因此又引出一个面试题

字符串常量是什么时候进入到字符串常量池的?

Java 的类加载过程要经历加载(Loading)、链接(Linking)、初始化(Initializing)等几个步骤,在链接这个步骤,又分为验证(Verification)、准备(Preparation)以及解析(Resolution)等几个步骤。

在 Java HotSpot 虚拟机中,字符串字面量在类加载的解析阶段并不会被填充到字符串常量池中,而是存储在运行时常量池中。这意味着,虽然这些字符串常量的值在编译期间已经确定,但实际的字符串对象还没有创建。

只有当代码中实际使用到这个字符串字面量时,虚拟机才会在字符串常量池中创建对应的 String 实例。这种处理方式可以避免预先创建大量可能并不会被使用的字符串对象,从而节省内存。

String s3 = new String("a") + new String("b")会创建几个对象?

答:6个 , 堆中会有 String对象 a, String对象 b,以及这两个对象指向字符串常量池中的 ’a‘ 与 ’b‘。

然后字符串拼接的时候会创建StringBuilder对象,然后toString的时候会创建一个String对象。

那么又来了一个面试题

如何将这种存在于堆中又不在字符串常量词的字符串对象存入字符串常量池?

答:intern()方法,用于将字符串对象手动添加到字符串常量池中。调用intern()方法时,如果字符串常量池中已经存在相同内容的字符串,将会返回常量池中的引用;如果不存在,则会在常量池中创建新的字符串。

所以

输出ture

输出false

这里我有一个疑问,为啥调用s3.intern()方法之后 s3的指向变成了常量池中的“ab”了,希望大佬解释一下,这里就是我最近学到的java字符串相关内容

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

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

相关文章

【软件逆向】如何逆向Unity3D+il2cpp开发的安卓app【IDA Pro+il2CppDumper+DnSpy+AndroidKiller】

教程背景 课程作业要求使用反编译技术,在游戏中实现无碰撞。正常情况下碰撞后角色死亡,修改为直接穿过物体不死亡。 需要准备的软件 il2CppDumper。DnSpy。IDA Pro。AndroidKiller。 一、使用il2CppDumper导出程序集 将{my_game}.apk后缀修改为{my_…

rabbitmq的confirm模式获取correlationData为null解决办法

回调函数confirm中的correlationDatanull // 实现confirm回调,发送到和没发送到exchange,都触发 Override public void confirm(CorrelationData correlationData, boolean ack, String cause) {// 参数说明:// correlationData: 相关数据,可以在发送消息时,进行设置该参数// …

Go 方法介绍,理解“方法”的本质

Go 方法介绍,理解“方法”的本质 文章目录 Go 方法介绍,理解“方法”的本质一、认识 Go 方法1.1 基本介绍1.2 声明1.2.1 引入1.2.2 一般声明形式1.2.3 receiver 参数作用域1.2.4 receiver 参数的基类型约束1.2.5 方法声明的位置约束1.2.6 如何使用方法 二…

【网络协议】聊聊CND如何进行提升系统读性能

我们知道对于京东这种仓储来说,其实并不是在北京有一个仓储中心,而是针对全国主要的地方,北京、上海、广州、杭州,郑州等地方都有自己的仓储中心,当用户下单后,就会根据最近的仓储进行发货,不仅…

Kafka基本原理、生产问题总结及性能优化实践 | 京东云技术团队

Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景&a…

【快速解决】Android Studio ERROR: Read timed out

目录 前言 回顾我查到过的解决方案(这里是我自己解决时候的经历,赶时间的可以直接跳过看文章最后,快速进行解决) 快速解决方案如下 总结 前言 当我们新建一个安卓项目出现Read timed out时候不要慌,这篇文章会打开…

图像置乱加密的破解方法

仅仅通过置乱的方式,是无法对图像进行安全加密的。 针对采用置乱方式加密,可以采用多对(明文、密文)推导出加密时所使用的置乱盒。 step1 :初始化 1、使用I表示明文,E表示密文,彼此间关系如下: 2、为了处理上的方便,把二维转换为一维(这里为了说明方便,实际上,大…

CoT: 思路链提示促进大语言模型的多步推理

CoT 总览摘要1 引言2 Chain-of-Thought Prompting3 算术推理 (Arithmetic Reasoning)3.1 实验设置3.2 结果3.3 消融实验3.4 CoT的鲁棒性 4 常识推理 (Commonsense Reasoning)5 符号推理 (Symbolic Reasoning&#xff0…

“Java与Redis的默契舞曲:优雅地连接与存储数据“

文章目录 引言1. Java连接上Redis2. Java对Redis进行存储数据2.1 存储set类型数据2.2 存储hash类型数据2.3 存储list类型数据 总结 引言 在现代软件开发中,数据存储和处理是至关重要的一环。Java作为一门强大的编程语言,与Redis这个高性能的内存数据库相…

pytorch笔记 GRUCELL

1 介绍 GRU的一个单元 2 基本使用方法 torch.nn.GRUCell(input_size, hidden_size, biasTrue, deviceNone, dtypeNone) 输入:(batch,input_size) 输出和隐藏层:(batch,hidden_size&#xf…

vue3+element Plus实现弹框的拖拽、可点击底层页面功能

1、template部分 <el-dialog:modal"false"v-model"dialogVisible"title""width"30%"draggable:close-on-click-modal"false"class"message-dialog"> </el-dialog> 必须加的属性 modal:是否去掉遮罩层…

Redis原理到常用语法基础图文讲解

在初期&#xff0c;已经讲述了Redis安装问题。现在正式进入Redis的入门阶段 系统架构的演进 传统单机架构 一台机器运行应用程序、数据库服务器 现在大部分公司的产品都是这种单机架构。因为现在计算机硬件发展速度很快&#xff0c;哪怕只有一台主机&#xff0c;性能也很高…

Ubuntu 20.04源码安装git 2.35.1

《如何在 Ubuntu 20.04 上从源代码安装 Git [快速入门]》和《如何在 Ubuntu 20.04 上安装 Git》是我参考的博客。 https://git-scm.com/是git官网。 lsb_release -r看到操作系统版本是20.04。 uname -r看到内核版本是5.4.0-156-generic。 sudo apt update更新一下源。 完…

携程AI布局:三重创新引领旅游行业智能化升级

2023年10月24日&#xff0c;携程全球合作伙伴峰会在新加坡召开&#xff0c;携程集团联合创始人、董事局主席梁建章做了名为《旅游业是独一无二的最好的行业》的演讲&#xff0c;梁建章在演讲中宣布了携程生成式 AI、内容榜单、ESG 低碳酒店标准三重创新的战略方向。这些创新将为…

Technology strategy Pattern 学习笔记3-Creating the Strategy-Industry context

Creating the Strategy-Industry context 1 SWOT 1.1 create steps 1.与内部各方沟通 了解企业的人、流程和技术&#xff0c;包括与其它企业的不同了解哪些创新可以做竞争者及市场信息企业可以支撑的类似业务 按SWOT四象限分类&#xff0c;先做列表后放入象限 1.2 四象限…

SSH远程管理服务

一、SSH概述 熟悉Linux的人那肯定都对SSH不陌生。ssh是一种用于安全访问远程服务器的协议&#xff0c;远程管理工具。它之所以集万千宠爱为一身&#xff0c;就是因为它的安全性。那么它到底是怎么样来保证安全的呢&#xff1f;到底是如何工作的呢&#xff1f; 1、加密算法&am…

JAVA智慧工地管理系统源码基于微服务

智慧工地是将互联网的理念和科技引入施工现场&#xff0c;从施工现场源头抓起&#xff0c;大程度的收集人员、安全、环境、质量等关键业务数据。通过结合物联网、大数据、互联网、云计算等技术建立云端大数据管理平台&#xff0c;形成端云大数据的体系与模式&#xff0c;这就是…

嵌入式中利用VS Code 远程开发原理

VS Code几乎是所有的程序员必备的工具之一&#xff0c;据说全球一般的开发者都使用过VS Code这款工具。 今天分享一篇 VS Code 实现远程办公相关的文章。 1、概 述 通常&#xff0c;我们都是每天到工作的办公室进行办公&#xff0c;但是&#xff0c;如果下班回家&#x…

【Java】三种方案实现 Redis 分布式锁

序言 setnx、Redisson、RedLock 都可以实现分布式锁&#xff0c;从易到难得排序为&#xff1a;setnx < Redisson < RedLock。一般情况下&#xff0c;直接使用 Redisson 就可以啦&#xff0c;有很多逻辑框架的作者都已经考虑到了。 方案一&#xff1a;setnx 1.1、简单实…

鸿运主动安全云平台任意文件下载漏洞复习

简介 深圳市强鸿电子有限公司鸿运主动安全监控云平台网页存在任意文件下载漏洞&#xff0c;攻击者可通过此漏洞下载网站配置文件等获得登录账号密码 漏洞复现 FOFA语法&#xff1a;body"./open/webApi.html" 获取网站数据库配置文件 POC&#xff1a;/808gps/Mobile…