感谢博主分享:https://www.cnblogs.com/zhaideyou/p/5875175.html

但是如果代码是这样子的:

  1. String str1 = "abc";
  2. String str2 = new String("abc");

嗯,创建几个就不好说了,我们还是测试一下吧,首先我们打开cmd.exe, 通过javac *.java编译好该Java文件,然后通过命令javap -c *来查看java编译后的ByteCode字节码,

ldc的含义是:将常量值从常量池中取出来并且压入栈中。从上图中,我们可以看到第0行和第7行中的字符串引用是同一个,这说明了,在编译期间,该字符串变量的值已经确定了下来,并且将该字符串值缓存在缓冲区中,同时让该变量指向该字符串值,后面如果有使用相同的字符串值,则继续指向同一个字符串值

所以String str2 = new String("abc"); 此时就创建一个对象,而abc 则是从字符串常量缓冲区中取出来的。

ok。就是这个样子。

String str = new String("abc"); 首先要看常量池里是否有“abc”这个字符串,如果有,则创建一个,如果没有,则创建两个。
我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String("abc")了。那么,new String("abc")为什么又能被看成"abc"和new String()呢?
我们来看一下被我们调用了的String的构造器: 
public String(String original) { //other code ... } 大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种:
一,使用new创建对象。 
二、调用Class类的newInstance方法,利用反射机制创建对象。
我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abc"。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本。

字节码 看 new String("abc")创建了几个对象的更多相关文章

  1. 面试题之String str = new String("abc"); 创建了几个对象

    今天去面试的时候碰到了这个问题:String str = new String("abc"); 创建了几个对象,回来自己研究并查阅资料才发现答错了..网上的争论不少,有的说是两个, ...

  2. 面试题系列:new String("abc")创建了几个对象

    new String("abc")创建了几个对象 面试官考察点猜想 这种问题,考察你对JVM的理解程度.涉及到常量池.对象内存分配等问题. 涉及背景知识详解 在分析这个问题之前,我 ...

  3. java中String s = new String("abc")创建了几个对象?

    答案是两个,现在我们具体的说一下: String s = new String("abc");一.我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变 ...

  4. 【转载】java 中 String s = new String("abc") 创建了几个对象?!

    原文链接点这里,感谢博主分享 答案是两个,现在我们具体的说一下: String s = new String("abc"); 首先我们要明白两个概念,引用变量和对象,对象一般通过n ...

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

    String str=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 答案应该是1个或者2个. 1个 ...

  6. String a=new String("abc")创建了几个对象

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

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

    这个问题相信每个学习java的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为 ...

  8. 从字节码看java中 this 的隐式传参

    从字节码看java中 this 隐式传参具体体现(和python中的self如出一辙,但是比python中藏得更深),也发现了 static 与 非 static 方法的区别所在! static与非s ...

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

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

  10. 从字节码看java类型转换【 深入理解 (T[]) new Object[size] 】

    我们都知道,java中对类型的检查是很严格的,所以我们平操作时,也往往很小心. 如题: (T[]) new Object[size],这种写法是一般我们是不会干的!但是有点经验的同学,还是会遇到这样写 ...

随机推荐

  1. CAD轴测图怎么画?快来试试浩辰CAD超级轴测命令!

    很多新手设计师小伙伴,不知道CAD轴测图怎么画?其实很简单,浩辰CAD中的超级轴测功能,可以方便地将CAD平面图转化为轴侧图,是绘制管线系统图的好帮手.今天就和小编一起来看看在浩辰CAD软件中通过调用 ...

  2. POWER BI - 根据条件,改变数值的颜色Conditional formatting

    在visual块,右键Column选择Conditional formatting 举例,比如difference > 0 显示红色,否则<0显示绿色 如何根据 measure 写特定条件 ...

  3. linux下第三方库的配置和链接——以opencv为例

    安装OpenCV(可参考链接) 下载source到 /usr/local/路径下 新建 /build/ cmake 编译 添加库路径 vim /etc/ld.so.conf 该目录作用参考链接 输入: ...

  4. 前后端API交互数据加密——AES与RSA混合加密完整实例(转载)

    前言 前段时间看到一篇文章讲如何保证API调用时数据的安全性(传送门:https://blog.csdn.net/ityouknow/article/details/80603617),文中讲到利用R ...

  5. 【10】python之条件判断

    Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块. Python中没有switch – case语句,也没有三元运算符. 1.if 语句 Pytho ...

  6. 睿爸信奥-【临阵磨枪】练习赛(第二场)- T2

    目录 题面 code 题面 徐老师在[睿爸信奥]里面颇受学生欢迎,有一天校长石老师想要搞个最受欢迎老师投票,徐老师就很想拿到这个奖.假设有 名候选者,有 人参加了投票,与以往不同的是,这次所有得票数超 ...

  7. java第七周学习情况

    这个星期 主要是在搞学校在暑期安排的实验报告b 怎么说来着 才知道这个消息几天  这是对学习不上心的体现啊 题目也有点多 慢慢做呗 而Java这边还是看些相关知识呗 说实话 已经学不太懂了 不过没关系 ...

  8. ionic 架构

    1.路由:rout,页面内容:html,页面css:scss,js脚本内容:ts 2.功能介绍 路由:负责组织每个页面. 页面css:scss,负责定制每个组件的内容,比如组件是iobag,那么在这个 ...

  9. Word06 黑客技术office真题

    1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分. 2.这一步非常的简单,打开下载素材文件,在[文 ...

  10. vue保持滚动条在底部

    mounted() { this.scrollToBottom(); }, updated: function () { this.scrollToBottom(); }, scrollToBotto ...