**
幾種單例模式
1.餓漢模式線程安全,缺點內存浪費
public class testsingle {
private static final testsingle single=new testsingle();
private testsingle(){}
public static testsingle get(){
return single;
}
public static void main(String args[]){
}
}
2.懶漢模式線程不安全,缺點如果獲取實例時,初始化工作較多,加載速度會變慢,影響系統系能,每次獲取實例都要進行非空檢查,系統開銷大
public class testsingle {
private static final testsingle single=null;
private testsingle(){}
public static testsingle get(){
if(single==null)
single=new testsingle();
return single;
}
}
3.加鎖 優點:線程安全,缺點:每次獲取實例都要加鎖,耗費資源,其實只要實例已經生成,以後獲取就不需要再鎖了
public class testsingle {
private static final testsingle single=null;
private testsingle(){}
public static synchronized testsingle get(){
if(single==null)
single=new testsingle();
return single;
}
}
4.雙重檢查所優點:線程安全,進行雙重檢查,保證只在實例未初始化前進行同步,效率高 缺點:還是實例非空判斷,耗費一定資源
public class testsingle {
private static final testsingle single=null;
private testsingle(){}
public static testsingle get(){
if(single==null){
synchronized(testsingle.class){
if(single==null)
single=new testsingle();
}
}
return single;
}
}
5.靜態內部類優點:既避免了同步帶來的性能損耗,又能夠延遲加載
public class testsingle {
private testsingle(){}
private static class horld{
private static final testsingle single=new testsingle();
}
public static testsingle get(){
return horld.single;
}
}
6.枚舉天然線程安全,可防止反射生成實例。
public enum single{
instance;
public void init (){
System.out.println("資源初始化");
}
}
**
**
public、private、protected、default的作用
訪問修飾符用來控制訪問權限
.不在類內部的類的只有兩種public,default(不同包不可以訪問)
public–都可訪問(公有)
private–類內可訪問(私有)
protected–包內和子類可訪問(保護)
不寫(default)–包內可訪問 (默認)
**。
**
深拷貝和淺拷貝區別
淺拷貝只是拷貝了地址當原對象改變時拷貝的對象也會一起改變
深拷貝在內存空間內重新分配一塊區域來拷貝對象,兩者地址不同內容相同原對象改變不會影響新對象
**
**
error和exception的區別,CheckedException,RuntimeException的區別
error類型的錯誤一般有JVM虛擬機拋出,如Java虛擬機運行錯誤(Virtual MachineError),當JVM不再有繼續執行操作所需的內存資源時,將出現 OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止;還有發生在虛擬機試圖執行應用時,如類定義錯誤(NoClassDefFoundError)、鏈接錯誤(LinkageError)。
運行異常一般是程序邏輯錯誤造成,如ArrayIndexOutOfBoundsException(數組下標越界),NullPointerException(空指針異常)、ArithmeticException(算術異常)、MissingResourceException(丟失資源)、ClassNotFoundException(找不到類)等異常
檢查異常一般與運行上下文有關需要try-catch一般有IOException(文件異常)、SqlException(sql異常)
**
**
類加載器加載順序
啓動類加載器(Bootstrap ClassLoader)有C++實現屬於JVM一部分,其餘均有Java實現繼承java.lang.ClassLoader獨立於JVM之外
自底向上檢查類是否加載
Custom ClassLoader–>App ClassLoader–>Extension ClassLoader–>Bootstrap ClassLoader
自頂向下加載類
通過java.lang.ClassLoader的子類自定義加載class<–Load CLASSPATH或Djava.class.path所指定的jar包和類<–Load JRE\lib\ext*.jar或Djava.class.dirs指定目錄下的jar包<–Load JRE\lib\rt.jar或者-Xbootclasspath所指定的jar包
假設自定義了一個java.lang.String類根據規則最終都會調用Bootstrap ClassLoader去加載jdk自帶的String類
**
**
什麼是序列化,怎麼序列化,爲什麼序列化
序列化:把對象轉換爲字節序列的過程稱爲對象的序列化。
反序列化:把字節序列恢復爲對象的過程稱爲對象的反序列化
序列化原因:
當你想把的內存中的對象狀態保存到一個文件中或者數據庫中時候;
當你想用套接字在網絡上傳送對象的時候;
當你想通過RMI傳輸對象的時候;
**