JAVA特性
基礎語法
一、Java程序的命令行工具
二、final、finally、finalize
三、繼承
class 父類 {
//代碼
}class 子類 extends 父類 {
//代碼
}
四、Vector、ArrayList、LinkedList
五、原始數據類型和包裝類
六、接口和抽象類
JAVA進階
Java引用隊列
Object counter = new Object();
ReferenceQueue refQueue = new ReferenceQueue<>();
PhantomReference<Object> p = new PhantomReference<>(counter, refQueue);
counter = null;
System.gc();
try {// Remove是一個阻塞方法,可以指定timeout,或者選擇一直阻塞Reference<Object> ref = refQueue.remove(1000L);if (ref != null) {// do something}
} catch (InterruptedException e) {// Handle it
}
七、JAVA IO
三種IO方式
java.io包
也叫BIO。它基于流模型實現,在進行讀取輸入流或者寫入輸出流操作時,讀、寫動作完成之前,線程會一直阻塞,它們之間的調用是可靠的線性順序。優點是代碼比較簡單、直觀,缺點是IO 效率和擴展性存在局限性。
java.nio包
NIO 框架,提供了 Channel、Selector、Buffer 等新的抽象。它可以構建多路復用的、同步非阻塞 IO 程序,同時提供了更接近操作系統底層的高性能數據操作方式。
NIO2
也叫AIO(Asynchronous IO),它是NIO的進一步改進,引入了異步非阻塞 IO 方式。異步 IO 操作基于事件和回調機制,應用操作直接返回,而不會阻塞在那里,當后臺處理完成,操作系統會通知相應線程進行后續工作。
IO 工具類
File
這里是引用
RandomAccessFile
這里是引用
字節流
InputStream和OutputStream。
字符流
Reader和Writer。
補充知識點
Closeable 接口:
try-with-resources、 try-finally
Cleaner 或 finalize 機制:資源釋放的最后把關
NIO
1.主要組成
主要由Buffer、Channel、Selector、Charset四部分組成。
Buffer(緩沖區):
NIO 中,數據都是通過 Buffer 處理的; 除了布爾類型,所有原始數據類型都有相應的 Buffer 實現( ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer 和 DoubleBuffer)。
Buffer詳細介紹:
Buffer的幾個基本屬性:capacity、position、limit、mark。
capacity: Buffer的大小,即數組的長度。
position:要操作的數據的起始位置。
limit:操作的限額。(注意,在讀取和寫入時,limit的意義是不同的)
mark:記錄上一次position的位置,但不是必須的。(默認是0)
Channel(通道):
NIO 中被用來支持批量式 IO 操作的一種抽象,可以進行異步的 IO 操作。
常見的 Channel 類有 FileChannel、SocketChannel、ServerSocketChannel 和 DatagramChannel。
Selector(選擇器):
Selector 可以用來實現 Reactor 模式,用于監聽多個 Channel 的事件。因此,可以檢測到注冊在 Selector 上的多個 Channel 中,是否有 Channel 處于就緒狀態,實現了單線程對多 Channel 的高效管理,是javaNIO 實現多路復用的基礎。
Charset:
提供 Unicode 字符串定義。
2.NIO的核心
Buffer 和 Channel 之間的交互:數據可以從 Channel 讀取到 Buffer 中,也可以從 Buffer 寫入到 Channel 中。
3.NIO的優點
NIO通過高效地定位就緒的 Channel,高效分配任務。僅select 時是阻塞的,所以可以避免大量客戶端連接時,頻繁切換線程。因此,應用的擴展性有了非常大的提高。
異常處理時的基本原則
補充概念
同步或異步(synchronous/asynchronous)
同步:當我們進行同步操作時,后續的任務是等待當前調用返回,才會進行下一步。
異步:其他任務不需要等待當前調用返回,通常依靠事件、回調等機制來實現任務間次序關系
阻塞與非阻塞(blocking/non-blocking)
阻塞狀態:無法從事其他任務,只有當條件就緒才能繼續。
非阻塞:不管 IO 操作是否結束,直接返回,相應操作在后臺繼續處理。
序列化(Serialization)
這里是引用
補充知識點
不能一概而論認為同步或阻塞就是低效。
網絡編程中,比如 Socket 通信,都是典型的 IO 操作目標
補充
FileSystemProvider
兩種特別的Buffer:Direct Buffer和MappedByteBuffer
DirectBuffer:
DirectBuffer是ByteBuffer的一種特殊形式,用于在堆外(Off-heap)內存中存儲數據。
DirectBuffer創建方法:
調用ByteBuffer的allocateDirect()方法來創建。(不是使用傳統的allocate()方法)
DirectBuffer的主要特點:
特點 | 內容 |
---|---|
直接訪問 | 因為內存是在堆外分配的,所以DirectBuffer對象可以通過JNI(Java Native Interface)直接訪問,從而避免了在Java堆和本機堆之間來回復制數據的開銷 |
堆外內存存儲 | DirectBuffer對象分配的內存不在Java虛擬機的堆中,而是直接在操作系統的本機內存中分配的 |
性能優化 | DirectBuffer適用于需要頻繁訪問大量數據或需要與本地(native)代碼進行交互的場景,它們可以顯著提高數據訪問和操作的效率,因為避免了額外的內存拷貝。 |
DirectBuffer的使用需要注意:
- 它們的創建和銷毀通常比普通的堆上的ByteBuffer更昂貴,因為涉及到操作系統的本機內存管理。
- 對于小數據量的操作,并不一定比普通的堆上操作性能更好,甚至可能更差,因為操作系統在小塊內存分配和釋放上的開銷相對較大。
垃圾收集方面的特殊性。