String vs StringBuilder vs StringBuffer(底层实现)
一.搞懂字符串常量池细节
常量池是java的一项技术,8种基础数据类型除了float和double都实现了常量池技术。即,把经常用到的数据存放在某块内存中,避免频繁的数据创建与销毁。
字符串常量池是Java常量池技术的一种实现,在较新的JDK版本中,字符串常量池被实现在Java堆内存中。
对字符串常量池建立初步认识:
public static void main(String[] args){
String s1 = "hello";
String s2 = new String("hello");
System.out.println(S1==s2); //false
}
第一行代码:
JVM首先会到字符串常量池中查找该字符串是否已经存在,如果存在会直接返回该引用,如果不存在则会在堆内存中创建该字符串对象,然后到字符串常量池中去注册该字符串。
在本案例中虚拟机首先会到字符串常量池中查找是否有存在"hello"字符串对应的引用. 发现没有后会在堆内存创建"hello"字符串对象(内存地址0x0001), 然后到字符串常量池中注册地址为0x0001的"hello"对象, 也就是添加指向0x0001的引用. 最后把字符串对象返回给s1。