Java String Pool--String s = new String("a") 到底创建了几个对象?
本篇重点(tips):
1. String Pool 是以Java 中 String 对象是不可变的这一特性为基础的
2. String Pool是Heap(堆)中的一块特殊空间(JDK 1.7 之前不是,是在PermGen里面,从1.7开始在heap里面了),存储不重复的String 常量
3. 用new关键字和用 "" 创建String 的方式有所不同。new 关键字每次都会在heap中创建一个新的String 对象, 用"" 创建(这种创建方式学名儿叫String Literal),如果String Pool中已经存在相同值的String 对象则直接返回。这两种方式创建的都是String Object.
实例讲解
line 1: String s = new String("A")
这是我们的第一行代码, 在String Pool中没有“A”这个常量, 所以会先在String Pool中创建“A”。 然后因为有new关键字, 也会在Heap 中也创建一个对象“A”,s指向heap中创建的“A”对象。 所以在这一步中创建了两个对象。如图:

line 2: String s1 = new String("A")
这时候String Pool 中已经有了对象“A”,String Pool中不再创建。 但因为new关键字,会在heap中再创建一个新的对象“A”, s1指向这个新创建的对象。如图:

line 3: String s2 = "A"
查看String Pool中有“A” , 直接指向它
line 4: String s3 = "B"
在String Pool中不存在“B”,在String Pool中创建“B”
line 5: String s4 = "A"
查看String Pool中有“A” , 直接指向它
最终如下图所示:

运行代码测试:
1 String s = new String("A");
2 String s1 = new String("A");
3 String s2 = "A";
4 String s3 = "B";
5 String s4 = "A";
6
7 System.out.println("s == s1:"+(s == s1));
8 System.out.println("s == s2:"+(s == s2));
9 System.out.println("s1 == s2:"+(s1 == s2));
10 System.out.println("s2 == s4:"+(s2 == s4));
11 System.out.println("s2 == s3:"+(s2 == s3));
结果:
s == s1:false
s == s2:false
s1 == s2:false
s2 == s4:true
s2 == s3:false
注意line 7~line 11, 比较操作要加上() 哦, 第一次跑的时候没加,结果都是false,仔细看了一下才想起来,算数运算符的优先级高于比较运算符。有时候我们知道一件事,但应用中还是容易忽略。
结论:
所以尽量还是使用""(Literal)的方式创建String, 这样值相同的String使用Pool中这一个对象, 节省空间。这个做法学名儿又叫String interning。
Java String Pool--String s = new String("a") 到底创建了几个对象?的更多相关文章
- new String("ab")到底创建了几个对象说明
new String("ab")到底创建了几个对象? 之前一直被这个问题困扰,网上一些描述的都不是很清楚,自己看了一些资料可算搞清楚了,那就在博客上记录一下吧! String st ...
- String s="a"+"b"+"c",到底创建了几个对象?
首先看一下这道常见的面试题,下面代码中,会创建几个字符串对象? String s="a"+"b"+"c"; 如果你比较一下Java源代码和反 ...
- String,你到底创建了几个对象????
String str=new String("aaa"); 这行代码究竟创建了几个String对象呢?答案是2个,而不是3个.由于 new String("aaa&quo ...
- String,到底创建了多少个对象?
String str=new String("aaa"); <span style="font-size:14px;">String str=n ...
- ThreadPoolExecutor – Java Thread Pool Example(如何使用Executor框架创建一个线程池)
Java thread pool manages the pool of worker threads, it contains a queue that keeps tasks waiting to ...
- 【Java】Java创建String时,什么情况放进String Pool?
对Java创建String是否放入String pool作代码性的试验. 参考的优秀文章 JAVA面试题解惑系列(二)——到底创建了几个String对象? public String(String o ...
- Java String类相关知识梳理(含字符串常量池(String Pool)知识)
目录 1. String类是什么 1.1 定义 1.2 类结构 1.3 所在的包 2. String类的底层数据结构 3. 关于 intern() 方法(重点) 3.1 作用 3.2 字符串常量池(S ...
- 工作10年后,再看String s = new String("xyz") 创建了几个对象?
这个问题相信每个学习java的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为 ...
- new String创建了几个对象
String str = new String(“abc”) 到底创建了几个对象? 首先String str是定义了一个字符串变量,并未产生对象,=不产生对象,那么只有后面的new String(& ...
随机推荐
- 复制docker容器中的nginx某个文件到linux中
前提:docker容器中的nginx要开启
- C语言动态输出等腰三角形
C语言动态输出等腰三角形 题目要求:输入行数 打印出对应行数的等腰三角形,要求使用for循环嵌套. 思路 while语句写外层死循环 用于判断输出的数据: 分析: 最外层for,来控制最外层行数,存储 ...
- Java服务假死后续之内存溢出
一.现象分析 上篇博客说到,Java服务假死的原因是使用了Guava缓存,30分钟的有效期导致Full GC无法回收内存.经过优化后,已经不再使用Guava缓存,实时查询数据.从短期效果来看,确实解决 ...
- Codeforces Round #804 (Div. 2)
题目链接 A The Third Three Number Problem 题意 给你一个n,让你求满足的a,b,c. 如果不存在则输出-1. 思路 显然任意a,b,c是不可能得到奇数. 只考虑偶数 ...
- linux firewall (marker)
查看防火墙是否开启systemctl status firewalld 若没有开启则是开启状态systemctl start firewalld 关闭则start改为stop 查看所有开启的端口fi ...
- idea 错误: 找不到或无法加载主类 xx.xxx.Application
原因module 里面缺少iml文件 生成iml文件方法二:(建议):刷新一下Maven Project就会自动生成.iml文件.点击下图红框标记的按钮即可 完成后就会自动生成.iml文件. 方法二: ...
- SpringBoot集成文件 - 集成POI之Excel导入导出
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能.本文主要介绍通过Spr ...
- 多人共用一个Linux用户, 实现Bash配置文件独立
本文中提到的 账户, 用户 均表示同一概念. 例如 ssh wbourne@192.168.xxx.101, 账户, 用户 指的均是 wbourne. 背景 在工作中, 我们经常会连接Linux服务器 ...
- [USACO 2009 Mar S]Look Up_via牛客网
题目 链接:https://ac.nowcoder.com/acm/contest/28537/N 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...
- 非root用户安装科学计算包blas、lapack和FFTW
一.安装FFTW 1.下载安装包 下载地址:http://www.fftw.org/download.html 2.编译安装 tar -zxvf fftw-3.3.10.tar.gz cd fftw ...