new String()究竟创建几个对象?

CP2102 USB 转 UART 模块 PCB 设计项目 不幸的是,我的笔记本电脑只有 USB 端口,所以我需要在 USB 端口和 UART 接口之间进行转换。PCB 布局将足够小,因此我们不一定需要高速布线 USB 线路,但我们将在此将其作为一个简单的示例来实现,以展示如何在这种类型的电路板上实现它。相反,我们只使用屏幕左侧的电路。在这里,我们利用对之间的间距和到 L1 上的铜灌注的距离将差分阻抗设置为目标值。初始布局分为两个部分:USB 连接器和 USB 线路的 TVS 二极管放置在电路板左侧,带有二极管 D4 和 D5 的引脚接头放置在电路板右侧。 阅读详情

1. 由来

遇到一个Java面试题,是关于String的,自己对String还有点研究?下面是题目的描述:

在Java中,new String("hello")这样的创建方式,到底创建了几个String对象?

题目下答案,各说纷纭,有说1个的,有说2个的。我觉得都对,但也都不对,因为要加上一定的条件,下面来分析下!

2. 解答

2.1. 分析

题目中的String创建方式,是调用String的有参构造函数,而这个有参构造函数的源码则是这样的public String(String original),这就是说,我们可以把代码转换为下面这种:


String temp = "hello";  // 在常量池中

String str = new String(temp); // 在堆上

这段代码就创建了2个String对象,temp指向在常量池中的,str指向堆上的,而str内部的char value[]则指向常量池中的char value[],所以这里的答案是2个对象。(这里不再详述内部过程,之前的文章有写,参考深入浅出Java String)

那之前我为什么说答案是1个的也对呢,假如就只有这一句String str = new String("hello")代码,并且此时的常量池的没有"hello"这个String,那么答案是两个;如果此时常量池中,已经存在了"hello",那么此时就只创建堆上str,而不会创建常量池中temp,(注意这里都是引用),所以此时答案就是1个。

当然,光说不练假把式,下面就来用例子验证一下:

2.2. 验证

不啰嗦,直接看第一段代码:


// 代码1

public static void main(String[] args) {

    String str = new String("hello");

    String after_str = "hello";

    System.out.println(str + after_str);

}

我们在println语句那里加个断点,debug下,如下图:

debug-code1

可以看到在代码1中,str和after_str不是同一个对象,这个应该没有疑问把,一个在堆上,一个常量池中,但是我们注意到str.value和after_str.value的地址确是同一个,即是同一个char数组,所以可以理解为,当执行str那句代码时,创建了两个String对象,一个在常量池,一个在堆上,接下来到执行after_str这句时,这种方式创建的字符串都在常量池中,但是如果常量中如果有,就直接返回了,所以这里返回的是上一句在常量池那里创建的String,所以str这句代码创建的是2个对象。

接下来再看一段代码:


// 代码2

public static void main(String[] args) {

    String before_str = "hello";

    String str = new String("hello");

    System.out.println(str + before_str);

}

同样在println打断点,如下图:

debug-code2

在代码2中,str.value和before_str.value也是用的同一个char数组,但这里的代码可不是和代码1相同的,这里我们把"hello"提到前面创建,这也就是说明当执行str那句代码时,没有再在常量池中创建"hello"了,所以str这句则是创建了1个对象。

2.3. 补充

这里突然想到,还要补充一下上面如果常量池中没有,则创建2个对象,很多人会误解这句话的含义,这个常量池,不是你没手动的创建,常量池中就没有东西,这个理解是错误的,大家一定要修正它。在你的程序启动时,就已经装载来很多class,这里面也有字符常量的创建,只是不是你自己创建的,你只是不知道而已。

例如下面这段代码:


// 代码3,JDK >= 1.7

public static void main(String[] args) {

    String str1 = new StringBuilder("hel").append("lo").toString();

    String str2 = new StringBuilder("ja").append("va").toString();



    System.out.println(str1.intern() == str1); // true

    System.out.println(str2.intern() == str2); // false

}

(关于intern在不同JDK的不同表现,之前也说过了,详情请看深入浅出Java String)

代码3这里,str1的结果是很多人都能理解的,但是str2的结果为false就说明,常量池中已经有了"java"了,这里很多人不解,这个就是系统装入的字符常量,除了"java",类似的还有"false","true"(在java.lang.String里)等等。但是这个"java"我始终没找到在那个类中,可能在native方法中把,知道的请告知下,谢谢!

