JAVA 相關

  1. Java重載爲何不能用返回值不一樣來重載html

    int foo(); void foo();java

    由於函數調用時,可能不須要處理返回值的狀況,直接就 foo(), 此時編譯器就不知道改調用哪一個sql

  2. 多重繼承和多接口實現數據庫

    Java不支持多重繼承,由於多重繼承的父親可能包含一樣函數和實現,會形成子類歧義編程

    而實現多接口,由於接口都只是定義沒有實現,對於子類來講實現接口是同樣的,因此不會形成歧義。緩存

    如果多個接口中有同名的變量(接口的變量實際上都是常量),若在子類中使用該同名常量將形成歧義,編譯出錯,不使用則不會有問題,能夠經過接口類名.變量名來訪問該數值安全

  3. Java的String類爲何要設成immutable類型(不可變)多線程

  4. 1).不可變對象能夠提升String Pool的效率和安全性。若是你知道一個對象是不可變的,那麼須要拷貝這個對象的內容時,就不用複製它的自己而只是複製它的地址,複製地址(一般一個指針的大小)須要很小的內存效率也很高。對於同時引用這個「ABC」的其餘變量也不會形成影響。



  5. 2).不可變對象對於多線程是安全的,由於在多線程同時進行的狀況下,一個可變對象的值極可能被其餘進程改變,這樣會形成不可預期的結果,而使用不可變對象就能夠避免這種狀況。



  6. 固然也有其餘方面緣由,可是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. 倘若字符串對象容許改變,那麼將會致使各類邏輯錯誤,好比改變一個對象會影響到另外一個獨立對象. 嚴格來講,這種常量池的思想,是一種優化手段.




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)

相關文章
相關標籤/搜索