知了堂Java|Java基礎面試題(三)


11.short s1 = 1; s1 = s1 + 1; 有錯嗎?short s1 = 1; s1 += 1 有錯嗎 答:前者不正確,后者正確。對于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 類型,因此 s1+1 運算結果也 是 int 型,需要強制轉換類型才能賦值給 short 型。而 short s1 = 1; s1 += 1;可以正確編譯,因為 s1+= 1;相當于 s1 = (short)(s1 + 1);其中有隱含的強制類型轉換?
12.字符串"+"運行原理什么??
在源程序中使用了"+",但在編譯時仍然將"+"轉換成 StringBuilder。因此,我們可以得出結論,在 Java 中無論使用何種方式進行字符串連接,實際上都使用的是 StringBuilder。雖然編譯器將"+"轉換成了 StringBuilder 分析下面的代碼
上面的代碼感覺沒有什么奇怪的現(xiàn)象,且從表面上看,對字符串和整型使用"+"號并沒有什么區(qū)別 我們來看看上面代碼的本質,介紹JDK自帶 jad 工具,此工具能將 .class 文件進行反編譯成 Java Byte Code ,執(zhí)行命令
反編譯后代碼如下
使用jad反編譯的好處之一就是可以同時生成字節(jié)碼和源代碼。這樣可以進行對照研究。從上面的代碼 很容易看出,雖然在源程序中使用了"+",但在編譯時仍然將"+"轉換成StringBuilder。因此,我們可以 得出結論,在Java中無論使用何種方式進行字符串連接,實際上都使用的是StringBuilder 如果使用循環(huán)來連接字符串,那么產出的 Java Byte Code 就會有很大區(qū)別
上面的代碼返編譯后的 Java Byte Code 如下
大家可以看到,雖然編譯器將"+"轉換成了StringBuilder,但創(chuàng)建StringBuilder對象的位置卻在for語句 內部。這就意味著每執(zhí)行一次循環(huán),就會創(chuàng)建一個StringBuilder對象(對于本例來說,是創(chuàng)建了10個 StringBuilder對象),雖然Java有垃圾回收器,但這個回收器的工作時間是不定的。如果不斷產生這樣 的垃圾,那么仍然會占用大量的資源。解決這個問題的方法就是在程序中直接使用StringBuilder來連接 字符串,代碼如下
注意: 在使用StringBuilder時要注意,盡量不要"+"和StringBuilder混著用,否則會創(chuàng)建更多的 StringBuilder對象 StringBuffer和StringBuilder的功能基本一樣,只是StringBuffer是線程安全的,而StringBuilder 不是線程安全的。因此,StringBuilder的效率會更高
13.方法區(qū)存放什么東西?
方法區(qū)又叫靜態(tài)區(qū),包含所有的class文件和static變量?
方法區(qū)中包含的都是在整個程序中永遠唯一的元素,如class,static變量?
運行時常量池都分配在Java虛擬機的方法區(qū)之中
今天的分享就到這里啦,持續(xù)關注我們,學習更多Java干貨知識。