java 核心技術之基礎篇(一)

    首先,談談我對java平臺的理解,java自己是一種面向對象的語言,顯著的特徵有兩個方面,一是所謂的「一次書寫,處處運行」,可以很是容易的得到跨平臺的能力,另外就是垃圾回收(GC),java 經過垃圾收集器回收分配內存,大部分狀況下,程序員不須要本身操心內存的分配與回收。java

  對於「java 是解釋執行」這句話,是不太準確的。咱們開發的源代碼,首先經過javac編譯成字節碼,而後運行時,經過java虛擬機內嵌的解釋器將字節碼轉換成最終的機器碼。長見的JVM,好比大多數狀況下使用的Oracle JDK提供的jvm ,提供了JIT(Just -In-Time)編譯器,所謂的動態編譯器,JIT可以在運行時將熱點代碼編譯成機器碼,這時部分熱點代碼就屬於編譯執行,而不是解釋執行了。因此說java是解析運行的這一說法是不許確的。程序員

對於java的特性還有:(1)基本語言特性 ,面向對象(封裝,繼承,多態)、反射、泛型...(2)java類庫:核心類庫,如IO/NIO、網絡、utils...;安全類庫、jdk、management以及海量的第三方類庫(3)java虛擬機:垃圾收集器、運行時、動態編譯、輔助功能,如jfr(4)工具:輔助工具,如jar、jdeps ,編譯器,javac 、sjavac。編程

以上是對java語言以及平臺的理解,下面一一攻克幾個java的基礎的認識,由點及面,漸漸深刻了解java的一些語言特性:數組

----------------------------------------------------------------------------------------------------------------------------------------------緩存

1、世界上不會有永遠不出錯的程序,異常狀況如影隨形的纏繞着咱們這些程序員,只有更好的認識異常,處理異常,咱們的程序纔有可靠性;java語言設計了完善的異常處理機制,下降可編寫和維護的門檻,下面的問題,請對比 Exception 和 Error,另外區別 運行時異常與通常異常的區別?安全

回答如此:Exception 和 Error 都繼承Throwable 類,在java 中只有Throwable 類型的實例才能夠被拋出(throw)或者捕獲(catch),它是異常處理機制的基本組成類型。Exception是程序正常運行中,能夠預料的意外狀況,可能而且應該被捕獲,進行相應處理。網絡

Error 是指在正常狀況下,不大可能出現的狀況,絕大部分的Error會致使程序的非正常、不可恢復狀態,既然是非正常那就不須要捕獲,常見的有OutOfMemoryError類併發

Exception 又分爲可檢查異常和不檢查異常,可檢查異常在源代碼裏必需要顯示進行捕獲處理,這是在編譯器檢查的一部分,不檢查異常就是所謂的運行時異常,類NUllPointerException、ArrayIndexOutOfBoundsException 類,根據須要判斷捕獲。app

圖示總結:jvm

 

2、以題切入java語言的要素,一個經典的java 基礎題,談談final 、finally、 finalize有啥不一樣?典型回答是,final能夠用來修飾類、方法、變量;final修飾的class表明不可繼承擴展,final的變量不可修改,final的方法不可重寫;finally 則是java保證重點代碼必定要被執行的一種機制。可使用 try-catch-finally 或 try-finally 來進行相似關閉JDBC鏈接、保證Unlock 鎖等動做。finalize 則是基礎類 java.long.Object 的一個方法,他設計的目的是保證對象在被垃圾回收收集前完成特定資源的回收。finalize已經不推薦使用。

推薦使用final 關鍵字來明確表示咱們代碼的語義以及邏輯意圖,這已經證實在不少場景下是很好的實踐,好比:

 能夠將方法或類聲明爲final,以明確告知別人,這些行爲是不容許修改的。查看java的核心類庫也可看到有至關一部分的聲明標記爲final,保證了平臺的安全性。

使用final 修飾的參數和變量,能夠清楚的避免意外的賦值致使的錯誤。

final變量產生某種程度的不可變的效果,能夠用於保護只讀數據,尤爲是併發編程中,可減小額外的同步開銷。

