new String("123") 创建了几个对象?】的更多相关文章

String 对象可谓再熟悉不过了,与此相关的面试题经常会引出内存性能优化的问题,本篇主要以 new String("123") 创建了几个对象为例记录. 一.你能回答正确吗 String a = "123"; 如上定义的为常量: String b = a +"456"; 如上 b 为变量,为啥? 难道常量拼接常量得到的是变量吗? 不是,常量拼接常量得到的依旧是常量. 但是此时将 a 作为引用,a 已经不再是常量了,是变量了,所以得到的 b 自然…
这个问题百度上有很多答案 有一次面试的时候,面试官也提到了这个问题.我回答了两个对象,并且解释了一个对象是 "123" 存在了字符串常量池,另一个是 s 所引用的堆中的对象. 但是面试官忽然来了一句,让我佐证一下. 我当时有点不知所措,又是扯hashcode,又是扯堆栈,感觉自己都没有回答出问题的关键. 不过现在我已经知道了 public class Test { public static void main(String[] args) { String s="123&q…
今天去面试的时候碰到了这个问题:String str = new String("abc"); 创建了几个对象,回来自己研究并查阅资料才发现答错了..网上的争论不少,有的说是两个,答案应该是:两个或一个理由解释如下:都了解java 的字符串常量缓冲区(字符串池,字符串常量池),如果代码是这样的: String str2 = new String("abc"); 并且 abc 字符串之前没有用过,这毫无疑问创建了两个对象,一个是new  String 创建的一个新的对…
这个问题相信每个学习java的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为还是有必要来说一说这个问题的. 从方法区说起 常量池存在于方法区,而方法区在jdk1.7版本前后改变比较大,所以还是先来说说方法区的演变. 在jdk1.7版本之前,常量池存在于方法区,方法区是堆的一个逻辑部分,他有一个名字叫做非堆. 1.7版本把字符串常量池放到了堆中. 而在1.8以后,则是移除了永…
new String("abc")创建了几个对象 面试官考察点猜想 这种问题,考察你对JVM的理解程度.涉及到常量池.对象内存分配等问题. 涉及背景知识详解 在分析这个问题之前,我们先来了解一下JVM的组成,如图所示. 在JVM1.8中,内存划分为堆.程序计数器.本地方发栈.方法区(元空间).虚拟机栈. JVM知识点普及 下面分别解释一下JVM运行时内存的功能. 堆内存空间 堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中.堆被划分为…
1 最近几个同学面试的时候出现了这样一个问题 刚听到这个题目的时候的确是不知所措: 经过网上的查找和自己的理解来解释一下这个题目的答案 答案是: 为什么呢??? 1 实现我们都知道创建实例有两种方法 (1)一是用new来创建 (2)二是同过放射实例来创建,(classs.newInstances) 所以这就很好的解释了一种情况了 第二 对于String 类型的还有一种文本创建方式,就是下面我所说的这种 String a="abc"; 因为String 是一个final类,JVM虚拟机在…
答案是两个,现在我们具体的说一下: String s = new String("abc");一.我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量.所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字池中,文字池的一个好处就是可以把相同的字符串合并,占用一个空间,我们可以用==判断一下两个引用变量是否指向了一个地址即一个对象. public class Demo02 { public…
原文链接点这里,感谢博主分享 答案是两个,现在我们具体的说一下: String s = new String("abc"); 首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量. 所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字池中,文字池的一个好处就是可以把相同的字符串合并,占用一个空间,我们可以用==判断一下两个引用变量是否指向了一个地址即一个对象 public class …
两个或一个都有可能 . ”xyz”对应一个对象,这个对象放在字符串常量池,常量”xyz”不管出现多少遍,都是常量池中的那一个. new String每写一遍,就创建一个新的对象,它使用常量”xyz”对象的内容来创建出一个新String对象. 如果常量池中已经存在’xyz’,那么这里就不会创建”xyz”了,直接从常量池拿,这时创建了一个对象: 如果常量池中不存在"xyz",那么此时就会创建一个对象并放入常量池,这种情况它创建两个对象.…
String str=new String("abc");   紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢? 答案应该是1个或者2个. 1个的情况:如果字符串池中已经存在了"abc"这个对象,那么直接在创建一个对象放入堆中,返回str引用. 2个的情况:如果字符串池中未找到"abd"这个对象,那么分别在堆中和字符串池中创建一个对象,字符串池中的比较都是采用equals()方法. 接下来我们就从这道题展开,一…