回过头来补充一个:Java 代码编译生成的类文件中的常量池是静态常量池,当类被载入到虚拟机内部的时候,在内存中产生类的常量池叫运行时常量池。
String a = “a”,是编译期的,在class文件里
String b = “b”,是运行期的,在JVM里。
A是编译期,B是运行期
转载:https://www.cnblogs.com/javadevelper/p/6067655.html,
https://www.cnblogs.com/xiaoxi/p/6036701.html
1.String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象
2.字符串连接是从左向右依次进行,对于不同的字符串,首先以最左边的字符串为参数创建StringBuilder对象,然后依次对右边进行append操作,最后将StringBuilder对象通过toString()方法转换成String对象(注意:中间的多个字符串常量不会自动拼接)。
也就是说String c = “xx” + "yy " + a + “zz” + “mm” + b; 实质上的实现过程是: String c = new StringBuilder("xxyy ").append(a).append(“zz”).append(“mm”).append(b).toString();
由此得出结论:当使用+进行多个字符串连接时,实际上是产生了一个StringBuilder对象和一个String对象。
String.intern()方法:转载:https://www.cnblogs.com/Kidezyq/p/8040338.html,
https://blog.csdn.net/u013366617/article/details/83618361
这个挺关键的,JAVA1.6和1.7还不一样,转载:https://blog.csdn.net/w605283073/article/details/72753494,
用intern的目的的话,就是创建字符串对象的时候节约内存,具体原理可以看下面美团的技术链接:https://tech.meituan.com/2014/03/06/in-depth-understanding-string-intern.html
这里面:
这个“11”用的是堆里面堆这个对象
Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。
1)所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。
2)而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。