對於finally 明確知道怎麼用就好了,java平臺已經逐步使用java.lang.ref.Cleaner 來替換finalize實現。

 

3、下面聊聊平常使用的字符串,字符串幾乎是全部編程語言中一個特殊的存在,由於無論數量仍是體積,字符串都是大多數應用的重要組成。下面的問題:理解java 語言中的字符串,String StringBuffer、StringBuilder 有什麼不一樣?

   典型回答:String 是一個很是基礎的類,提供了構造和管理字符串的各類基本邏輯。它是典型的Immutable類,被聲明爲 final class,因爲他的不可變性,相似拼接、裁剪字符串都會產生新的String 對象。因爲字符串的操 做的廣泛性,因此相關操做對於應用的性能也有所影響。 

  StringBuffer 是爲了解決上面拼接產生太多中間對象的問題提供的一個類,可使用append、add方法,把字符串添加到已有序列的末尾或指定位置。StringBuffer 是一個線程安全的類,因此隨之帶來了額外的性能上的開銷,除非有線程安全的須要,否則推薦他的後繼者 StringBuilder,

  StringBuilder 本質上和 StringBuffer 沒有區別,可是他去掉了線程安全的部分,有效的減小了線程開銷,是絕大部分狀況下進行字符串拼接的首選。

 擴展部分:一、在JDK 8中,字符串拼接造做會被javaC 轉換成 StringBuilder 操做。

     二、字符串緩存 jDK 6 採用的是 intern ()方法,對緩存中相似的文本字符串進行緩存以備重複使用,可是不推薦大量使用,由於有「永久代」問題,使用不當,OOM就會光顧;再後續版本中採用的是intern ,intern是一種顯式的排重機制,在jdK1.8中推出了一個新特性,也就是 G1 GC下的字符串排重。他是經過將相同的數據的字符串指向同一份數據來作到的,是JVM底層的改變,不須要java類庫作改變。開啓參數 -xx: +UseStringDedupLication

       三、另外,也可從java自身的演化方面進行觀察,在歷史版本中他是使用 char數組來存數據的,很是的直接,這裏就不在進行擴展了。

4、 java雖然號稱面向對象的語言,可是原始數據類型仍然是重要的組成元素,因此常常會被考察原始數據類型和包裝類的java語言特性,問題如是:int 和Integer 有什麼區別?談談Integer值的緩存範圍

  典型回答:int是整形數字,是java 8個原始類型之一(Type 、boolean 、byte、short、char、int 、float、double、long );Integer 是int對應的包裝類,他有一個int 類型的字段存儲數據,而且提供了基本操做,好比數學運算、int 和字符串之間的轉換等,在java5 中引入了自動裝箱和自動拆箱功能,自動進行轉換,極大的簡化了相關的編程。具體詳情可考察https://blog.csdn.net/sun_wangdong/article/details/43281105

關於Integer 的值緩存,涉及到java5 的另外一改進,構建Integer 對象的傳統方式是調用構造器,直接new 一個對象。咱們發現大部分的操做是集中在較小的數值範圍內,java5 中新添加了靜態工廠方法 valueOf,在調用是利用緩存機制,帶來明顯的性能改進,按照javdoc,這個值默認緩存是 -128至127 之間。

 知識擴展:一、理解自動裝箱、拆箱,自動拆裝箱算是一種語法糖,語法糖能夠簡單理解爲java平臺爲咱們自動進行的一些轉換,保證不一樣的寫法在運行時等價,他們發生在編譯階段,生成字節碼的是一致的。 javac 自動爲咱們把裝箱轉換爲 Integer.valueOf(),把拆箱轉換爲 Integer.intValue();調用 Integer.ValueOf();天然能夠獲得緩存上的好處。

 注意事項:一、基本類型均具備取值範圍,有可能出現數組越界的問題;二、數據類型轉換1234567890L 不會超過範圍、處理貨幣存儲時使用BigDecimal工具類,使用 double會出行差距。

 三、優先使用基本類型。建議避免無心的拆裝箱,四、考慮線程安全的話,咱們後續會總結。

相關文章
相關標籤/搜索