java面試(基礎總結)

Java八種基本數據類型

類 型    大小        封 裝 類
byte     1字節         Byte
short    2字節        Short
int      4字節            Integer
long    8字節         Long
float    4字節         Float
double    8字節    Double
char    2字節    Character
boolean    –    Boolean

Java面向的四個基本特性

封裝:將客觀事物包裝成類,隱藏具體實現,提供操作接口。
繼承:子類獲得父類的屬性和行爲(extends)。
多態:同一行爲多種表現形式。
重寫Override
接口的不同實現implements
抽象類和抽象方法abstract
抽象:用代碼描述客觀事物。包括數據抽象(屬性)和過程抽象(行爲)

Java中的反射機制

在運行狀態中,對於任意一個類,都能夠知道其所有屬性和方法;對於任意一個對象,都能夠調用其任意方法和屬性。這種動態獲取信息及動態調用對象方法的功能稱爲Java語言的反射機制。Java反射API如下:

Class:反射的核心類。
Field:類的成員變量。
Method:類的成員方法。
Constructor:類的構造方法

  反射機制主要提供了以下功能:

  1. 在運行時判斷任意一個對象所屬的類。
  2. 在運行時構造任意一個類的對象。
  3. 在運行時判斷任意一個類所具有的成員變量和方法。
  4. 在運行時調用任意一個對象的方法。
  5. 生成動態代理。             

Java 8新特性

默認方法:在接口裏面有了一個實現的方法
Lambda 表達式:Lambda允許把函數作爲一個方法的參數
Stream API:把真正的函數式編程風格引入到Java中
Date Time API:加強對日期與時間的處理
Optional 類:Optional 類已成爲 Java 8類庫的一部分,用來解決空指針異常
方法引用:可以直接引用已有Java類或對象的方法或構造器
新編譯工具:Nashorn引擎(一個新的JavaScript引擎)、 類依賴分析器

Java異常機制

Error與Excption包結構

1.Error:程序無法處理的錯誤,繼承自Throwable。

2.Exception:程序可以處理的異常,繼承自Throwable。
1. Checked Exception:受檢異常,需要強制catch,是Exception的子類。
2. Unchecked Exception:不受檢異常,無需強制catch,是RuntimeException的子類。

常見的異常

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

異常處理方式

通過try、catch捕獲異常

try{

// 程序代碼

}catch(ExceptionName e1){

//Catch 塊

}

通過throws拋出異常

定義一個方法的時候可以使用throws關鍵字聲明。使用throws關鍵字聲明的方法表示此方法不處理異常,而交給方法調用處進行處理。

throw關鍵字拋出異常

throw關鍵字作用是拋出一個異常,拋出的時候是拋出的是一個異常類的實例化對象,在異常處理中,try語句要捕獲的是一個異常對象,那麼此異常對象也可以自己拋出。

Interface與abstract類的區別

比較點 Interface abstract類
中文 接口 抽象類
能否實例化 不能 不能
方法能否實現 Java 8 可以 可以
一個類可以 implements多個 extends一個

Override和Overload的區別

比較點 Override Overload
中文 重寫 重載
方法名 相同 相同
形參 相同 不同
返回類型 相同 可同可不同

String、StringBuffer、StringBuilder

比較點 :           String                  StringBuffer        StringBuilder
底層實現:       final char value[]    char[] value       char[] value
可變性:                 不可變            可變                       可變
修改時  :             不會改變自身    會改變自身           會改變自身
安全性 :                  線程安全           線程安全            非線程安全
使用場景:           少量數據                多線程大量數據              單線程大量數據

equals()與==的區別

java中的數據類型,可分爲兩類:
1.基本數據類型,也稱原始數據類型。byte,short,char,int,long,float,double,boolean
  他們之間的比較,應用雙等號(==),比較的是他們的值。

  基本數據類型比較(string 除外), == 和 Equals 兩者都是比較值;
2.複合數據類型(類)
  當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較後的結果爲true,否則比較後結果爲false。

3. 字符串緩衝池
原來,程序在運行的時候會創建一個字符串緩衝池當使用 s2 = "Monday" 這樣的表達是創建字符串的時候,程序首先會在這個String緩衝池中尋找相同值的對象,在第一個程序中,s1先被放到了池中,所以在s2被創建的時候,程序找到了具有相同值的 s1
將s2引用s1所引用的對象"Monday"
第二段程序中,使用了 new 操作符,他明白的告訴程序:"我要一個新的!不要舊的!"於是一個新的"Monday"Sting對象被創建在內存中。他們的值相同,但是位置不同

