String与常量池(JDK1.8)
---- 基础知识
String是final类, 并且其方法都被final修饰
String通过char数组来保存字符串
对String对象的任何操作都不会影响到原来的String对象, 所有的改变都会创建新String对象
---- 创建与内存场景分析
?--- 常量赋值
代码:

内存图:

分析:对于常量赋值来说, 变量s1始终指向了字符串常量池的字符串(只有一份)
?--- new String("xxx");的运行
代码:

源代码:

内存图:

分析:
首先先来考虑一下这一句的执行过程,这句一共生成了两个对象,分别是“abc” 和 new String("abc"),考虑类的加载对一个类只会执行一次,“abc”在类加载的时就已经创建驻留(如果该类加载之前已经有"abc"字符串驻留了,那么不需要重复创建用于驻留的"abc"实例)。驻留的字符串是放在全局共享的字符串常量池中的。
在这段代码后续被运行的时候,"abc"字面量对应的String实例已经固定了,不会再被重复创建。所以这段代码将常量池中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给s1 持有。所以可以看到“abc” 是存在于常量池中 ,而s1指向堆里的对象。
?---常量字符串的拼接(使用+)
代码:

内存图:

分析:
当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量, 该字符串是在编译期就能确定。先是在池里生成“a”和“b”,再通过拼接的方式生成"ab"
若一个String对象被final修饰, 并且形式为final String s = "xxx";可以将之看做是常量
?---非常量字符串拼接(使用+)
代码:

内存图:

分析:
这句话一共生成了5个对象,首先会先在池子生成“a”和“b”,然后会在堆里生成对象new String("a") 和 new String("b),这两个对象分别指向常量池的所对应的字符串,接着由于“+”的作用下,创建了新的对象,这个对象通过利用之前的对象所指向的字符进行拼接生成“ab”,即这波操作是在堆里实现的,不会将生成的"ab"放在常量池里,此时之前的两个对象已经没有作用了,需要等待垃圾回收。
?---小结
不管是new String("XXX")和直接常量赋值, 都会在字符串常量池创建.只是new String("XXX")方式会在堆中创建一个中转站去指向常量池的对象, 而常量赋值的变量直接赋值给变量
当使用了变量字符串的拼接(+, sb.append)都只会在堆区创建该字符串对象, 并不会在常量池创建新生成的字符串
----String intern()方法
用法解释:
当调用intern方法时,如果池已经包含与equals(Object)方法确定的相当于此String对象的字符串,则返回来自池的字符串。 否则,此String对象将添加到池中,并返回对此String对象的引用
举个栗子
代码:

内存图:

分析:
可以看出,是先在池里创建“a”好后,返回一个对象引用赋给堆里的对象new String("a"),也就s1所指向的地方,在堆里。通过调用 intern() 方法,在池里找到S1对象所对应的字符串,并且进行返回给S2对象,所以S2所指向的地方,在常量池里。
举个栗子
代码:

内存图:

分析:由于常量池不存在ba, 所以返回堆区ba的地址并添加到常量池中, s2指向了常量池的inte指针
---- 谈谈 “+”
若+号前后为常量,编译期会处理
若+号前后存在着变量,首先以最左边的字符串为参数创建StringBuilder对象,然后依次对右边进行append操作,最后将StringBuilder对象通过toString()方法转换成String对象
参考资料: https://blog.csdn.net/qq_26222859/article/details/73135660#commentBox
String与常量池(JDK1.8)的更多相关文章
- 基本数据类型的常量池与String类型常量池解析
抛出样例: Integer a1 = new Integer(123); Integer a2 = new Integer(123); System.out.print ...
- Java中的String与常量池[转帖]
string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...
- Java中的String与常量池
string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...
- String对象常量池特性对synchronized对象的影响
一 .什么是String的常量池特性 对于字符串对象有两种创建方法,如下: 直接赋值法: String str1="直接赋值创建字符串"; 创建对象法: String str2=n ...
- java 多线程10:synchronized锁机制 之 锁定类静态方法 和锁定类.Class 和 数据String的常量池特性
同步静态方法 synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁.看一下例子,注意一下printC()并不是一个静态方法: public ...
- 转载:Java中的String与常量池
转载自http://developer.51cto.com/art/201106/266454.htm.感觉总结的不错,自己收藏一下. string是java中的字符串.String类是不可变的,对S ...
- (转)Java中的String与常量池
Java中的String与常量池 转自:http://developer.51cto.com/art/201106/266454.htm string是java中的字符串.String类是不可变的,对 ...
- Java中String字符串常量池总结
最近到广州某建站互联网公司面试,当时面试官问假设有两个字符串String a="abc",String b = "abc";问输出a==b是true还是fals ...
- String与常量池
转自:http://blog.sina.com.cn/s/blog_69dcd5ed0101171h.html 1. 首先String不属于8种基本数据类型,String是一个对象.因为对象的默认值是 ...
随机推荐
- Ruby 动态生成变量
创建: 2018/03/21 更新: 2018/03/22 把标题ruby首字母大写 方法一: eval将字符串作为代码执行, 故写在里边 eval("@#{view_name.to_s} ...
- Educational Codeforces Round 19 E. Array Queries(暴力)(DP)
传送门 题意 给出n个数,q个询问,每个询问有两个数p,k,询问p+k+a[p]操作几次后超过n 分析 分块处理,在k<sqrt(n)时,用dp,大于sqrt(n)用暴力 trick 代码 #i ...
- HDU3853:LOOPS(概率DP)
传送门 题意 从(i,j)走到(i,j),(i,j+1),(i+1,j)的概率为p[i][j][1],p[i][j][2],p[i][j][3],花费2魔力,问从(1,1)走到(r,c)的期望 分析 ...
- bzoj 4033: [HAOI2015]树上染色【树形dp】
准确的说应该叫树上分组背包?并不知道我写的这个叫啥 设计状态f[u][j]为在以点u为根的子树中有j个黑点,转移的时候另开一个数组,不能在原数组更新(因为会用到没更新时候的状态),方程式为g[j+k] ...
- 51nod 1188 最大公约数之和 V2
第二个\( O(T\sqrt(n)) \)复杂度T了..T了..T了...天地良心,这能差多少?! 于是跑去现算(. \[ \sum_{i=1}^{n-1}\sum_{j=i+1}^{n}gcd(i, ...
- 《windows核心编程系列》十七谈谈dll
DLL全称dynamic linking library.即动态链接库.广泛应用与windows及其他系统中.因此对dll的深刻了解,对计算机软件开发专业人员来说非常重要. windows中所有API ...
- MVC、MVP和MVVM的更简单易懂的理解
本篇转自网络: 一.MVC MVC模式的意思是,软件可以分成三个部分. 视图(View):用户界面. 控制器(Controller):业务逻辑 模型(Model):数据保存 各部分之间的通信方式如下. ...
- 进击的Python【第十一章】:消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下消息队列的基本思路. 还记得原来写过Queue的文章,不管是线程queu ...
- 如何用PS快速做出3D按钮效果的图片
1 先建立一个透明图层 2:再创建一个矩形 3:选用过喷样式 4: 双击图层并应用蓝色,记得这里应该复制下颜色的16进制值. 效果如图所示 取消光泽选项,大功告成! 最终效果如图所示,将其保存为PNG ...
- 201 Bitwise AND of Numbers Range 数字范围按位与
给定范围 [m,n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含m, n两端点).例如,给定范围 [5,7],您应该返回 4. 详见 ...