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

一、你能回答正确吗

String a = "123";

如上定义的为常量;

String b = a +"456";

如上 b 为变量,为啥? 难道常量拼接常量得到的是变量吗?

不是,常量拼接常量得到的依旧是常量。

但是此时将 a 作为引用,a 已经不再是常量了,是变量了,所以得到的 b 自然就是变量。

String b = "123" + "456";

此时 b 为常量。

如果给 a 加上修饰符 final ,那么 a 就是个常量,那么 b 就为常量了。


二、String定义常量和变量的区别

我们再来通过两种写法分析:

String a = "123";String b = new String("123");

如上第1行,定义了一个常量 a ,第2行,通过关键字 new 的形式,创建了一个变量 b 。

我们结合之前学过的 JVm 再深入一些,第1行在常量池开辟了一块空间,存放字符串 123,通过 a 对象指向这个常量对象。第2行由于使用了 new 关键字,所以会在堆空间中开辟一块内存区域,在其中存放字符串 123,并把内存的地址赋予 b 变量。

所以, a==b 吗?显示是 false,一个是堆内存,一个是常量池。

如果将 a 修改成:

String a = new String("123");

那么,a==b 吗?

依旧是 false。

为什么?只要通过 new 形式,自然是创建两个对象,所以是 false,即便是他们的值是一致的。

三、String常量变量的总结

String 常量存放在常量池中,jvm处于优化考虑,会让内容一致的对象共享内存块,但变量是放在堆空间中的,new 定义的不同变量内存地址不同。

String 常量连接常量,还是常量,依旧用常量池管理,但常量连接变量就是变量了。

四、创建几个对象的练习

以下几种情况(均不考虑字符串在常量池中已存在的情况):

1、String a="123";

创建了1个对象

jvm在编译阶段会判断常量池中是否有 "123" 这个常量对象如果有,a直接指向这个常量的引用,如果没有会在常量池里创建这个常量对象。

2、String a=new String("123");

创建了2个对象

同情况1,jvm编译阶段判断常量池中 "123"存在与否,进而来判断是否创建常量对象,然后运行阶段通过new关键字在java heap创建String对象。

3、String a="123"+"456";

创建了1个对象

jvm编译阶段过编译器优化后会把字符串常量直接合并成"123456",所有创建对象时最多会在常量池中创建1个对象。

4、String a="123"+new String("456");

创建了4个对象

常量池对象"123" ,"456",new String("456")创建堆对象,还有一个堆对象"123456"。

最后练习参考文章:https://blog.csdn.net/baidu_27969827/article/details/79219708

new String(123) 创建了几个对象?相关推荐

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

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

  2. String s = new String(“hello“)创建了几个对象(图解)

    文章目录 String s = new String("hello");创建了几个对象 字符串常量拼接 0.判断输出 1.判断输出 2.判断输出 3.判断输出 4.判断输出 5.判 ...

  3. String str = new String(abc)创建了几个对象?结合源码解析

    String str = new String("abc")创建了几个对象?结合源码解析 首先,我们看一下jdk源码: 1 /** 2 * Initializes a newly ...

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

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

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

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

  6. String s = new String(xyz);创建了几个对象?

    两个或一个都有可能 . "xyz"对应一个对象,这个对象放在字符串常量池,常量"xyz"不管出现多少遍,都是常量池中的那一个. new String每写一遍,就 ...

  7. string s = new string(“xyz“);创建了几个对象_「005」-JavaSE面试题(五):String类

    第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [005] - JavaSE面试题(五):String类 第1问:String.StringBuf ...

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

    Java面试题系列:将面试题中比较经典和核心的内容写成系列文章持续在公众号更新,可巩固基础知识,可梳理底层原理,欢迎大家持续关注[程序新视界].本篇为面试题系列第2篇. 常见面试问题 下面代码中创建了 ...

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

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

最新文章

  1. pandas.set_index()
  2. Metrics.NET源码阅读笔记
  3. Asp.net读取AD域信息的方法(一)
  4. Problem executing scripts APT::Update::Post-Invoke-Success ‘if /usr/bin/test -w /var/lib/command-not
  5. Turtle库的学习积累
  6. android+java.lang.VerifyError
  7. python倒三角形粉色填充笔的形状海龟_Python001-Turtle(海龟绘图)详解
  8. 论文浅尝 | 基于事理图谱的脚本事件预测
  9. matlab的m函数入门2
  10. 表达式计算:后缀表达式求解 以及 中缀表达式转换为后缀表达式
  11. JavaScript 常用技巧收集
  12. 软考之软件设计师(教程电子版、历年真题详解、其他资料)
  13. 用一套键鼠控制两台主机
  14. allegro设置规则
  15. 快速下载720云高清全景图片
  16. 使用python将ppt文件批量转为pptx、批量提取ppt中的文字保存
  17. 绿纹龙的森林游记——UPC
  18. cups ipp oracle,基于IPP的逐步打印服务器使用CUPS
  19. python count函数时间复杂度_关于python:了解如何测量函数的时间复杂度
  20. 我终于明白了!!!类、成员变量、方法、以及如何定义他们,还有static到底干啥用?

热门文章

  1. [vue] vue生命周期总共有几个阶段?
  2. [css] css的加载会阻塞DOM树解析和渲染吗?为什么
  3. 前端学习(2001)vue之电商管理系统电商系统之获取商品分类数据
  4. 前端学习(1509):单页应用SPA特点
  5. git学习(10):Git的使用--如何将本地项目上传到Github(两种简单、方便的方法)
  6. java canvas 缩放图片_详解如何用HTML5 Canvas API控制图片的缩放变换
  7. stylus之方法(Functions)
  8. CS144 lab2 笔记
  9. linux gst-launch 播放视频旋转,【视频开发】Gstreamer中一些gst-launch常用命令
  10. 说说mysql_说说MySQL权限 - andyqian的个人空间 - OSCHINA - 中文开源技术交流社区