创建字符串的两种方式:
方式一:
String s1 = "hello",s2 = "hello"//s1 == s2为true
方式二:
String s1 = new String ("hello"), s2 = new String("hello");//s1 == s2为false
这里牵扯到栈、堆和常量池,简单说明下:
栈:由系统自动分配释放,速度快,栈中存放一些基本类型、对象的引用和函数的参数值;栈中的数据可以共享;
堆:可以由程序员自己创建分配,一般存放new出的对象;
常量池:存放类、方法、接口等中的常量和字符串常量;
当采用方式一对String进行直接赋值时:
jvm会首先在栈中存放一个String类型的引用变量s1;
然后查找常量池中有没有”hello”这个字符串常量;如果有,直接将s1指向这个常量的内存地址,如果没有,就在常量池中开辟一块内存空间,存放上”hello”,再将s1指向这块内存地址;
当采用方式二进行赋值时,每new出的一个对象,jvm都会直接在堆中开辟一块内存用于存放对象,然后栈中的引用分别指向各自创建的对象的内存地址。