java基礎知識

1.public static void main() 方法中,static 和 public能夠換位置,能夠final修飾,也能夠synchronize修飾。java

final修飾變量時,若是沒有static修飾,那麼能夠在聲明時賦值,也能夠在構造函數中賦值。。mysql

2.類中的靜態代碼塊比main方法先執行,不管靜態代碼塊在main以前仍是以後。準確來講,這是由於,靜態代碼塊在類加載時就會執行,而且只執行一次。而main方法是類加載入口,遇到main就會加載類(new也會),這時候會先加載靜態代碼塊(不管在main前仍是後面),而後再去執行main方法中的內容。而非靜態代碼塊就要每次new對象時都會執行。靜態代碼塊只加載一次,若是main時已經執行了,那麼new時就不會再執行了。sql

3.初始化的順序:父類優先於子類,先把父類初始化完了再初始化子類;可是注意靜態代碼塊特殊,由於靜態代碼塊是在類加載階段,優先於其餘部分,因此會先加載父類和子類靜態代碼塊,再加載父類和子類的其餘部分。     數據庫

(1) 父類靜態代碼塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法)
(2) 子類靜態代碼塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法 )
(3)  父類非靜態代碼塊( 包括非靜態初始化塊,非靜態屬性 )
(4) 父類構造函數
(5) 子類非靜態代碼塊 ( 包括非靜態初始化塊,非靜態屬性 )
(6) 子類構造函數

4.做用域

 

5.final關鍵字

final修飾類:該類不能夠被繼承,裏面屬性默認都是final。如String數組

final修飾方法:方法不能夠被覆蓋。安全

final修飾變量:變量不能夠被修改。多線程

final修飾引用類型如數組,則引用(地址)不能夠被修改,可是引用的內容能夠被修改,數組中的值能夠改變。eclipse

6.String類

String類是被final,表示不能夠被繼承,也不暴露。該類中使用final char[]數組來存字符串。該數組也是final修飾,private修飾的,,因此引用(地址不可變),可是數組中內容能夠變,設計人員每次操做數組時,不會去原數組進行操做,而是新建一個數組等於原數組,進行操做,並返回新數組。jvm

由於底層是數組,因此對於一個字符串s="s",數組長度是固定的,s+"a",此時會用新數組操做,返回一個新字符串,並非在原來的數組中操做,因此這裏有兩個對象,"s"是不變的因此String是不可變的函數

 7.三大特性

2)繼承:繼承是從已有的類中派生出新的類,新的類能吸取已有類的數據屬性和行爲,並能擴展新的能力。繼承避免了對通常類和特殊類之間共同特徵進行的重複描述。

3)封裝:就是隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。

4)多態性:多態性是指同一操做做用在不一樣對象時,會產生不一樣語義,產生不一樣結果。多態經過重載(編譯時多態)和覆蓋(運行時多態)實現。父類引用只能調用父類中存在的方法和屬性,不能調用子類的擴展部分;由於父類引用指向的是堆中子類對象繼承的父類; 

重載經過不一樣參數來實現,不能經過返回參數、方法權限以及拋出異常的不一樣來實現。

8.float f = 3.4編譯不會經過,應該f=3.4f.

9.&是按位與運算,&&是邏輯與

10heap stack 有什麼區別?

答:棧是一種線形集合,後進先出;棧中存放的是局部變量表,變量生命週期一旦結束就會被釋放。而堆能夠看似一棵樹,用來存放新建的對象,由垃圾收集器進行回收。

11.抽象類和接口

首先,都不能夠被實例化。

