java基礎點總結

基礎知識這種東西,沒注意到的永遠比想象中多.大部分都是在面試中問到的...java

 1.static關鍵字面試

  變量,方法修飾;靜態代碼塊;靜態內部類;緩存

  靜態導入:import static ,靜態方法省略類名,直接調用.安全

2.final關鍵字多線程

  修飾基礎數據類型時,表示數值恆定不變,修飾引用類型時,表示指向的引用不變,但引用的具體值確實能夠修改的併發

  使用final方法,在必定程度上有可能提升程序效率,將一個方法設成final後,編譯器就能夠把對那個方法的全部調用都置入「嵌入」調用裏,編譯器會忽略爲執行方法調用機制而採起的常規代碼插入方法(將自變量壓入堆棧;跳至方法代碼並執行它;跳回來;清除堆棧自變量;最後對返回值進行處理),而是使用方法體內實際代碼的副本做爲實際調用,避免方法調用時的系統開銷,可是,方法體積大時,方法內部的時間抵消了系統開銷。一般,只有在代碼量很是小或者明確方法不被覆蓋時,纔將其定義爲final.線程

3.transient關鍵字對象

  在新建entity時,一般咱們會將其進行序列化,常規操做爲 implements java.io.Serializable , 可是實體中某些字段屬性可能並不須要傳輸,此時,能夠用transient關鍵進行修飾,則此字段不進行序列化;接口

  另,除開Serializable 接口,Externalizable接口也可實現序列化,經過writeExternal()和readExternal()方法,能夠執行一些特殊操做.內存

4.sleep()與wait()方法

  兩者都用於線程調度,兩者都會釋放cpu資源,可是,sleep()不會釋放掉cpu的全部權,也就是說對象的鎖並無釋放,其餘線程仍沒法訪問這個對象;而wait()會釋放掉鎖,容許其餘線程的訪問.

5.常量池

  Byte,Short,Integer,Long,Character,Boolean 這五種包裝類型,默認[-128,127]間使用常量池;而Float,Double並無實現常量池;

  String類型使用引號建立的對象纔會被放進常量池(包括使用+),而使用new建立出來的對象並不會放入常量池中;

  String intern()方法,查詢當前常量池中是否含有與某字符串equals()的常量,若是有則返回其引用,沒有則將本身添加進常量池.

6.volatile

  併發時,原子性與可見性做爲兩個保證安全條件,volatile具備可見性,但不具備原子性;

  volatile變量修飾的值被修改時,底層命令帶lock前綴,將處理器內存回寫到內存,而後根據緩存一致性機制使其餘緩存失效,保證可見性.

7.ConcurrentHashMap

  hashMap 線程不安全,多線程下使用put()會引發死循環;hashTable效率低下,併發下訪問其對象必須競爭同一把鎖;

  ConcurrentHashMap由可重入鎖Segment 與 鍵值對 HashEntry 組成.ConcurrentHashMap使用鎖分段技術保護不一樣段的數據,避免像hashTable同樣併發競爭同一把鎖引發的效率問題.

  ConcurrentHashMap經過兩次hash將元素分佈到不一樣的Segment 上,而後Segment 分段保護其段上數據.

  hashTable 在get()數據時也須要加鎖,而ConcurrentHashMap的get()並不須要加鎖(空值時加鎖重讀),由於HashEntry 中的值被定義爲volatile,可以保持可見性.

  ConcurrentHashMap的put()操做須要加鎖,先定位到對應的Segment ,而後在Segment 中進行插入.

  ConcurrentHashMap的size()並非單純的等於全部Segment 的和,計算時,其先進行兩次不加鎖的計算進行比較,若存在變更,則加鎖進行計算.

  ConcurrentHashMap 弱一致性.

8.finally塊中的語句必定會執行到麼?

  try以前就return,則並不會執行到;

  exit()方式執行,不會被執行到;

  finally塊的語句在try或catch中的return語句執行以後返回以前執行,finally塊中的修改語句不能影響到try或者catch中return已經肯定的值,會發生覆蓋.

相關文章
相關標籤/搜索