这个问题百度上有很多答案

有一次面试的时候,面试官也提到了这个问题。我回答了两个对象,并且解释了一个对象是 “123” 存在了字符串常量池,另一个是 s 所引用的堆中的对象。

但是面试官忽然来了一句,让我佐证一下。

我当时有点不知所措,又是扯hashcode,又是扯堆栈,感觉自己都没有回答出问题的关键。

不过现在我已经知道了

public class Test {
public static void main(String[] args) {
String s="123";
String s2=new String("123");
String intern = s2.intern();
System.out.println(intern==s);//true
System.out.println(s2==s);//false
}
}

s2.intern 会返回字符串常量池中 等于堆中s值的引用 ,及s

所以intern是等于s的


--更新2019-10-5
##java果然是越学越多,感觉自己就是个废物。
上面这个问题 其实就了更好的办法
先贴代码
```
public class Test {
public static void main(String[] args) {
String ss=new String("123");
}
}
```
然后查看下编译好的class文件就ok了,我用的是idea的jclasslib插件
如图
![](https://img2018.cnblogs.com/blog/1782870/201910/1782870-20191005140311234-56254684.png)
可以看到main方法被编译成了以下字节码
```
0 new #2 //new 创建对象 放在堆中
3 dup //dup 把new出来的对象的引用放入栈,这么是因为后面invokespecial 需要这个引用 去初始化,如果不入栈就找不到这个引用了。
4 ldc #3 //Push item from run-time constant pool 放入运行常量池
6 invokespecial #4 > //初始化上面dup压入栈的引用 这里就是String
9 astore_1 //Store reference into local variable
10 return
```
可以很清楚的看到 一个在堆,一个常量池

String s=new String("123") 创建了两个对象,及证明的更多相关文章

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

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

  2. String是否相等、new的时候创建了几个对象等问题详解

    问题一 这段代码创建了几个对象? String str1 = new String("aa"); 答案是两个 "aa"对象和String对象 Java代码在编译 ...

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

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

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

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

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

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

  6. Java String Pool--String s = new String("a") 到底创建了几个对象?

    本篇重点(tips): 1. String Pool 是以Java 中 String 对象是不可变的这一特性为基础的 2. String Pool是Heap(堆)中的一块特殊空间(JDK 1.7 之前 ...

  7. String s=“dd”和String s=new String("dd")区别

    Java中String s="dd"的话会先检查常量池中是否有"dd"这个字符串,如果没有则创建一个,然后将s指向字符串的地址,而new String(&quo ...

  8. Java避免创建不必要的对象

    小Alan最近看到了<Effective Java>这本书,这本书包含的内容非常丰富,这本书我就不多介绍了,只能默默的说一句,作为一名java开发错过了这本书难免会成为一个小遗憾,所以还是 ...

  9. 使用C#表达式树为两个对象的相同属性赋值

    //缓存表达式树 private static Dictionary<string, object> objCache = new Dictionary<string, object ...

随机推荐

  1. 品Spring:帝国的基石

    序 生活是一杯酒,有时需要麻醉自己,才能够暂时忘却痛苦与不快.生活是一杯茶,有时需要细细品味,才发现苦涩背后也会有甘甜. Spring是一杯酒,一眼望不到边的官方文档,着实让人难以下咽.Spring是 ...

  2. 蓝桥杯 algo122 未名湖的烦恼 简单题

    #include <iostream> using namespace std; int m, n, ans; void solve(int m, int n, int cnt) { &a ...

  3. 一个selenium简单案例自动添加数据

    //本来想着用execl来录入数据的,但是为了尽快完成所以直接搞了个数组 package aldtest; import org.openqa.selenium.*; import org.openq ...

  4. pt-archiver归档数据 源库和目标库是否会出现不一致

    背景 归档的表在源库和目标库都要存在 pt-archiver归档表的场景有:不删原表数据,非批量插入目标库:不删原表数据,批量插入目标库:非批量删除原表数据,非批量插入目标库:批量删除原表数据,批量插 ...

  5. 读《深入理解Elasticsearch》点滴-聚合-top_hits

    以下是官网手册(部分)(v5.1) 直接直接看官网手册 https://www.elastic.co/guide/en/elasticsearch/reference/5.1/search-aggre ...

  6. pip换源

    PIP 下载慢,给你Python3的pip换个源 一键换源 文章来源:企鹅号 - 从零开始学习python 要实现一键换源需要安装一个模块 pip install pqi PQI相关命令 PQI获取当 ...

  7. Build step 'Invoke top-level Maven targets' marked build as failure Finished解决

    最近用法 jenkins部署maven项目时候,突然出现Build step 'Invoke top-level Maven targets' marked build as failure Fini ...

  8. office2019激活

    这个是在网上偶然看见的一个激活方式,分享一下. 复制如下代码保存后修改文件后缀名为".bat",请注意有一个点,然后保存以管理员身份运行即可: @echo off(cd /d &q ...

  9. 完美实现保存和加载easyui datagrid自定义调整列宽位置隐藏属性功能

    需求&场景 例表查询是业务系统中使用最多也是最基础功能,但也是调整最平凡,不同的用户对数据的要求也不一样,所以在系统正式使用后,做为开发恨不得坐在业务边上,根据他们的要求进行调整,需要调整最多 ...

  10. PHP--网络协议相关知识

    HTTP状态码 HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码. HTTP状态码主要有5种,代表5种不同类型的响应: 1xx:信息性状态码,代表接 ...