1. 程式人生 > >Java知識總結(一)

Java知識總結(一)

一、基礎篇

1.1、Java基礎 

  • 面向物件的特徵:繼承、封裝和多型





     

  • final, finally, finalize 的區別
    1、final修飾符(關鍵字)。被final修飾的類,就意味著不能再派生出新的子類,不能作為父類而被子類繼承。因此一個類不能既被abstract宣告,又被final宣告。將變數或方法宣告為final,可以保證他們在使用的過程中不被修改。被宣告為final的變數必須在宣告時給出變數的初始值,而在以後的引用中只能讀取。被final宣告的方法也同樣只能使用,不能過載。
    2、finally是在異常處理時提供finally塊來執行任何清除操作。不管有沒有異常被丟擲、捕獲,finally塊都會被執行。try塊中的內容是在無異常時執行到結束。catch塊中的內容,是在try塊內容發生catch所宣告的異常時,跳轉到catch塊中執行。finally塊則是無論異常是否發生,都會執行finally塊的內容,所以在程式碼邏輯中有需要無論發生什麼都必須執行的程式碼,就可以放在finally塊中。
    3、finalize是方法名。java技術允許使用finalize()方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個物件沒有被引用時對這個物件呼叫的。它是在object類中定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統資源或者被執行其他清理工作。finalize()方法是在垃圾收集器刪除物件之前對這個物件呼叫的。 

  • Exception、Error、執行時異常與一般異常有何異同


    可以看出,所有的異常都是由Throwable類,下一層分解為兩個分支:ErrorExceprion。 
    Error層次結構描述了java執行時系統的內部錯誤和資源耗盡錯誤。大多數錯誤與程式碼編寫者執行的操作無關,而表示程式碼執行時 JVM(Java 虛擬機器)出現的問題。應用程式不應該丟擲這種型別的物件。 
    Exceprion這個層次結構又分解為連個分支:一個分支派生於RuntimeException;另一個分支包含其他異常。劃分兩個分支的規則是:由程式錯誤導致的異常屬於RuntimeException;而程式本身沒有沒有問題,但由於像I/O錯誤這類異常導致的異常屬於其他異常。 
    常見的RuntimeException(執行時異常):

     
    IndexOutOfBoundsException(下標越界異常) 
    NullPointerException(空指標異常) 
    NumberFormatException (String轉換為指定的數字型別異常) 
    ArithmeticException -(算術運算異常 如除數為0) 
    ArrayStoreException - (向陣列中存放與宣告型別不相容物件異常) 
    SecurityException -(安全異常) 
    IOException(其他異常) 
    FileNotFoundException(檔案未找到異常。) 
    IOException(操作輸入流和輸出流時可能出現的異常。) 
    EOFException (檔案已結束異常)
     

  • 請寫出5種常見到的runtime exception
        常見的RuntimeException(執行時異常): 
             IndexOutOfBoundsException(下標越界異常) 
             NullPointerException(空指標異常) 
            NumberFormatException (String轉換為指定的數字型別異常) 
            ArithmeticException -(算術運算異常 如除數為0) 
            ArrayStoreException - (向陣列中存放與宣告型別不相容物件異常) 
            SecurityException -(安全異常) 

  • int 和 Integer 有什麼區別,Integer的值快取範圍(-128~127)
    (1)Integer是int的包裝類;int是基本資料型別; 
    (2)Integer變數必須例項化後才能使用;int變數不需要; 
    (3)Integer實際是物件的引用,指向此new的Integer物件;int是直接儲存資料值 ; 
    (4)Integer的預設值是null;int的預設值是0。

  • 包裝類,裝箱和拆箱
    包裝類(原始型別對應的類,即Boolean, Byte, Short, Integer, Long, Float, Double, Character)的自動拆、裝箱分別是指如下的過程:
     

    裝箱:是指基本型別變為相應包裝類的過程,如Integer a=Integer.valueOf(100);或者int a=100;Integer b=new Integer(a);這裡的Integer.valueOf(100)和new Integer(a)就是裝箱,由基本資料型別構造出一個包裝類的物件。

    拆箱:就是裝箱的逆過程。如Integer a=new Integer(100);int b=a.intValue();這裡的a.intValue()就是拆箱的過程,由一個包裝類物件轉換到相應的基本資料型別。

  • String、StringBuilder、StringBuffer
    1.執行速度,或者說是執行速度,在這方面執行速度快慢為:StringBuilder > StringBuffer > String
    String最慢的原因:String為字串常量,而StringBuilder和StringBuffer均為字串變數,即String物件一旦建立之後該物件是不可更改的,但後兩者的物件是變數,是可以更改的。

    2.線上程安全上,StringBuilder是執行緒不安全的,而StringBuffer是執行緒安全的
    總結:

           String:適用於少量的字串操作的情況

      StringBuilder:適用於單執行緒下在字元緩衝區進行大量操作的情況

      StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況

  • 過載和重寫的區別
    方法重寫(overriding):

           1、也叫子類的方法覆蓋父類的方法,要求返回值、方法名和引數都相同。

      2、子類丟擲的異常不能超過父類相應方法丟擲的異常。(子類異常不能超出父類異常)

      3、子類方法的的訪問級別不能低於父類相應方法的訪問級別(子類訪問級別不能低於父類訪問級別)
    方法過載(overloading):過載是在同一個類中的兩個或兩個以上的方法,擁有相同的方法名,但是引數卻不相同,方法體也不相同,最常見的過載的例子就是類的建構函式,可以參考API幫助文件看看類的構造方法。

  • 抽象類和介面有什麼區別
    抽象類是用來捕捉子類的通用特性的 。它不能被例項化,只能被用作子類的超類。抽象類是被用來建立繼承層級裡子類的模板。
    介面是抽象方法的集合。如果一個類實現了某個介面,那麼它就繼承了這個介面的抽象方法。這就像契約模式,如果實現了這個介面,那麼就必須確保使用這些方法。介面只是一種形式,介面自身不能做任何事情。

  • 當程式執行時,允許改變程式結構或變數型別,這種語言稱為動態語言。我們認為 Java 並不是動態語言,但是它卻又一個非常突出的動態相關的機制,俗稱:反射。
    Reflection 是Java 程式開發語言的特徵之一,它允許執行中的 Java 程式獲取自身的資訊,並且可以操作類和物件的內部屬性。

    通過反射,我們可以在執行時獲得程式或程式集中每一個型別成員和成員變數的資訊。
    程式中一般的物件型別都是在編譯期就確定下來的,而Java 反射機制可以動態的建立物件並呼叫其屬性,這樣物件的型別在編譯期是未知的。所以我們可以通過反射機制直接建立物件即使這個物件在編譯期是未知的,
    反射的核心:是 JVM 在執行時 才動態載入的類或呼叫方法或屬性,他不需要事先(寫程式碼的時候或編譯期)知道執行物件是誰。


    反射機制是Java語言中一個非常重要的特性,它允許程式在執行時進行自我檢查,同時也允許對其內部成員進行操作。反射機制提供的功能主要有:得到一個物件所屬的類;獲取一個類的所有成員變數和方法;在執行時建立物件;在執行時呼叫物件的方法

  • 說說自定義註解的場景及實現

    @Table("user")   @Test等

  • HTTP請求的GET與POST方式的區別
    1.get是從伺服器上獲取資料,post是向伺服器傳送資料。
    2.get是把引數資料佇列加到提交表單的ACTION屬性所指的URL中,值和表單內各個欄位一一對應,在URL中可以看到。post是通過HTTPpost機制,將表單內各個欄位與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。使用者看不到這個過程。
    3.對於get方式,伺服器端用Request.QueryString獲取變數的值,對於post方式,伺服器端用Request.Form獲取提交的資料。

    4.get傳送的資料量較小,不能大於2KB。post傳送的資料量較大,一般被預設為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。(這裡有看到其他文章介紹get和post的傳送資料大小跟各個瀏覽器、作業系統以及伺服器的限制有關)

    5.get安全性非常低,post安全性較高。
     

  • Session與Cookie區別
    1、cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。
    2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
       考慮到安全應當使用session。
    3、session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能
       考慮到減輕伺服器效能方面,應當使用COOKIE。
    4、單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。

  • 列出自己常用的JDK包
    1、java.lang
    2、java.sql
    3、java.io
    4、java.math
    5、java.text
    6、java.net
    7、java.util
    8、java.awt
    9、java.applet
    10、java.nio

  • MVC設計思想
    控制器(Controller):用來控制程式的流轉
    介面(View):用來和使用者進行互動。
    模型(Model):用來封裝資料和處理業務邏輯。
    MVC 是一種軟體架構的思想,將一個軟體按照模型、檢視、控制器進行劃分。其中,模型用來封裝業務邏輯,檢視用來實現表示邏輯,控制器用來協調模型與檢視(檢視要通過控制器來呼叫模型,模型返回的處理結果也要先交給控制器,由控制器來選擇合適的檢視來顯示 處理結果)。
    1)模型: 業務邏輯包含了業務資料的加工與處理以及相應的基礎服務(為了保證業務邏輯能夠正常進行的事務、安全、許可權、日誌等等的功能模組)
    2)檢視:展現模型處理的結果;另外,還要提供相應的操作介面,方便使用者使用。

    3)控制器:檢視發請求給控制器,由控制器來選擇相應的模型來處理;模型返回的結果給控制器,由控制器選擇合適的檢視。

  • equals與==的區別
    == 比較的是變數(棧)記憶體中存放的物件的(堆)記憶體地址,用來判斷兩個物件的地址是否相同,即是否是指相同一個物件。比較的是真正意義上的指標操作。
    equals用來比較的是兩個物件的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以適用於所有物件,如果沒有對該方法進行覆蓋的話,呼叫的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷。
     

  • 什麼是Java序列化和反序列化,如何實現Java序列化?或者請解釋Serializable 介面的作用
    把物件轉換為位元組序列的過程稱為物件的序列化,把位元組序列恢復為物件的過程稱為物件的反序列化。
    序列化的實現:將需要被序列化的類實現Serializable介面,該介面沒有需要實現的方法,implements Serializable只是為了標註該物件是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(物件流)物件,接著,使用ObjectOutputStream物件的writeObject(Object obj)方法就可以將引數為obj的物件寫出(即儲存其狀態),要恢復的話則用輸入流。

  • Object類中常見的方法,為什麼wait  notify會放在Object裡邊?
    簡單的說:因為synchronized中的這把鎖可以是任意物件,所以任意物件都可以呼叫wait()和notify();所以wait和notify屬於Object。

    專業說:因為這些方法在操作同步執行緒時,都必須要標識它們操作執行緒的鎖,只有同一個鎖上的被等待執行緒,可以被同一個鎖上的notify喚醒,不可以對不同鎖中的執行緒進行喚醒。

    也就是說,等待和喚醒必須是同一個鎖。而鎖可以是任意物件,所以可以被任意物件呼叫的方法是定義在object類中。

  • Java的平臺無關性如何體現出來的

    JVM所指的就是Java虛擬機器。Java正是憑藉Java虛擬機器來實現其平臺無關性的。通過在機器與編譯程式之間加入一層抽象(即JVM)來實現脫離平臺這一性質。

    其中,注意:

    Java虛擬機器面向編譯器給其提供相同的介面(即各平臺編譯器相同),這就是說,編譯器只要面向Java虛擬機器生成Java虛擬機器可以理解的程式碼,那麼就可以通過不同平臺的不同直譯器來生成與平臺相對應的機器碼來執行Java程式。虛擬機器暴露給編譯器的介面是相同的,而虛擬機器的直譯器針對不同的平臺而不同。

  • JDK和JRE的區別
    Jdk 是java development kit,是java的開發工具包,裡面包含了各種類庫和工具。
    Jre 是java runtime environment, 是java程式的執行環境。

  • Java 8有哪些新特性