comparable接口和comparator接口

  • Comparable:在集合內部實現排序的接口,位於java.lang包。
  • Comparator:在集合外部實現排序的比較器接口,位於java.util包

public class Person implements Comparable {
    String name;
    int age;
    
    @Override
    public int compareTo(Object o) {
        // 使用字符串的比較
        int i = name.compareTo(((Person) o).name); 
        
        if (i == 0) { // 如果名字一樣,比較年齡, 返回比較年齡結果
            return age - ((Person) o).age;
        } else {
            return i; // 名字不一樣, 返回比較名字的結果.
        }
    }
}

//使用Collections.sort(personList)即可排序

IO,BIO,NIO,AIO

Java中IO是以流爲基礎進行輸入輸出的,在網絡編程中,接觸到最多的就是利用Socket進行網絡通信開發,主要有BIO、NIO、AIO三種實現方式

比較點                     BIO                          NIO                                      AIO
中文                     阻塞IO                      非阻塞IO                             異步IO
版本                        –                            JDK 1.4提出                      JDK 1.7 提出
描述     

服務端每次都需要創建一個線程來建立連接並處理消息。若建立連接、讀寫數據時發生阻礙,線程會阻塞。併發情況下,N個連接需要N個線程來處理。    

使用一個線程來管理所有的Socket 通道,也就是基於Selector機制,查詢到事件時(連接、讀寫),轉發給不同的處理線程(Handler)。    

在進行讀寫操作時,只需要調用相應的read/write方法,並傳入CompletionHandler(動作完成處理器),在動作完成後會調用CompletionHandler。

序列化與反序列化

序列化即把對象轉換爲字節序列;反序列化即把字節序列恢復爲對象。其使用場景大致有如下幾種:

  • 把內存中的對象狀態保存到文件或者數據庫中。
  • 用套接字在網絡上傳送對象。
  • 通過RMI傳輸對象。

哪些情況會導致OOM或SOF,怎麼解決
OutOfMemory(OOM)
Java堆溢出:一般由於內存泄露或者堆的大小設置不當引起。可以通過虛擬機參數-Xms、-Xmx等設置堆大小。
方法區溢出:包括運行時常量池溢出,一般由於大量動態生成的Class導致。可以通過-XX:PermSize和-XX:MaxPermSize限制方法區的大小。
使用JConsole生成Heap Dump文件,然後使用MAT分析排查

StackOverflow(SOF)
Java虛擬機棧和本地方法棧內存溢出:一般是由於程序中存在死循環或者深度遞歸調用造成的,棧設置太小也會出現此種溢出。可以通過虛擬機參數-Xss來設置棧大小。
 

java 集合框架

Arraylist 與 LinkedList 區別?

  • 1. 是否保證線程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保證線程安全;

  • 2. 底層數據結構: Arraylist 底層使用的是 Object 數組;LinkedList 底層使用的是 雙向鏈表 數據結構(JDK1.6之前爲循環鏈表,JDK1.7取消了循環。注意雙向鏈表和雙向循環鏈表的區別,下面有介紹到!)

  • 3. 插入和刪除是否受元素位置的影響: ① ArrayList 採用數組存儲,所以插入和刪除元素的時間複雜度受元素位置的影響。 比如:執行add(E e) 方法的時候, ArrayList 會默認在將指定的元素追加到此列表的末尾,這種情況時間複雜度就是O(1)。但是如果要在指定位置 i 插入和刪除元素的話(add(int index, E element) )時間複雜度就爲 O(n-i)。因爲在進行上述操作的時候集合中第 i 和第 i 個元素之後的(n-i)個元素都要執行向後位/向前移一位的操作。 ② LinkedList 採用鏈表存儲,所以插入,刪除元素時間複雜度不受元素位置的影響,都是近似 O(1)而數組爲近似 O(n)。

  • 4. 是否支持快速隨機訪問: LinkedList 不支持高效的隨機元素訪問,而 ArrayList 支持。快速隨機訪問就是通過元素的序號快速獲取元素對象(對應於get(int index) 方法)。

  • 5. 內存空間佔用: ArrayList的空 間浪費主要體現在在list列表的結尾會預留一定的容量空間,而LinkedList的空間花費則體現在它的每一個元素都需要消耗比ArrayList更多的空間(因爲要存放直接後繼和直接前驅以及數據)


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章