在ABAQUS中使用VUMAT子程序实现Hashin失效准则的详细解析与实践:深入探讨复合材料模拟仿真的高级编程技巧 Hashin失效准则是由材料科学家Shlomo Hashin于1962年提出的一种基于能量方法的多向失效理论,主要用于预测复合材料的破坏行为。与传统的单向失效理论不同,Hashin准则考虑了材料内部的多种独立破坏机制,如基体断裂、界面脱粘、纤维断裂等,这些机制在不同应力状态下可能同时或分别发生。通过计算各个机制的能量释放率,Hashin失效准则能够更为准确地预测复合材料在复杂应力状态下的破坏行为。 阅读详情

相关推荐

Scratch离线版部署指南:解决资源缺失与页面显示异常问题

本文提供了一份详尽的Scratch离线版部署指南,旨在解决网络依赖导致的资源缺失与页面显示异常问题。通过从基础文件获取、自动化资源抓取到生产环境部署的完整流程,帮助教育工作者和开发者在无网络环境下搭建功能完整的本地Scratch编辑器,确保编程教学的顺利进行。

wine的专栏 1265

java String面试题: String s = new String(“hello“); 创建了几个对象?

/* String s = new String("hello");创建了几个对象? 答:2个 第一个:字面量"hello" ---java会创建一个String对象表示字面量"hello",并将其存入常量池 第二个:new String() ---new String()时会再创建一个字符串对象,并引用hello字符串的内容 */ String s = new String("hello"); String s1 = "hello"; System.o

DQchat的博客 2508

嵌入式常见英文2500词总结

嵌入式常见英文总结

qq_28576837的博客 1万+

new String(“hello“)之后,到底创建了几个对象?

lo存在于字符串常量池中,new String("lo")存在于堆中,String s4 = "hel" + new String("lo")实质上是两个对象的相加,编译器不会进行优化,相加的结果存在于堆中,而s1存在于字符串常量池中,当然不相等。否则,复制一份该字面量到字符串常量池并返回它的引用。接下来,JVM 会拿字面量“hello”去字符串常量池里面试图去获取它对应的 String 对象引用,如果拿不到,就会在堆内存里面创建一个”hello”的 String 对象,并且把引用保存到字符串常量池里面。

Tom弹架构 1120

逆变器母线电容选型与均压电阻设计实战指南

本文为逆变器母线电容选型与均压电阻设计提供了实战指南。文章从工程角度出发,详细解析了母线电容耐压值、容值的计算方法,并重点强调了纹波电流热设计的重要性。同时,深入探讨了串联电容均压电阻的设计原则与功率计算,通过5.5kW变频器案例,系统演示了从参数确定到最终选型的完整流程,旨在帮助工程师设计出稳定可靠的逆变器系统。

weixin_29299807的博客 294

优化Cartographer重定位速度:从子图筛选到参数调优的完整思路

本文详细介绍了优化Cartographer重定位速度的完整方法,从子图筛选到参数调优,帮助工程师在已知初始位姿的前提下将重定位耗时降低50%以上。重点分析了性能瓶颈、子图筛选策略、匹配算法选择及环境自适应的参数优化策略,并通过实战案例展示了显著效果提升。

weixin_28704565的博客 465

面试题系列第2篇:new String()创建几个对象?有你不知道的

Java面试题系列:将面试题中比较经典和核心的内容写成系列文章持续在公众号更新,可巩固基础知识,可梳理底层原理,欢迎大家持续关注【程序新视界】。本篇为面试题系列第2篇。 常见面试问题 下面代码中创建了几个对象? new String("abc"); 答案众说纷纭,有说创建了1个对象,也有说创建了2个对象。答案对,也不对,关键是要学到问题底层的原理。 底层原理分析 在上篇文章《面试题系列第1篇:说说==和equals的区别?你的回答可能是错误的》中我们已经提到,String的两种初始化形式是有本质区别的。

程序新视界 5420

Matlab中eig内置函数转为C语言