下面比較一下二者的語法區別:  
1.抽象類能夠有構造方法,接口中不能有構造方法。  
2.抽象類中能夠有普通成員變量,也能夠有靜態成員變量,可是接口中沒有普通成員變量 ,都是 public static final靜態成員變量。
3.抽象類中能夠包含非抽象的普通方法,接口中的全部方法必須都是抽象的,不能有非抽象的普通方法。  
4. 抽象類中的抽象方法的訪問類型能夠是public,protected和(默認類型,雖然  
eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,而且默認即爲public abstract類型。  
5. 抽象類中能夠包含靜態方法(非抽象方法能夠是靜態),接口中不能包含靜態方法  
7. 一個類能夠實現多個接口,但只能繼承一個抽象類。
 

java 中會存在內存泄漏嗎,請簡單描述。【基礎】

答:會;存在無用但可達的對象,這些對象不能被GC 回收,致使耗費內存資源。

沒法分配內存(內存不夠),就是內存溢出

error exception 有什麼區別【基礎】都繼承Throwable

答:error 表示系統級的錯誤和程序沒必要處理的異常,是恢復不是不可能但很困難的狀況下的一種嚴重問題;好比內存溢出,不可能期望程序能處理這樣的狀況;exception 表示須要捕捉或者須要程序進行處理的異常,是一種設計或實現問題;也就是說,它表示若是程序運行正常,從不會發生的狀況。

運行時異常默認狀況下會自動進行處理,不須要捕捉,能夠選擇拋出,不用聲明;

受檢查異常表示程序能夠處理的異常,須要捕捉,或者拋出並聲明。

常見的運行時異常:

空指針異常類:NullPointerException
類型強制轉換異常:ClassCastException
數組負下標異常:NegativeArrayException
數組下標越界異常:ArrayIndexOutOfBoundsException
違背安全原則異常:SecturityException
文件已結束異常:EOFException
文件未找到異常:FileNotFoundException
字符串轉換爲數字異常:NumberFormatException
操做數據庫異常:SQLException
輸入輸出異常:IOException
方法未找到異常:NoSuchMethodException

try-finally

 在try-finally中,當try中返回一個變量,如return a.可是finally中對a作了修改(finally中沒有return a),此時try中仍是返回沒有修改的a,由於return以前會將return的內容保存在臨時棧中,再去執行finally內容,執行完finally內容再return。不過當finally中有return語句,就會覆蓋原來的return

一、無論有木有出現異常,finally塊中代碼都會執行;
二、當try和catch中有return時,finally仍然會執行;
三、finally是在return後面的表達式運算後執行的(此時並無返回運算後的值,而是先把要返回的值保存起來,管finally中的代碼怎麼樣,返回的值都不會改變,任然是以前保存的值),因此函數返回值是在finally執行前肯定的,可是finally也是在return以前執行;
四、finally中最好不要包含return,不然程序會提早退出,返回值不是try或catch中保存的返回值。finally中有return,會覆蓋前面的return
五、catch中有System.exit(0)。表示將整個虛擬機裏的內容都釋放,JVM中止工做,此時程序正常退出,也就不會再執行finally了

 ThreadLocal

ThreadLocal爲變量在每一個線程中都建立了一個副本,那麼每一個線程能夠訪問本身內部的副本變量。

ThreadLocal存放的值是線程封閉,線程間互斥的,主要用於線程內共享一些數據,避免經過參數來傳遞

線程的角度看,每一個線程都保持一個對其線程局部變量副本的隱式引用,只要線程是活動的而且 ThreadLocal 實例是可訪問的;在線程消失以後,其線程局部實例的全部副本都會被垃圾回收

在Thread類中有一個Map,用於存儲每個線程的變量的副本。

對於多線程資源共享的問題,同步機制採用了「以時間換空間」的方式,而ThreadLocal採用了「以空間換時間」的方式

Arrays.sort和Collections.sort使用的排序

Arrays.sort總結:  lenthth<47    插入排序

         47<length<286 雙軸快速排序 (兩個樞紐,將數組分紅三部分,對着三部分遞歸)。

         length>286 且連續性(升序或者降序)很差  雙軸快速排序

        length>286 且連續性好    歸併排序

 Collections.sort調用了Arrays.sort。

非抽象類實現接口

兩同兩小一大原則:
方法名相同,參數類型相同

子類返回類型小於等於父類方法返回類型, 
子類拋出異常小於等於父類方法拋出異常, 
子類訪問權限大於等於父類方法訪問權限。

synchronized與Lock的區別

 

二者區別:

1.首先synchronized是java內置關鍵字,在jvm層面,Lock是個java接口;

2.synchronized,會自動釋放線程佔有的鎖,在發生異常時,所以不會致使死鎖現象發生;而Lock在發生異常時,若是沒有主動經過unLock()去釋放鎖,則極可能形成死鎖現象,所以使用Lock時須要在finally塊中釋放鎖;

3.經過Lock能夠知道有沒有成功獲取鎖,而synchronized卻沒法辦到

4.用synchronized關鍵字的兩個線程1和線程2,若是當前線程1得到鎖,線程2線程等待。若是線程1阻塞,線程2則會一直等待下去,而Lock鎖就不必定會等待下去,若是嘗試獲取不到鎖,線程能夠不用一直等待就結束了;

6.Lock鎖適合大量同步的代碼的同步問題,synchronized鎖適合代碼少許的同步問題。

克隆函數

從一個對象克隆一個對象,則對克隆對象的修改不會影響到原對象。

使用clone()的步驟:

1.實現Cloneable接口;這是一個標識接口,沒有任何方法

2.重寫Object中的clone()方法;

3.調用super.clone完成淺拷貝。本身操做,完成深拷貝

淺拷貝:只考慮基本成員變量,不會複製對象中引用的其餘對象(包括數組),

深拷貝:把引用的其餘對象也從新拷貝一份。

反射

主要做用就是在運行時動態的建立類對象。

建立class類:class.forName()            類名.class            實例.getClass()

建立對象的方式

new                   反射                        clone           反序列化

 子類中獲取父類的類名

獲取本類類名:this.getClass().getName();

注意,super.getClass().getName()不能獲得父類的類名,而是獲得本類的類名。getClass()是Object的方法,表示返回Object運行時類,也就是返回子類。

獲取父類:this.getClass().getSuperClass().getName();

右移

>>有符號右移,對於正數,高位補0,負數高位補1.。>>>無符號右移,對於負數,高位補0;

==和equals

==比較基本數據類型是比較值,比較對象時比較對象的地址(引用);

equals是Object方法,默認使用==進行比較,也就是和==效果同樣。可是通常類都會覆蓋equals方法,比較具體對象的內容。

泛型

在沒有泛型以前,一旦吧一個對象「丟進」java集合中,集合就會忘記對象的類型,把全部的對象都當成是Object類型處理。當程序從集合中取出對象以後,就要進行強制類型轉換,這種強制類型轉換不只代碼臃腫還容易引發ClassCastException異常。

在JDK1.5以後,Java引用了「參數化類型(parameterized type)」的概念,容許咱們在建立集合時指定集合元素的類型。如List<String>,這代表該List只能保存字符串類型的對象。Java的參數化類型被稱爲泛型(Generic)

所謂泛型:就是容許定義類、接口時指定類型形參,這個類型形參將在聲明變量,建立對象時肯定(即傳入實際的類型參數,也可稱爲類型實參)。

 

避免死鎖的幾種方式:

相關文章
相關標籤/搜索