package test1;
public class StringTest {
/** Java中String在内存中的分配情况详解
*
* (1)Java中的String对象是不可变的。String类中每个看起来会修改String值的方法,实际上都是创建了一个全新的String对象。
* (2)Java中一般不能重载操作符,但是String类“+”和 “+=”操作符是Java中唯一重载的两个操作符。这两个操作符都是编译器默认引入
* 了java.lang.StringBuilder类,最后都调用了toString方法生成String对象的。
*
* @param args
*/
public static void main(String[] args) {
// 常量字符串是分配在虚拟机的方法区的常量池中,也可以通过String.Intern将String添加到常量池中
String str1 = "aaa";
String str2 = "aaa";
// String.valueOf方 法会先检索常量池中字符串,没有的话才会去在堆中new一个
String str3 = String.valueOf("aaa");
// 使用new操作符生成的字符串对象,跟一般的对象生成一样,是在虚拟机的堆中分配内存的
String str4 = new String("aaa");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
System.out.println(str1.equals(str4)); // true
System.out.println(str3.equals(str4)); // true
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // true
System.out.println(str1 == str4); // false
System.out.println(str3 == str4); // false
}
}