String的兩個語句的區別!

String a=new String("hello");和String a="hello";的區別,(1)前者是直接開辟一個內存空間,其中保存的數據為字符串hello,同時申請一個引用變量a將為字符串開辟的內存地址賦值給a :而對于后者,后臺的操作是:首先查看“字符串池”中是否存在hello這個字面量,如果存在,則將該字面量的內存地址賦值給b,如果沒有,剛在“字符串池“中生成一個hello字面量,將新生成的字面量的內存地址賦值給b.
(2)前者是在程序運行時,在內存開辟的空間,而后者是在程序編譯時就為之開了內存空間。
(3)前者用new 關健字,相當于創建了一個對象的引用,是在運行時完成,后者則是在編譯時就完成的字符串學量。
看如下代碼:
String s0="hello";
String s1="hello";
String s2="he"+"llo";
System.out.println(s0=s1);
System.out.println(s1=s2);
運行的結果是:true;
true;
因為例子中的s0和s1中的“hello"在編譯期就被確定了,所以s0==s1為真;而"he"和"llo"也都是字符串常量,當一個字符串常量連接成時,它自己也定是字符串常量,所s2也同樣在編譯期就被解析為一個字符串常量,所以s2也是常量池(constant pool 指的是在編譯期被確定,并被保存在已編譯的.clas文件中的一些數據,它包括了關于類,方法,接口等的常量,也包括字符串常量)中的"hello"的一個引用。
String s0=new String ("hello");
String s1=new String ("hello");
Stirng s2=new String(“he")+"llo";
System.out.println(s0==s1);
System.out.println(s1==s2);
System.out.println(s0==s1);
結果則是
false
false
false