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:類的構造方法
反射機制主要提供了以下功能:
- 在運行時判斷任意一個對象所屬的類。
- 在運行時構造任意一個類的對象。
- 在運行時判斷任意一個類所具有的成員變量和方法。
- 在運行時調用任意一個對象的方法。
- 生成動態代理。
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更多的空間(因爲要存放直接後繼和直接前驅以及數據)