String str1;
String str2 = null;
String str3 = new String();
String str4 = new String("");
String str5 = new String(" ");
String str6 = "";
String str7 = " ";
// String 博大精深
toString 方法返回对象的类名和地址;String类重写了toString方法,返回字符串的值
hashCode 方法返回对象的内存地址,但是可以被重写;identityHashCode 方法返回内存地址,即使重写也不会有影响
''是第0个ASCLL码,表示一个空字符,缩写为NUL;' '是第32个ASCLL码,表示一个空格
- 第一条语句:栈内开辟一块空间,存储str1
- 第二条语句:栈内开辟一块空间,存储str2;没有为它开辟空间,str2不指向任何内存空间
- 第三条语句:栈内开辟一块空间,存储str3;在堆内开辟一块空间,这块空间是空的,将地址传给str3
- 第四条语句:栈内开辟一块空间,存储str4;在堆内开辟一块空间,用空字符串初始化这块空间,将地址传给str4
- 第五条语句:栈内开辟一块空间,存储str5;在堆内开辟一块空间,用一个空格的字符串初始化,将地址传送给str5
- 第六条语句:栈内开辟一块空间,存储str6;字符串常量池中开辟空间,存储一个空字符串,将地址传给str6
- 第七条语句:栈内开辟一块空间,存储str7;字符串常量池中开辟空间,存储一个空格的字符串,将地址传给str7
综上所述:str1仅仅声明了一个字符串,并没有初始化,尽量不要使用;str2声明并且用null初始化了字符串,可以较多的使用;str3, str4, str5 均开辟了一块空间,用它们初始化是不必要的,再次给它们赋值时又会生成一个新的字符串,并让它们指向新的字符串;str6, str7首先在字符串常量池中查找有没有已经存在的字符串,如果有,就将引用指向这些已经存在的字符串,如果没有,就在字符串常量池中创建新的字符串常量,并将引用指向这些已经存在的字符串。一般声明一个字符串最好用第二条语句