java字符串创建几个对象
1. 首先了解 栈、堆、字符串常量池
2. 字符串常量池结构
3. 创建字符串的几种方式
public static void t1 () {//一个字符串对象 一个char[]数组
String str1 = "abc";
}
public static void t1_1 () {//一个字符串对象 一个char[]数组(编译以后就是 str1 = "abcdef")
String str1 = "abc" + "def";
}
public static void t2 () {//一个字符串对象 一个char[]数组
String str1 = "abc";
String str2 = "abc";
}
public static void t2_1 () {//2个字符串对象 2个char[]数组
String str1 = "abc";
String str2 = "def";
}
public static void t3 () {//两个字符串对象 一个char[]数组
String str1 = new String("abc");
}
public static void t4 () {//三个字符串对象 一个char[]数组
String str1 = new String("abc");
String str2 = new String("abc");
}
public static void t4_1 () {//4个字符串对象 2个char[]数组
String str1 = new String("abc");
String str2 = new String("def");
}
public static void t5 () {//4个字符串对象,3个char[]
String str1 = "a" + new String("b");
}
4. 解析证明
4.1
String str1 = "abc";
idea断点查看
放开断点对比
4.2
public static void t2 () {//一个字符串对象 一个char[]数组
String str1 = "abc";
String str2 = "abc";
}
idea调试信息
创建String对象 创建char[]数组
str2引用str1
str2引用str1 所以没用创建任何东西
4.3
public static void t2_1 () {//2个字符串对象 2个char[]数组
String str1 = "abc";
String str2 = "def";
}
4.4
public static void t3 () {//两个字符串对象 一个char[]数组
String str1 = new String("abc");
}
为什么常量池的引用不和str1引用同一个呢?
但str1被回收后str1的引用对象会销毁
如果其他地方再定义 String xxx = “bac”, 则可以直接把常量池中的”abc“的引用直接返回给xxx
4.5
public static void t4 () {//三个字符串对象 一个char[]数组
String str1 = new String("abc");
String str2 = new String("abc");
}
4.6
public static void t4_1 () {//4个字符串对象 2个char[]数组
String str1 = new String("abc");
String str2 = new String("def");
}
4.7
public static void t5 () {//4个字符串对象,3个char[]
String str1 = "abc" + new String("def");
}
idea debug
其中【+4(2)】中的2入下图