原创 什麼是回調函數(CallBack)

我們先來看下維基百科的定義:在計算機程序設計中,回調函數,或簡稱回調(call),是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。這一設計允許了底層代碼調用在高層定義的子程序。這種標準的定義,大多數時候說的都比較抽象,下面我們以實

原创 關於Java的BIO,NIO和AIO的演進

前言Java裏面的IO模型種類較多,主要包括BIO,NIO和AIO,每個IO模型都有不一樣的地方,那麼這些IO模型是如何演變呢,底層的原理又是怎樣的呢? 本文我們就來聊聊。BIOBIO全稱是Blocking IO,是JDK1.4之前的傳統I

原创 各種IO複用模式之select,poll,epoll,kqueue,iocp分析

前言上篇文章,我們介紹了Java IO框架的演變,其實編程語言的IO實現是依賴於底層的操作系統,如果OS內核不支持,那麼語言層面也無能爲力。任何一個跨平臺的編程語言,一定是能夠在不同操作系統之間選擇使用最優的IO模型,那麼不同平臺的io策略

原创 關於拷貝對象引用到local變量的一些思考

在JDK的Java類源碼裏面,很多工具包的代碼都有在使用某個成員變量之前,先拷貝該變量的對象引用到方法的局部變量之中,如下:比如LinkedList:public E peek() { final Node<E> f = first

原创 IO設計模式之Reactor和Proactor

前言上面文章中,我們提到不同的操作系統實現的io策略可能不一樣,即使是同一個操作系統也可能存在多重io策略,常見如linux上的select,poll,epoll,面對這麼多不同類型的io接口,這裏需要一層抽象api來完成,所以就演變出來兩

原创 再談方法調用與堆棧

在JVM裏面,最重要的兩個運行時數據區,無非就是堆和棧了。關於堆堆內存是被多個線程共享的,而棧內存是線程私有的。堆主要用來存儲運行時所有的對象數據和各種數組,簡單點說通過new創建的實例,都會在堆上分配空間。堆在虛擬機啓動時創建,並且堆具有

原创 聊聊Java裏面的引用傳遞

長久以來,在Java語言裏面一直有一個爭論,就是Java語言到底是值傳遞(pass-by-value)還是引用傳遞(pass-by-reference),有的人說是值傳遞,有的人說是引用傳遞,兩邊各執一詞,從而誤導了很多開發者,更有甚者告訴

原创 理解插入排序,希爾排序,選擇排序的算法原理

在前面的文章中,其實已經把效率比較高的排序算法給分析過了,比如比較通用的快排,歸併排序和堆排,還有用於特定場景的計數排序等。本篇我們把剩下的幾種效率一般的排序算法給介紹一下,分別是插入排序,希爾排序和選擇排序。插入排序(Insert Sor

原创 理解BitMap算法的原理

前言位圖:一種常用的數據結構,代表了有限域中的稠集(dense set),每一個元素至少出現一次,沒有其他的數據和元素相關聯。在索引,數據壓縮,海量數據處理等方面有廣泛應用。BitMap 的思想的和原理是很多算法的基礎,比如 Bloom F

原创 理解Java8裏面CompletableFuture異步編程

Java8主要的語言增強的能力有:(1)lambda表達式(2)stream式操作(3)CompletableFuture其中第三個特性,就是今天我們想要聊的話題,正是因爲CompletableFuture的出現,才使得使用Java進行異步

原创 理解堆排序的原理

前面的文章提到過,堆的數據結構其實是一顆二叉樹,準確的說是一顆完全二叉樹,因此符合完全二叉樹的性質: 如果對具有n個節點二叉樹的根節點從0開始編號,則序號爲i的節點的雙親結點爲(i-1)/2, 左孩子的編號爲2i+1, 右孩子爲2i+2。如

原创 數據結構之樹

前言樹(Tree)是一種抽象數據類型(ADT)或是實現這種抽象數據類型的數據結構,用來模擬具有樹狀結構性質的數據集合。它是由n(n>0)個有限節點組成一個具有層次關係的集合。把它叫做“樹”是因爲它看起來像一棵倒掛的聖誕樹,也就是說它是根朝上

原创 如何避免單例模式被破壞

單例模式幾乎每個開發者都會用,但想要寫出比較健壯的單例程序,其實並不容易。這裏不再討論單例的模式的n種寫法,僅僅討論如何避免單例模式被破壞,看下面的一個例子:public class SimpleSingleton { priva

原创 深入理解Java類加載器機制

前言Java裏面的類加載機制,可以說是Java虛擬機核心組件之一,掌握和理解JVM虛擬機的架構,將有助於我們站在底層原理的角度上來理解Java語言,這也是爲什麼我們學習一個新的知識時,如果不理解原理全靠死記硬背,我相信過不了幾天便會忘記的一

原创 理解Linux裏面的IO模型

前言在談到IO模型之前,我們先來了解下Liunx裏面的幾個概念:User space(用戶空間)和 Kernel space(內核空間)。Linux裏面這麼設計的目的主要是爲了安全,即使用戶空間崩潰了,內核也不受影響。所以在Linux世界,