java多執行緒面試題
Java中String類由於其特殊性(不變類),幾乎是筆試面試中的必考題,當然有些題目其實沒啥意思,不過關鍵是要通過題目掌握原理性的東西。下面六道題目,如果您全部做對了,且明白其所以然,那麼Java中的關於String的筆試面試題應該難不到你了。也許您覺得我說的有點過了,然而徹底明白這些題目,對理解String類還是很有好處的。
寫出下面各題的列印輸出的結果:
1
public static void main(String[] args){
String a = "a1";
String b = "a" + 1;
System.out.println(a==b);
}
2
public static void main(String[] args){
String a = "ab";
String bb = "b";
String b = "a" + bb;
System.out.println(a==b);
}
3
public static void main(String[] args){
String a = "ab";
final String bb = "b";
String b = "a" + bb;
System.out.println(a==b);
}
4
public static void main(String[] args){
String a = "ab";
final String bb = getBB();
String b = "a" + bb;
System.out.println(a==b);
}
private static String getBB() { return "b"; }
5
private static String a = "ab";
public static void main(String[] args){
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
System.out.println(s == a);
System.out.println(s.intern() == a);
}
6
private static String a = new String("ab");
public static void main(String[] args){
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
System.out.println(s == a);
System.out.println(s.intern() == a);
System.out.println(s.intern() == a.intern());
}
答案:
1)true
要說明一點:當兩個字串字面值連線時(相加),得到的新字串依然是字串字面值,儲存在常量池中。
2)false
當字串常量與String型別變數連線時,得到的新字串不再儲存在常量池中,而是在堆中新建一個String物件來存放。很明顯常量池中要求的存放的是常量,有String型別變數當然不能存在常量池中了。
3)true
注意此題與上一題的區別,此處是字串字面值與String型別常量連線,得到的新字串依然儲存在常量池中。
4)false
此題中第條語句:final String bb = getBB();其實與final String bb = new String(“b”);是一樣的。也就是說return “b”會在堆中建立一個String物件儲存”b”,雖然bb被定義成了final。可見並非定義為final的就儲存在常量池中,很明顯此處bb常量引用的String物件儲存在堆中,因為getBB()得到的String已經儲存在堆中了,final的String引用並不會改變String已經儲存在堆中這個事實。
5)false,true
可能很多人對intern()這個函式不瞭解。JDK API文件中對intern()方法的描述是:
返回字串物件的規範化表示形式。
一個初始為空的字串池,它由類 String 私有地維護。
當呼叫 intern 方法時,如果池已經包含一個等於此 String 物件的字串(用 equals(Object) 方法確定),則返回池中的字串。否則,將此 String 物件新增到池中,並返回此 String 物件的引用。
它遵循以下規則:對於任意兩個字串 s 和 t,當且僅當 s.equals(t) 為 true 時,s.intern() == t.intern() 才為 true。
所有字面值字串和字串賦值常量表示式都使用 intern 方法進行操作
上面字串池即為字串常量池。明白該題結果的原因了吧。
6)false,false,true
第五題看明白後,第六題就沒什麼好講的了。
String.intern():
再補充介紹一點:存在於.class檔案中的常量池,在執行期被JVM裝載,並且可以擴充。String的 intern()方法就是擴充常量池的 一個方法;當一個String例項str呼叫intern()方法時,Java 查詢常量池中 是否有相同Unicode的字串常量,如果有,則返回其的引用,如果沒有,則在常 量池中增加一個Unicode等於str的字串並返回它的引用;看示例就清楚了
示例:
String s0= "kvill";
String s1=new String("kvill");
String s2=new String("kvill");
System.out.println( s0==s1 );
System.out.println( "**********" );
s1.intern();
s2=s2.intern(); //把常量池中"kvill"的引用賦給s2
System.out.println( s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
結果:
false
**********
false
true
true
String x = "abc";
String y = new String("abcd");
現在來分析一下記憶體的分配情況。如圖:
可以看出,x與y存在棧中,它們儲存了相應物件的引用。第一條語句沒有在堆中分配記憶體,而是將“abc”儲存在常量池中。對於第二條語句,同樣會在常量池中有一個“abcd”的字串,當new時,會拷貝一份該字串存放到堆中,於是y指向了堆中的那個“abcd”字串。不知道polaris有沒有講明白。如果您明白了,那麼做前面那六道題就沒什麼問題了。
相關文章
- Java多執行緒面試高配問題---多執行緒(3)🧵Java執行緒面試
- 多執行緒面試題執行緒面試題
- Java常用面試題之Java多執行緒(十三)Java面試題執行緒
- 【Java面試題】Java面試之多執行緒!Java面試題執行緒
- Linux多執行緒面試題Linux執行緒面試題
- 多執行緒面試題1執行緒面試題
- 史上最全 Java 多執行緒面試題及答案Java執行緒面試題
- 精選30道Java多執行緒面試題Java執行緒面試題
- java多執行緒、集合和IO面試題_02Java執行緒面試題
- 史上最全Java多執行緒面試題,附答案Java執行緒面試題
- 多執行緒經典面試題執行緒面試題
- Java多執行緒與併發基礎面試題Java執行緒面試題
- 【面經】多執行緒常見面試題執行緒面試題
- Java執行緒面試題 Top 50Java執行緒面試題
- 面試系列-40個Java多執行緒問題總結面試Java執行緒
- bat等大公司常考java多執行緒面試題BATJava執行緒面試題
- Java併發--Java執行緒面試題 Top 50Java執行緒面試題
- Java面試經典題:執行緒池專題Java面試執行緒
- 敲開阿里大門的執行緒、多執行緒和執行緒池面試專題阿里執行緒面試
- 【對線面試官】Java多執行緒基礎面試Java執行緒
- 最常見的15個Java多執行緒,併發面試問題Java執行緒面試
- Java面試題:執行緒池內“鬧情緒”的執行緒,怎麼辦?Java面試題執行緒
- BATJ都愛問的多執行緒面試題BAT執行緒面試題
- 好程式設計師Java教程分享Java多執行緒常見面試題程式設計師Java執行緒面試題
- java面試一日一題:java執行緒池Java面試執行緒
- 一道阿里java多執行緒面試題的go版本實現阿里Java執行緒面試題Go
- 面試集錦(十四)多執行緒面試執行緒
- 面經梳理-java多執行緒其他Java執行緒
- 你會這道阿里多執行緒面試題嗎?阿里執行緒面試題
- 25道多執行緒面試題,附帶答案(一)執行緒面試題
- 43道多執行緒面試題,附帶答案(三)執行緒面試題
- python面試題之python下多執行緒的限制Python面試題執行緒
- 43道多執行緒面試題,附帶答案(二)執行緒面試題
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- java執行緒的筆試題Java執行緒筆試
- Java面試中,一些常見的有關多執行緒問題!Java面試執行緒
- 好程式設計師Java培訓分享Java多執行緒常見面試問題程式設計師Java執行緒面試