分享一波:程序员赚外快-必看的巅峰干货

前言

今天上班划水的过程中有人询问到这个问题,网上对于这个问题也有争议,有说创建了一个对象,有说两个,有说三个。

首先说三个的肯定是扯淡了,今天来讨论一下这条语句到底创建了几个对象。

在进入正题之前,先回顾一下几个基础知识。
常量池

常量池是为了避免对对象的重复创建和销毁而影响系统性能,从而实现对象共享。在编译期就能确定的字符串,会被存放到常量池中,如String s = “123”;。此后如果使用到123这个字符串,就会直接从常量池中获取,而不用每次都再new一个123出来。关于常量池更详细的知识点,请阅读这篇文章 Java常量池
对象比较

==和equals的区别想必就不需要我着重介绍了,equals比较的是值,==比较引用类型时,比较的是地址。
进入正题

稍微介绍了一下上面两个基础知识点,下面进入正题,String s = new String(“123”)究竟创建了几个对象?这里先说结论,第一次创建了两个,第二次创建了一个。

我们来分析这条语句。首先s是一个引用变量,用来接收new的String,因此s不是一个对象。new String是典型的创建一个对象,放到堆中。而"123"也是个对象,123在编译期就可以确定,因此是放到常量池。上面这句代码可以拆成下面两条。

String temp = “123”;
String s = new String(temp);

这样就很容易理解了,String temp = "123"毫无疑问是创建了一个对象,new String(temp)又创建了一个对象,因此是两个。

那么创建一个对象的结论是从何而来的?

首先来通过代码证明一下常量池是否存在。

String s1 = “123”;
String s2 = “123”;
System.out.println(s1 == s2);

s1和s2都是字符串对象,通过==比较的是二者地址,运行结果为true,说明二者地址相同,是同一个对象。

在 String s1 = “123”;这条语句中,创建了一个对象"123",放入常量池中,下面的String s2 = “123”;从常量池中取出了123并赋值给s2,因此s2这条语句没有创建对象。

那么我们看下面的代码。

String temp = “123”;
String s1 = new String(temp);

String temp2 = “123”;
String s2 = new String(temp2);

在这个代码中,上面的代码创建了两个对象,分别是"123"和new String(“123”),接着, 123被存入常量池中。下面的代码取出123并new String(“123”),只创建了一个对象。
结语

在 String s = new String(“123”) 这条语句中

当常量池中不存在123时,创建了两个对象。

当常量池中存在123时,创建了一个对象。

*************************************优雅的分割线 **********************************

分享一波:程序员赚外快-必看的巅峰干货

如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程

请关注微信公众号:HB荷包

一个能让你学习技术和赚钱方法的公众号,持续更新

String s = new String(123) 究竟创建了几个对象相关推荐

  1. 【Java深入理解】String str = “a“ + “b“ + “c“到底创建了几个对象?

    String str = "a" + "b" + "c"到底创建了几个对象?这是我们在讨论中最经常遇到的一个问题同时也是面试题.我们都知道在 ...

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

    String 对象可谓再熟悉不过了,与此相关的面试题经常会引出内存性能优化的问题,本篇主要以 new String("123") 创建了几个对象为例记录. 一.你能回答正确吗 St ...

  3. String s=new String(abc)创建了2个对象的原因

    问题:String str=new String("abc"); 这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案也是众所周知的,2个. 接下来我们就从这 ...

  4. java的知识点15——String基础、String类和常量池、String类常用的方法、字符串相等的判断、组合模式

    String基础 1. String类又称作不可变字符序列. 2. String位于java.lang包中,Java程序默认导入java.lang包下的所有类. 3. Java字符串就是Unicode ...

  5. 云端飘 String s=new String(abc)创建了几个对象?

    转自:http://www.cnblogs.com/ydpvictor/archive/2012/09/09/2677260.html -------------------------------- ...

  6. java string对象创建对象_Java String 创建了几个对象

    我们首先来看一段代码: Java代码 String str=new String("abc"); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢 ...

  7. Java:面试题:String s=new String(abc)创建了几个对象?

    String str=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 相信大家对这道题并不陌生,答案 ...

  8. 美团面试题:String s = new String(111)会创建几个对象?

    点击关注公众号,Java干货及时送达 来源:blog.csdn.net/o9109003234/article/details/109523691 String不可变吗? public class A ...

  9. 工作10年后,再看String s = new String(xyz) 创建了几个对象?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 转自:艾小仙 这个问题相信每个学习java的同学都不陌生, ...

最新文章

  1. Linux多用户、多任务的特性
  2. 告别2019,展望2020:让我们看一看这十年中深度学习的经典瞬间
  3. POJ 2456 Aggressive cows ( 二分 贪心 )
  4. mfc控件变量没定义_WinCC字符串归档变量查询
  5. STM32开发 -- 外部中断详解
  6. java 实验张智,JAVA实验指导
  7. Spring-Cloud中的 熔断、限流、降级
  8. 栈,堆,值类型,引用类型,装箱,拆箱 .NET中 6个重要的概念
  9. instancing render
  10. mysql启动redis_docker一系列mysql,redis,centos啥的启动参数记个笔记
  11. 单例模式Java的七种写法
  12. Spring Boot 知识笔记(集成zookeeper)
  13. 红外夜视摄像头 蒂卡尔K-TF使用手记 2
  14. gdiPlus 显示图片缩放不正确的可能解决方案
  15. 记一个typeorm问题 Main alise is not set
  16. 数据科学的重要支柱——统计学的最佳入门书籍
  17. 几种排序算法的稳定性分析
  18. 企业承担社会责任的必要性
  19. Spring Cloud Stream Rabbit 3.1.3 入门实践
  20. 手把手教你写第一个Windows窗口

热门文章

  1. 服务器日志文件中包含堆栈跟踪,日志框架 Logback 官方手册(第三章:Configuration)...
  2. mysql怎么把datetime类型转换_mysql怎样实现time转datetime
  3. 采用Kruskal算法生成最小生成树,并采用并查集的合并优化和查询优化。
  4. JSP访问数据库,Session对象和九大内置对象
  5. python实现队列_Python学习教程:用队列实现栈
  6. html制作卡通图案代码,CSS画的卡通动画图案
  7. python能和wincc一起用_搬家第二天-41.Wincc V7.3 利用Inputbox和Msgbox做权限管理和二次确认设计...
  8. arm与linux的些许问题,《ARM与Linux些许问题》第一章:ARM工作模式
  9. java快捷键 --_Java中的快捷方式“或分配”(| =)运算符
  10. ros构建机器人运动学模型_ROS入门学习之八机器人综合应用