前言
String s1 = new String(“hello”);
String s2 = “hello”;
s1是字符串对象,s2和字符串常量,创建过程有何区别?
内存分配
字符串对象s1
栈中定义一个引用变量s1,堆中开辟一个内存空间,将堆内存空间的引用赋值给s1,“hello”是常量,去字符串常量池查看是否有“hello”字符串对象,没有的话分配一个空间存放hello,并且将其空间地址存入堆中new出来的空间中。
字符串常量s2
栈中定义一个引用变量s2,编译程序先去字符串常量池检查,是否存在“hello”,如果不存在,则在常量池中开辟一个内存空间存放“hello”;如果存在的话,则不用重新开辟空间。栈中s2存放的值为常量池中“hello”的内存地址(相当于指向常量池中的“hello”)