最近在看了一些java基礎問題,順便將這段時間看到的容易混淆和已忘記的問題進行整理總結一下.java
接下來會再寫一些web方便易混淆或者不經常使用易忘記的問題梳理web
一、== 和 equals區別數組
==操做符專門用來比較兩個變量的值是否相等,也就是用於比較變量所對應的內存中所存儲的數值是否相同,要比較兩個基本類型的數據或兩個引用變量是否相等,只能用==操做符。安全
equals方法是用於比較兩個獨立對象的內容是否相同,就比如去比較兩我的的長相是否相同,它比較的兩個對象是獨立的優化
舉例spa
Integer aa=new Integer("11"); Integer bb=new Integer("11"); Integer cc=11; Integer dd=11; System.out.println(aa==bb); // false 緣由aa和bb在內存是不一樣的對象 System.out.println(aa==cc); // false 緣由aa和bb在內存是不一樣的對象 System.out.println(dd==cc); // true 緣由對Integer,String這類對象直接賦值時,會有一個常量值,也就意味着他們共用了一個內存地址 System.out.println(aa.equals(bb)); // true 緣由equals是值比較,Integer,String這類對象均重寫了object的equals方法,兩個內存中存的值相等,結果就爲true,一會會附上源碼解析 System.out.println(aa.equals(cc)); // true 緣由equals是值比較,Integer,String這類對象均重寫了object的equals方法,兩個內存中存的值相等,結果就爲true,一會會附上源碼解析
Integer中重寫的equals源碼解析以下: 線程
此處使用String重寫的equals源碼會更容易看出值比較, 博主太懶,用Interger寫的例子,不想換成String例子了, 拿好傘,準備當雞蛋,哈哈code
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); //會將object對象強轉爲Integer對象,並轉換爲int基本類型 } return false; }
二、做用域public,private,protected,以及不寫時的區別對象
此問題,一圖解千愁繼承
做用域 | 當前類 | 同一包(package) | 子孫類 | 其餘包(package) |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
不寫 | √ | √ | × | × |
private | √ | × | × | × |
三、抽象類和接口有什麼區別
接口(interface)能夠說成是抽象類的一種特例,接口中的全部方法都必須是抽象的。接口中的方法定義默認爲public abstract類型,接口中的成員變量類型默認爲public static final。
二者的語法區別:
四、String s="a"+"b"+"c"+"d"; 這語句建立了幾個對象?
看一下例子:
String aa="a"; String bb=aa+"b"+"c"+"d"; String cc="a"+"b"+"c"+"d"; String dd="abcd"; System.out.println(aa==dd); // false System.out.println(bb==dd); // false System.out.println(cc==dd); // true
結合第三條問題解答,能夠看出String s="a"+"b"+"c"+"d"這條語句java中作了優化處理,等同於String s="abcd"
五、try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,何時被執行,在return前仍是後?
由於知道return的做用,立馬就回答是return前,經驗證此答案錯誤。 仍是經過例子來加深記憶
public class TestLlan { static int test() { int x = 1; try { return x; } finally { ++x; } } public static void main(String[] args) throws FileNotFoundException { System.out.println(TestLlan.test()); // 執行屢次打印結果是 1 } }
經過結果能夠否認不是在return以前執行, 可是return後就會跳出方法,也不會是return後, 經過排除法獲得是 同時執行, 歡迎大神給出更明確的答覆,如何同時執行的? 難道是守護線程?
六、一個方法中 try{}finally{} 語句塊內都有return語句時,方法會返回try語句塊中的仍是finally語句塊中的內容?
這個根據第5個問題解答,猜想他們是同時執行的,那麼方法會使用那個返回值呢?繼續使用例子解惑
public class TestLlan { public int get() { try { return 0 ; } finally { return 1 ; } } public static void main(String[] args) throws FileNotFoundException { TestLlan t = new TestLlan(); int b = t.get(); System.out.println(b); // 運行屢次,打印值爲1 } }
what代碼在搞啥嘞... 經過第5個問題排除出來是try{}裏面的return和finally{}同時執行啊.. 此時只能絞盡腦汁,繼續排除法獲得return在finally以前執行, return執行完畢後,先存到某地方,finally在執行return時就會去覆蓋第一次return的值, finally執行完畢後,纔將最終值真正返出去
七、sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException(中斷異常)異常。
八、ArrayList和Vector的區別
這兩個類都實現了List接口,他們都是有序集合,至關於一種動態的數組,咱們之後能夠按位置索引號取出某個元素,,而且其中的數據是容許重複的。
這主要包括兩個差別方面:
(1)同步性:
Vector是線程安全的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它不考慮線程安全,效率會高些;若是有多個線程會訪問到集合,就要使用Vector。
(2)數據增加:
ArrayList與Vector都有一個初始的容量大小,當存儲進它們裏面的元素的個數超過了容量時,就須要增長ArrayList與Vector的存儲空間,Vector默認增加爲原來兩倍,而ArrayList的增加後是原來的1.5倍。 ArrayList與Vector均可以設置初始的空間大小,Vector還能夠設置增加的空間大小,而ArrayList沒有提供設置增加空間的方法。
九、HashMap和Hashtable的區別
(1)他們都完成了Map接口。
(2)HashMap容許將null做爲一個entry的key或者value,而Hashtable不容許。
(3)Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不須要本身爲它的方法實現同步,而HashMap就必須爲之提供外同步。
十、heap和stack有什麼區別
java的內存分爲兩類,一類是棧內存,一類是堆內存。
棧內存是指程序進入一個方法時,會爲這個方法單獨分配一塊私屬存儲空間,用於存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。 堆是與棧做用不一樣的內存,通常用於存放不放在當前方法棧中的那些數據,例如,使用new建立的對象都放在堆裏,因此,它不會隨方法的結束而消失。方法中的局部變量使用final修飾後,放在堆中,而不是棧中。