Java 基礎總結

1.面向對象與面向過程

面向過程

  • 優勢:對程序性能要求比較高,而類調用時開銷比較大,比較消耗資源,面向過程開發避免了這一弊端,性能較好
  • 缺點:難維護,難服用,難擴展

面向對象

  • 優勢:面向對象有封裝、繼承、多態特性,能夠設計出低耦合的系統,使系統更加靈活易於維護
  • 缺點:性能低於面向過程

2.java語言特色

  1. 簡單易學
  2. 面向對象(封裝、繼承、多態)
  3. 平臺無關性(java編譯的字節碼能夠跑在不一樣平臺上的jvm裏)
  4. 可靠性
  5. 安全性(內存自動回收機制防止內存泄漏;異常處理能夠中斷程序運行;沒有指針保護內存數據)
  6. 支持多線程
  7. 支持網絡編程
  8. 編譯與解釋並存(.java文件 -> 編譯 -> .class字節碼文件 -> 放到jvm虛擬機裏解釋執行)

3.封裝、繼承、多態

  • 封裝

把一個對象私有化,同時提供一些能夠被外界訪問的屬性的方法。java

  • 繼承

  1. 子類擁有父類對象全部的屬性和方法(包括私有屬性和私有方法),可是父類中的私有屬性和方法子類是沒法訪問的,只是擁有。(內存分析:在一個子類被建立的時候,首先會在內存中建立一個父類對象,而後在父類對象外部放上子類獨有的屬性,二者合起來造成一個子類的對象。)
  2. 子類能夠擁有本身的屬性和方法,即功能擴展。
  3. 子類能夠用本身的方式實現父類的方法。
  • 多態

程序中定義的引用變量所指向的具體類型和經過該引用變量出發的方法調用在編程時並不肯定,而是在程序運行期間才肯定,即一個引用變量到底會指向哪一個類的實例對象。該引用變量發出的方法調用究竟是哪一個類中實現的方法,必須在由程序運行期間才能決定。編程

在java中有兩種形式能夠實現多態:繼承(多個子類對同一方法的重寫)和接口(實現接口並覆蓋接口中同一方法)。安全

4.接口和抽象類的區別

  1. 接口中全部方法在接口中不能有實現(注:從java8開始接口方法能夠有默認實現),而抽象類能夠有非抽象的方法。
  2. 接口中除了staticfinal變量,不能有其餘變量,而抽象類中則不必定。
  3. 一個類能夠有多個接口,但只能實現一個抽象類。接口本身自己能夠經過extends關鍵字擴展多個接口。
  4. 接口方法默認修飾符是public,抽象方法能夠有publicprotecteddefault這些修飾符(抽象方法就是爲了被重寫因此不能使用private關鍵字修飾)。
  5. 從設計層面來講,抽象是對類的抽象,是一種模板設計,而接口是對行爲的抽象,是一種行爲的規範。

    注:在jdk8中,接口也能夠定義靜態方法,能夠直接用接口名調用,實現類和實現是不能夠調用的。若是同時出現兩個接口,接口中定義了同樣的默認方法,則必須重寫,否則會報錯。網絡

5.成員變量和局部變量區別

  1. 從語法形式上看:成員變量是屬於類的,而局部變量是在方法中定義的變量或是方法的參數;成員變量能夠被publicprivatestatic等修飾符所修飾,而局部變量不能被訪問控制修飾符static所修飾;可是,成員變量和局部變量都能被final所修飾。
  2. 從變量在內存中的存儲方式來看:若是成員變量是使用static修飾的,那麼這個成員變量是屬於類的,若是沒有使用static修飾,這個成員變量是屬於實例的。而對象存在與對內存,局部變量則存在於棧內存。
  3. 從變量在內存中的生命週期來看:成員變量是對象的一部分,它隨着對象的建立而存在,而局部變量隨着方法的調用而自動消失。
  4. 成員變量若是沒有被賦初值,則會自動以類型的默認值而賦值(例外:被final修飾的成員變量必須顯式地賦值),而局部變量則不會自動賦值。

6.hashCode與equals

  • hashCode介紹

hashCode()的做用是獲取哈希碼,也成爲散列碼,它其實是一個int整數。這個哈希碼的做用是肯定該對象在哈希表中的索引位置。hashCode()定義在JDK的Object對象中,這就意味着java中全部類的對象都包含該函數。多線程