本文记录一下如何将MATLAB中的eig函数转为C语言,即通过C语言求解矩阵的特征值与特征向量。[V,D]=eig(Rx)中V为矩阵Rx的特征向量,D为矩阵的特征值。其中Rx维度为12*12的复矩阵。 首先在MATLAB端创建入口函数保存为eigvalue.m: 打开MATLAB Coder,添加入口函数: 3.在定义输入类型窗口中,需要添加输入数据来训练...

u011441044的博客 3516

Java之String详解(new String会创建几个对象问题)

如果串池中有,则并不会放入。返回已有的串池中的对象的地址如果没有,会把此对象复制一份,放入串池,并返回串池中的对象地址。

日常技术分享 6065

A Side Scan Sonar Image Denoising Algorithm Based on Compound of Fuzzy Weighted Average and Kalman F

Abstract 水下侧扫声纳图像的噪声来源:高斯噪声、脉冲、斑点噪声。 传统方法只能移除部分噪声,并且去噪后容易造成细节模糊。 本文在考虑到噪声的随机性以后,提出一种融合了模糊加权平均和卡尔曼滤波的去噪方法。 在最大化保留图像细节的基础上,同时去除高斯噪声和脉冲噪声 一.Introduction 由于海底环境和声波自身干涉的影响,声纳图像生成的图像难免会有噪点。声纳采集的图像通常会有高斯噪声、脉...

qq_44516871的博客 929

【rt-thread实战解析】从零到一:基于STM32与LAN8720A的以太网驱动配置全流程

本文详细解析了在RT-Thread操作系统上为STM32F407配置LAN8720A以太网驱动的全流程。从硬件连接自查、CubeMX工程创建、PHY复位函数编写,到RT-Thread工程配置、LwIP协议栈集成,最后进行实际上电测试与网络调试,手把手指导开发者避开常见陷阱,实现稳定的以太网连接。

m2n3b4v5c6的博客 528

new String()到底创建了几个对象?看这一篇就够了

经典面试题 String s = new String(“ab”)会创建几个对象? 相信大家肯定都被问到过这个问题,相信大家也都知道答案,对是两个,是哪两个呢? 为什么是两个呢? 哪两个? 1.new关键字在堆空间分配一块空间存放new的对象 2.在常量池中放置"ab"(前提是字符串常量池中不存在"ab") 为什么是两个?(证明) 要想了解为什么最直接的就是字节码,下面我们看一下 一目了然,第一行一个new关键字创建了一个,第三行ldc是将"ab"放置在字符常量池中,所以是两个。 如果代码携程这样 再看一

叫兽张益达的博客 3914

关于华为高斯数据库出现Invalid or unsupported by client SCRAM mechanisms定位解决的过程

最近公司有个新项目使用的是高斯数据库,因为我们的项目是直接从别的项目组拿来的,配置都是已经配好的,但是在放到正式环境上之后出现报错。起初我们以为是测试和正式的版本不一致,但是结果是版本一致的。最后这个问题搞了我们几个小时,都没法解决。

Curtisjia的博客 3188

new String()创建了几个对象?

文章目录前言一、String1.基本特性2.字符串的拼接二、new String()创建了多少个对象 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、String 1.基本特性 内部结构 jdk8及以前,使用的是char[] jdk8以后,使用的是byte[]+字符编码标识。 不可变性 1、通过字面量的方式给一个字符串赋值,是直接声明在字符串常量池中。 2、字符串常量池中是不会.

csdn15917204572的博客 7031

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java面试题:new String()创建几个对象?有你不知道的

图中两个String对象的value值的引用均为{char[3]@1355},也就是说,虽然是两个对象,但它们的value值均指向常量池中的同一个地址。按照上面的分析,如果s1+s2的结果在常量池中存了一份,那么s3中的value引用应该和s4中value的引用是一样的才对。当然,如果检索常量池时发现已经存在了对应的字符串,那么只会在堆内创建一个新的String对象,此过程只创建了1个对象。也就是说,String对象的value值直接指向了一个已经存在的数组,而并没有指向常量池中的字符串。

weixin_62421895的博客 879

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

new String()创建几个对象?

下面代码中创建了几个对象? 答案众说纷纭,有说创建了1个对象,也有说创建了2个对象。答案对,也不对,关键是要学到问题底层的原理。String的两种初始化形式是有本质区别的。 当直接赋值时,字符串“abc”会被存储在常量池中,只有1份,此时的赋值操作等于是创建0个或1个对象。如果常量池中已经存在了“abc”,那么不会再创建对象,直接将引用赋值给str1;如果常量池中没有“abc”,那么创建一个对象,并将引用赋值给str1。那么,通过new String(“abc”);的形式又是如何呢?答案是1个或2个。当JV

