java【String】創建對象面試題,StringBuilder,StringBuffer 和 String對比

【String】創建對象面試題

StringBuilder,StringBuffer 和 String對比

String類有兩種創建對象的方式

方式一:直接賦值

String s = "hello";

方式二:通過調用構造器

String s = new String("hello");

[面試題1] 兩種創建對象方式的區別

方式一:先去常量池查看是否有hello字符序列,如果沒用,則創建,如果有則直接引用該地址。
s指向的是常量池的對象

方式二:需要在堆中創建對象,該對象維護了一個value屬性,value指向常量池的hello序列,如果常量池中沒有hello則創建,再指向,如果有了,直接用value指向。
s 指向的是堆中的對象

在這裏插入圖片描述

[面試題案例1]

String a = "abc";
String b = "abc";
System.out.println(a.equals(b));
System.out.println(a==b);

這個時候,兩個結果其實都爲true,第一個equals比較的是值,所以爲true。
第二個指向的都是指向常量池中,同一片地址,所以也爲true。
在這裏插入圖片描述

[面試題案例2]

String a= new String("abc");
String b = new String("abc");
System.out.println(a.equals(b));
System.out.println(a==b);

第一個結果爲true,第二個爲false,因爲第一個equals比較的是值所以未true。
第二個比較的是地址,但是是通過new關鍵字創建的對象,所以a和b中保存的是堆中對象的引用地址,而對象的引用地址中的屬性指向的纔是同一片常量池地址。
在這裏插入圖片描述

上面我們瞭解了String類,知道了它是怎麼保存字符串的,現在我們來看下String和StringBuffer的對比!

String & StringBuffer

相同點:都用於保存字符串,都可以對字符串進行一些增刪或其它處理的操作
不同點:

  • String類用於保存字符串常量,修改字符串的時候,要是不存在是會在常量池創建一個對象,如果存在則引用常量池中的常量。
  • StringBuffer類用於保存字符串變量,修改字符串的時候,改的是值

StringBuilder 和 StringBuffer的區別

StringBuilder和StringBuffer非常類似,而且方法一樣,那麼他們有上面區別呢?

							共同點 			版本 			線程安全  		效率
StringBuffer(jdk1.0)	保存可變字符串		老				安全			低

StringBuilder(jdk1.5)	保存可變字符串		新				不安全			高	

三者效率對比

String < StringBuffer < StringBuilder

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章