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一个对象并保存在常量池中

在这里插入图片描述

二,

  1. 单独使用“”引号创建的字符串都是直接量,编译时期就确定加入到常量池中
  2. 使用new String("")创建的对象会储存到堆内存中,运行时期才创建
  3. 使用只包含直接量的字符串连接符如“aa”+"bb"创建的也是直接量,编译期就能确定
  4. 使用包含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
	); 
}

posted @ 2019-11-22 16:57  誓什么言  阅读(203)  评论(0)    收藏  举报