Java重載爲何不能用返回值不一樣來重載html
int foo(); void foo();java
由於函數調用時,可能不須要處理返回值的狀況,直接就 foo(), 此時編譯器就不知道改調用哪一個sql
多重繼承和多接口實現數據庫
Java不支持多重繼承,由於多重繼承的父親可能包含一樣函數和實現,會形成子類歧義編程
而實現多接口,由於接口都只是定義沒有實現,對於子類來講實現接口是同樣的,因此不會形成歧義。緩存
如果多個接口中有同名的變量(接口的變量實際上都是常量),若在子類中使用該同名常量將形成歧義,編譯出錯,不使用則不會有問題,能夠經過接口類名.變量名來訪問該數值安全
Java的String類爲何要設成immutable類型(不可變)多線程
String s1 = "abcd"; String s2 = "abcd"; if (s1 == s2) 二者是相等的 String a = "aaa"; String b = "aa" + "a"; a b仍然是相等的 String a = "aaa"; String b = new String("aa" + "a"); 此時 a b不一樣 第一種字符串初始化方式,當有多於一個字符串的內容相同狀況,字符串內容會放在字符串緩衝池中,即字符串內容在內存中只有一份。 第二種字符串初始化方式,不論有沒有字符串值相同,每次都會在內存堆中存儲字符串的值。
1.只有當字符串是不可變的,字符串池纔有可能實現。字符串池的實現能夠在運行時節約不少heap空間,由於不一樣的字符串變量都指向池中的同一個字符串。但若是字符串是可變的,那麼String interning將不能實現(譯者注:String interning是指對不一樣的字符串僅僅只保存一個,即不會保存多個相同的字符串。),由於這樣的話,若是變量改變了它的值,那麼其它指向這個值的變量的值也會一塊兒改變。
2.若是字符串是可變的,那麼會引發很嚴重的安全問題。譬如,數據庫的用戶名、密碼都是以字符串的形式傳入來得到數據庫的鏈接,或者在socket編程中,主機名和端口都是以字符串的形式傳入。由於字符串是不可變的,因此它的值是不可改變的,不然黑客們能夠鑽到空子,改變字符串指向的對象的值,形成安全漏洞。
3.由於字符串是不可變的,因此是多線程安全的,同一個字符串實例能夠被多個線程共享。這樣便不用由於線程安全問題而使用同步。字符串本身即是線程安全的。
4.類加載器要用到字符串,不可變性提供了安全性,以便正確的類被加載。譬如你想加載java.sql.Connection類,而這個值被改爲了myhacked.Connection,那麼會對你的數據庫形成不可知的破壞。
5.由於字符串是不可變的,因此在它建立的時候hashcode就被緩存了,不須要從新計算。這就使得字符串很適合做爲Map中的鍵,字符串的處理速度要快過其它的鍵對象。這就是HashMap中的鍵每每都使用字符串。socket
4. 基礎類型int long double等與封裝類類型 Integer Long。。。之間的沒必要要轉換能夠優化
函數
Long sum = 0L; for(long i = 0; i < Integer.MAX_VALUE; i++){ sum += i;
5. java 垃圾回收
設置未null,會自動回收
邏輯上已經再也不使用,但引用仍然在用
棧的出入 http://blog.csdn.net/chjttony/article/details/7484902
6. Java 的接口和抽象類的區別
http://www.cnblogs.com/dolphin0520/p/3811437.html
抽象類能夠有實現,但接口不能有實現,二者均不可實例化
一個類只能繼承一個抽象類,而一個類卻能夠實現多個接口。
7. 延遲初始化線程安全 http://blog.csdn.net/chjttony/article/details/8516876
1) 靜態類的初始化 延遲初始化持有類模式
private static class FieldHolder{//靜態內部類 static final FieldType field = computeFieldValue(); } static FieldType getField(){ return FieldHolder.field; }
2) 加synchronized關鍵字
private FieldType field;// 也能夠對靜態域延遲初始化private static FieldType field; synchronized FieldType getField(){ if(field == null){ field = computeFieldValue(); } return field; }
3) 雙重檢查
private volatile FieldType field; FieldType getField(){ FieldType result = field; if(result == null){//第一次檢查 synchronized(this){ result = field; if(result == null){//第二次檢查 field = result = computeFieldValue(); } } } return result; }
雙重檢查中域聲明爲volatile很重要,volatile關鍵字強制禁止java虛擬機對指令亂序執行,在JDK1.5以前因爲不一樣的java虛擬機內存模型對volatile關鍵字實現支持不一樣,致使雙重檢查不能穩定正常運行,JDK1.5以後引入的內存模式解決了這個問題。
局部變量result確保實例域field只在已經被初始化的狀況下讀取一次,雖然不是嚴格要求,可是能夠提高性能。雙重檢查模式將同步代碼範圍縮小,減小了實例域訪問開銷。
注意沒有必須對靜態域使用雙重檢查模式,延遲初始化持有類模式更加優雅強大。
8. Java與C++的多態區別
1) java默認全部的函數都是可動態綁定的虛函數, C++必須是聲明未virtual的函數才能被動態綁定
C++要觸發動態綁定,必須知足兩個條件:第一:只有指定爲虛函數的成員函數才能進行動態綁定。第二,必須經過基類類型的引用或者指針進行函數調用。
9. Java 的對象都是引用,C++有引用或指針,指針指向一塊內存,它的內容是所指內存的地址;而引用則是某塊內存的別名,引用不改變指向
10. C++
與malloc和free的區別
(1)new/delete調用 constructor/destructor.Malloc/free 不會
(2)new 不須要類型強制轉換。.Malloc 要對放回的指針強制類型轉換.
(3)new/delete操做符能夠被重載, malloc/free 不會
(4)new 並不會強制要求你計算所須要的內存 ( 不像malloc)