String的理解
String的理解
String str1 = "123";和String str2 = new String("123");
1.String str1 = "123";
最多创建一个String的对象,如果常量池已经存在“123”,就不需要new String().直接从常量池中获取该值。
如果常量池中没有该对象就new String("123");并开辟空间加载到常量中便于以后调用
2.String str2 = new String("123");
最多创建两个String对象,最少创建一个String对象。
只要有 new 关键字就会在堆内存中开辟一个空间,在判断常量池中是否存在该常量“123”,如果不存在就会在常量池中new一个对象并保存在常量池中

二,
- 单独使用“”引号创建的字符串都是直接量,编译时期就确定加入到常量池中
- 使用new String("")创建的对象会储存到堆内存中,运行时期才创建
- 使用只包含直接量的字符串连接符如“aa”+"bb"创建的也是直接量,编译期就能确定
- 使用包含String直接量(无final修饰符)的字符串表达式 如“aa”+str;创建的对象是运行期创建的,储存在堆内存中
通过变量或者调用方法去拼接字符串,都是在运行时期才能确定变量的值和方法的返回值,没有编译优化的操作。
private static String getStr(){
return "AB";
}
public static void main(String[] args){
String str1 = "ABCD";
String str2 = "A"+"B"+"C"+"D";//编译优化,编译时期优化为“ABCD”
String str3 = "AB"+"CD"; //编译优化,编译时期优化为“ABCD”
String str4 = new String("ABCD");//无编译优化,编译时期为String对象
String temp= "AB";
String str5 = temp + "CD";//无编译优化,
String str6 = getStr() + "CD";//无编译优化,
System.out.println(
str1 == str2; //true
str1 == str3; //true
str1 == str4; //false
str1 == str5; //false
str1 == str6; //false
);
}

浙公网安备 33010602011771号