散列表存儲的鍵值對(key-value),特色是:能根據「key」快速檢索出對應的「value」。這其中就利用到了散列碼。併發

  • 爲何要有hashCode

當你把對象加入HashSet時,HashSet會先計算對象的hashcode值來判斷對象加入的位置,同時也會與其餘已經加入的對象的hashcode值做比較,若是沒有相符的hashcodeHashSet會假設對象沒有重複出現。可是若是發現有相同hashcode值的對象,這時會調用equals()方法來檢查hashcode相等的對象是否真的相同。若是二者相同,HashSet就不會讓其加入操做成功。若是不一樣的話,就會從新散列到其餘位置。這樣咱們就大大減小了equals的次數,相應就大大提升了執行速度。框架

經過咱們能夠看出:hashCode()的做用就是獲取哈希碼,也稱爲散列碼;它其實是返回一個int整數。這個哈希碼的做用是肯定該對象在哈希表中的索引位置。hashCode()在散列表中才有用,在其它狀況下沒用。在散列表中hashCode()的做用是獲取對象的散列碼,進而肯定該對象在散列表中的位置。異步

  • hashCode與equals相關約定

    1. 若是兩個對象相等,則hashCode必定也是相同的
    2. 兩個對象相等,對兩個對象分別調用equals方法都返回true
    3. 兩個對象有相同的hashCode值,它們也不必定是相等的
    4. 所以,equals 方法被覆蓋過,則 hashCode 方法也必須被覆蓋
    5. hashCode()的默認行爲是對堆上的對象產生獨特值。若是沒有重寫 hashCode(),則該類的兩個對象不管如何都不會相等(即便這兩個對象指向相同的數據)

7.線程的基本狀態

狀態名稱 說明
NEW 初始狀態,線程被構建,可是尚未調用start()方法
RUNNABLE 運行狀態,Java縣城將操做系統中的就緒和運行兩種狀態籠統地稱做「運行中」
BLOCKED 阻塞狀態,表示線程阻塞於鎖
WAITING 等待狀態,表示線程進入等待狀態,進入該狀態表示但錢縣城須要等待其餘線程作出一些特定動做(通知或中斷)
TIME_WAITING 超時等待狀態,該狀態不一樣於WAITING,它是能夠在指定的時間自行返回
TERMINATED 終止狀態,表示當前縣城已經執行完畢

8.Java中的異常處理

Java異常類層次結構圖

Java異常類層次結構圖

在 Java 中,全部的異常都有一個共同的祖先java.lang包中的 Throwable類。Throwable: 有兩個重要的子類:Exception(異常)Error(錯誤) ,兩者都是 Java 異常處理的重要子類,各自都包含大量子類。jvm

Error(錯誤):是程序沒法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操做無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題。例如,Java虛擬機運行錯誤(Virtual MachineError),當 JVM 再也不有繼續執行操做所需的內存資源時,將出現 OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)通常會選擇線程終止。函數

這些錯誤表示故障發生於虛擬機自身、或者發生在虛擬機試圖執行應用時,如Java虛擬機運行錯誤(Virtual MachineError)、類定義錯誤(NoClassDefFoundError)等。這些錯誤是不可查的,由於它們在應用程序的控制和處理能力之 外,並且絕大多數是程序運行時不容許出現的情況。對於設計合理的應用程序來講,即便確實發生了錯誤,本質上也不該該試圖去處理它所引發的異常情況。在 Java中,錯誤經過Error的子類描述。

Exception(異常):是程序自己能夠處理的異常。Exception 類有一個重要的子類RuntimeException。RuntimeException 異常由Java虛擬機拋出。NullPointerException(要訪問的變量沒有引用任何對象時,拋出該異常)、ArithmeticException(算術運算異常,一個整數除以0時,拋出該異常)和 ArrayIndexOutOfBoundsException(下標越界異常)。

注意:異常和錯誤的區別:異常能被程序自己能夠處理,錯誤是沒法處理。

Throwable類經常使用方法

  • public string getMessage():返回一場發生時的詳細信息
  • public string toString():返回一場發生時的簡要描述
  • public string getLocalizedMessage():返回一場對象的本地化信息。使用Throwable的子類覆蓋這個方法,能夠聲稱本地化信息。若是子類沒有覆蓋該方法,則該方法返回的信息與getMessage()返回的結果相同
  • public void printStackTrace():在控制檯上打印Throwable對象封裝的異常信息

