淺析關於java的一些基礎問題(上篇)
要想讓一個問題變難,最基本有兩種方式,即極度細化和高度抽象。對於任何語言的研究,良好的基礎至關重要,本篇文章,將從極度細化的角度
來解析一些java中的基礎問題,這些問題也是大部分程式設計人員的軟肋或易混淆點。
一 關於String問題
1.String是基本型別(值型別)還是引用型別?
(1)String是引用型別。通過檢視jdk,String是一個類,既然是一個類,那麼就是引用型別;
(2)基本型別包括:int,float,boolean,byte,凡是通過new關鍵字的,都屬於引用型別,如
一般情況,引用型別是通過new關鍵字,如ClassA a=new ClassA() ,a就是引用型別,引用型別儲存在記憶體堆中,而值型別儲存在記憶體棧中。
堆和棧的區別是,棧存取速度快,固定儲存長度;而堆長度根據執行時實際情況分配,速度慢。
2.String str1=“Alan”與String str2=new String("Alan")區別?
回答該問題,就涉及到java虛擬機器常量池問題
(1)在常量池中,不存在兩個相同的變數。
String str1="Alan_beijing"; String str2="Alan_beijing"; System.out.println(str1==str2);//true System.out.println(str1.equals(str2));//true
說明str1和str2指向同一個物件。
(2)沒new一個物件,就新增加一個物件,不管常量池中是否存在相同的變數
String str1="Alan_beijing"; String str2=new String("Alan_beijing"); System.out.println(str1==str2);//false System.out.println(str1.equals(str2));//true
3.equals和==區別?
(1)核心區別:equals比較物件值是否相等,==比較是否是同一個物件。
String str1="Alan_beijing"; String str2=new String("Alan_beijing"); System.out.println(str1==str2);//false System.out.println(str1.equals(str2));//true
4.為什麼StringBuilder相對於String字串拼接比較快?
知道了1-3答案,這個問題就非常容易解決了,因為每拼接一個字串,就要new一個物件,佔用記憶體堆,而StringBuilder不需要,故比較快。
String str="a"+"b"+"c"+"d";//要額外增加3個變數,“ab”,"abc",'abcd'
5.考慮如下問題答案
String str0="Alan"; String str1="Alan"; String str2="A"+"lan"; String str3=new String("Alan1"); String str4="A"+new String("lan"); String str5=str3.intern(); System.out.println(str0==str1); System.out.println(str1==str2); System.out.println(str1==str3); System.out.println(str3==str4); System.out.println(str1==str5);
二 關於集合問題
1.HashMap,TreeMap,HashSet和HashTable比較
(1)實現介面不一樣。HashMap和HashTable實現Map介面,而HashSet實現Set介面
(2)執行緒安全性不一樣。HashMap執行緒不安全(非同步鎖),HashTable執行緒安全(同步鎖),HashSet執行緒不安全,因為它的底層
是由HashMap不重複key實現的。
(3)效能從高到底
HashMap>HashSet>HashTable
(4)K,V是否為null
HashMap的K,V都可以存放null;
HashTable的K,V不能存放null;
HashSet只能V存放nll,K不能存放null
(5)儲存內容差異
HashMap<k,v>和HashTable<k,v>儲存k,v,而HashSet<E>儲存物件
(6)HashMap和TreeMap區別
TreeMap儲存物件排列次序,HashMap不須儲存物件排列次序
三 關於IO種類劃分問題
IO從種類上,一般劃分為字元流和位元組流兩大類,其中,字元流是以Reader或Writer結尾的,如InputStreamReader,
OutputStreamWriter;而位元組流是以Stream結尾的,如InputStream,OutputStream。他們的繼承關係如下:
四 關於異常問題
(1)所有的異常類繼承類Throwable
(2)異常從種類上來劃分,分為非受查異常(派生於所有Error或RuntimeException)和受查異常
(3)自定義異常類,只需繼承Exception類或Exception下的任何子類即可
(4)何為異常傳遞?指異常傳遞給呼叫的子類,而不在自己內部實現異常,通過throws向呼叫的類傳遞異常。
五 值傳遞和引用傳遞
值傳遞傳遞的是值,引用傳遞傳遞的是地址(也可叫做指標)
下面的的程式碼,最終輸出結果為15 0 20,請考慮為什麼?
package demo.test; import org.junit.Test; public class MGenalTest { @Test public void test(){ first(); } public void first(){ int i=5; Value v=new Value(); v.i=25; second(v,i); System.out.println(v.i); } public void second(Value v,int i){ i=0; v.i=20; Value val=new Value(); v=val; System.out.println(v.i+" "+i); } } class Value{ public int i=15; }
六 反射
Java中的反射是一種強大的工具,它能夠建立靈活的程式碼,這些程式碼可以在執行時裝配,無須再元件之間進行連結,反射允許
在編寫與執行時,使程式程式碼能夠接入裝載到JVM中的類的內部資訊,而不是原始碼中選定的類協作的程式碼。
七 序列化
關於序列化,只需實現介面Serializable即可
public interface Serializable { }
八 JVM
關於JVM,重點了解JVM垃圾回收機制,一般情況地,物件在垃圾回收前,會先呼叫方法finalize(),然後再呼叫gc()方法。
關於垃圾回收機制問題,有很多回收演算法,不同的演算法,實現不同的機制。
九 演算法
關於演算法,遞迴演算法考察比較多,如斐波拉列數列 1,1,2,3,5,8,。。。。
十 版權區
- 轉載部落格,必須註明部落格出處
- 博主網址:http://www.cnblogs.com/wangjiming/
- 如您有新想法,歡迎提出,郵箱:[email protected]
- 專業.NET之家技術QQ群:490539956
- 專業化Java之家QQ群:924412846
- 有問必答QQ群:2098469527
- 一對一技術輔導QQ:2098469527