要想讓一個問題變難,最基本有兩種方式,即極度細化和高度抽象。對於任何語言的研究,良好的基礎相當重要,本篇文章,將從極度細化的角度java
來解析一些java中的基礎問題,這些問題也是大部分編程人員的軟肋或易混淆點。算法
一 關於String問題編程
1.String是基本類型(值類型)仍是引用類型?安全
(1)String是引用類型。經過查看jdk,String是一個類,既然是一個類,那麼就是引用類型;異步
(2)基本類型包括:int,float,boolean,byte,凡是經過new關鍵字的,都屬於引用類型,如工具
通常狀況,引用類型是經過new關鍵字,如ClassA a=new ClassA() ,a就是引用類型,引用類型存儲在內存堆中,而值類型存儲在內存棧中。性能
堆和棧的區別是,棧存取速度快,固定存儲長度;而堆長度根據運行時實際狀況分配,速度慢。ui
2.String str1=「Alan」與String str2=new String("Alan")區別?this
回答該問題,就涉及到java虛擬機常量池問題spa
(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);
Tip:以下爲String.equals()方法jdk源碼
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
源碼很清楚,有三個邏輯
(1)自身與自身比較,則返回true;
(2)當與其餘對象比較,比較的是字符串序列,字符序列相同,返回true,不然返回false;
(3)當不知足(1)(2),則直接返回false
二 關於集合問題
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,。。。。
十 版權區