異常處理總結

  • try 塊:用於捕獲一場。其後可接零個或多個catch塊,若是沒有catch塊,則必須跟一個finally塊。
  • catch 塊:用於處理try 捕獲到的異常。
  • finally 塊:不管是否捕獲或處理異常,finally 塊裏的語句都會被執行。當在try 塊或catch 塊中遇到return 語句時,finally 語句塊將在方法返回以前被執行。

在一下4種特殊狀況下,finally 塊不會被執行

  1. 在finally 語句塊第一行發生了異常,由於在其餘行,finally 塊仍是會獲得執行
  2. 在前面的代碼中用了System.exit(int)已退出程序。exit是帶參函數;若該語句在異常語句以後,finally 會執行
  3. 程序所在的線程死亡
  4. 關閉CPU

關於返回值

若是try 語句裏有return,返回的是try 語句塊中變量值。詳細執行過程以下:

  1. 若是有返回值,就把返回值保存到局部變量中;
  2. 執行jsr指令跳到finally 語句裏執行;
  3. 執行完finally 語句後,返回以前保存在局部變量表裏的值;
  4. 若是try,finally 語句裏均有return,忽略try 的return,而使用finally的return。

9.Java中IO流

java中IO流分爲幾種?

  • 按照流的流向分,能夠分爲輸入流和輸出流
  • 按照操做單元劃分,能夠劃分爲字節流和字符流
  • 按照劉的角色劃分,能夠劃分爲節點流和處理流

Java IO流共涉及40多個類,這些類看上去很雜亂,但實際上頗有規則,並且彼此之間存在很是緊密的聯繫,Java IO流的40多個類都是從以下4個抽象類基類中派生出來的。

  • InputStream/Reader:全部的輸入流的基類,前者是字節輸入流,後者是字符輸入流。
  • OutputStream/Writer:全部輸出流的基類,前者是字節輸出流,後者是字符輸出流。

按操做方式分類結構圖:

按操做方式分類結構圖

按操做對象分類結構圖:

按操做對象分類結構圖

BIO,NIO,AIO有什麼區別?

  • BIO (Blocking I/O): 同步阻塞I/O模式,數據的讀取寫入必須阻塞在一個線程內等待其完成。在活動鏈接數不是特別高(小於單機1000)的狀況下,這種模型是比較不錯的,可讓每個鏈接專一於本身的 I/O 而且編程模型簡單,也不用過多考慮系統的過載、限流等問題。線程池自己就是一個自然的漏斗,能夠緩衝一些系統處理不了的鏈接或請求。可是,當面對十萬甚至百萬級鏈接的時候,傳統的 BIO 模型是無能爲力的。所以,咱們須要一種更高效的 I/O 處理模型來應對更高的併發量。
  • NIO (New I/O): NIO是一種同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,對應 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N能夠理解爲Non-blocking,不單純是New。它支持面向緩衝的,基於通道的I/O操做方法。 NIO提供了與傳統BIO模型中的 SocketServerSocket 相對應的 SocketChannelServerSocketChannel 兩種不一樣的套接字通道實現,兩種通道都支持阻塞和非阻塞兩種模式。阻塞模式使用就像傳統中的支持同樣,比較簡單,可是性能和可靠性都很差;非阻塞模式正好與之相反。對於低負載、低併發的應用程序,可使用同步阻塞I/O來提高開發速率和更好的維護性;對於高負載、高併發的(網絡)應用,應使用 NIO 的非阻塞模式來開發
  • AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改進版 NIO 2,它是異步非阻塞的IO模型。異步 IO 是基於事件和回調機制實現的,也就是應用操做以後會直接返回,不會堵塞在那裏,當後臺處理完成,操做系統會通知相應的線程進行後續的操做。AIO 是異步IO的縮寫,雖然 NIO 在網絡操做中,提供了非阻塞的方法,可是 NIO 的 IO 行爲仍是同步的。對於 NIO 來講,咱們的業務線程是在 IO 操做準備好時,獲得通知,接着就由這個線程自行進行 IO 操做,IO操做自己是同步的。查閱網上相關資料,我發現就目前來講 AIO 的應用還不是很普遍,Netty 以前也嘗試使用過 AIO,不過又放棄了。
相關文章
相關標籤/搜索