weixin_49698553的博客 1275

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

new String()到底创建了几个对象?

背景 在学习 《阿里巴巴Java开发手册》详解/24 代码调试的正确姿势时,无意间发现了一个在秋招面试经常会被问的问题 : 当你通过new String(“test”)时,到底会创建几个对象,是否会放入常量池? 答案 在执行这行代码前,没有字面量test字符串出现,则会创建两个实例对象, 一个在堆中,一个在常量池中 否则只会在堆中创建一个实例对象 分析 代码.V1: public cl...

旋乐的博客 1281

new-String()创建几个对象?有你不知道的

由于篇幅有限,这里就不一一罗列了,20道常见面试题(含答案)+21条MySQL性能调优经验小编已整理成Word文档或PDF文档还有更多面试复习笔记分享如下《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

2401_84048521的博客 1095

java中String s=new String() 创建了几个对象

​(空字符串)的引用,可以看到它们并不是同一个对象。​指向的字符串对象放入常量池中,并将返回的引用赋值给​。​的引用,可以看到它们是同一个对象。​创建了两个对象,一个在堆内存中,一个在常量池中。​创建了一个新的字符串对象,并将其赋值给变量​。下面是一个示例的Java代码,展示了使用​。​的值为一个空字符串。在上面的代码中,使用​。在Java中,使用​。

牛肉胡辣汤 1587

new String()会创建几个对象

问题一:new String("ab")会创建几个对象? 会创建2个对象: 对象1:new关键字在堆空间中创建的String。 对象2:字符串常量池中的对象“ab”。 public void test1(){ String str = new String("ab"); } 字节码如下: 0 new #2 <java/lang/String> // 创建String(对象1) 3 dup // 复制引用地址 4 ldc #3 <...

m0_53288098的博客 2626

new String()到底创建了几个对象

【代码】new String()到底创建了几个对象。new String("a")+new String("b")会创建几个对象?

小丁的博客 345

java 面试题: new String() 会创建几个对象?

文章目录题1: new String("ab") 会创建几个对象?题2:new String("a") + new String("b") 会创建几个对象 ? 题1: new String(“ab”) 会创建几个对象? public class StringNewTest { public static void main(String[] args) { String str = new String("ab"); } } javap -v StringNewTest.

猎人在吃肉 1万+

探究java new String()究竟创建几个对象?

new String()究竟创建几个对象? 1、由来 遇到一个java面试题,是关于String的,下面是题目的描述: //在java中,new String("hello")这样的创建方式,到底创建了几个String对象? 2、解答 2.1.分析 ​ 题目中的String创建方式,是调用String的有参构造函数,而这个有参构造函数的源码是这样的public String(String...

456

String s=new String() 创建了几个对象

可以看到,箭头指向的位置,在堆空间创建了一个对象,并没有在字符串常量去创建。我们翻译下这里的注释:创建一个副本,不要共享数组,我们在看下字节码指令。这个时候我们发现,并没有在字符串常量池创建aabb的对象,为什么呢?第二个箭头在字符串常量池创建了一个对象,所以这里是2个对象;第一个箭头,先把2个变量,在堆中创建了一个aabb对象。第三个箭头,在字符串常量池创建了aa的对象。第五个箭头,在字符串常量池创建了bb的对象。第一个箭头,在堆空间创建了一个对象。第四个箭头,在堆中创建了bb的对象。

qq_21277357的博客 739

new String()创建了几个对象

验证前奏: javac xx.java 编译java文件 javap -v xx.class 查看字节码文件 String a = "a"; 创建了1个对象,常量池1个 ldc 出现了1次 String a = new String("a"); 创建了2个对象,常量池1个,堆1个 ldc 出现了1次 String a = "a"; String b = "b"; String c = "a" + "b"; 创建了3个对象,常量池3个 字面量 "a" + "b" 在.

justchange的博客 2538

一文搞懂new String()究竟创建了几个对象?

一文搞懂new String()究竟创建了几个对象?+实例分析

m0_51358164的博客 1815
上一篇: 二叉树的镜像
下一篇: Java程序员面试题集(151-180)
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值