校招準備系列 每天一道演算法題(9) 單例

2021-08-08 01:44:23 字數 2106 閱讀 1960

單例 是最為最常見的設計模式之一。對於任何時刻,如果某個類只存在且最多存在乙個具體的例項,那麼我們稱這種設計模式為單例。例如,對於 class mouse (不是動物的mouse哦),我們應將其設計為 singleton 模式。

你的任務是設計乙個 getinstance 方法,對於給定的類,每次呼叫 getinstance 時,都可得到同乙個例項。

思考:首先,我們來了解一下單例模式,單例模式是一種物件建立模式,用於產生乙個物件的具體例項,他可以確保系統中乙個類只產生乙個例項,其好處在於:1)對於頻繁使用 物件,可以省略建立物件所花費的時間,尤其對於一些重量級物件;2)由於new操作次數減少,因而對系統記憶體的使用頻率也會降低,能減輕gc壓力,縮短gc停頓時間!so,對於系統的關鍵元件和被頻繁使用的物件使用單例模式可以有效的改善系統的效能。。。

單例模式的核心在於通過乙個介面返回唯一的物件例項!

**:

/**

* 單例模式:餓漢式

*/public

class

singletondemo1

private

static singletondemo1 instance = new singletondemo1();//static例項變數在類載入到記憶體時就會初始化 執行緒安全

public

static singletondemo1 getinstance()

}

從餓漢式**我們可以看出,1)單例類必須有乙個private的建構函式,只有這樣才能確保單例不會在系統中的其他**內被例項化;2)instance成員變數和getinstance()方法必須是static的。

閱讀餓漢式單例類的**,我們知道,其不足在於無法對instance例項做延遲載入,static例項變數在類載入到記憶體時就會初始化,單例物件就會被建立,其建立的物件是執行緒安全的!

改進**:

/**

* 單例模式:飽漢式

*/public

class

singletondemo2

private

static singletondemo2 instance = null;

public

static

synchronized singletondemo2 getinstance()

return instance;

}}

在這裡的處理中,我們首先對靜態成員變數instance初始值賦值null,確保系統啟動時沒有額外的負載;其次在getinstance()工廠方法中,判斷當前單例是否已經建立,若存在則返回,否則就再簡歷單例!

ps:方法中使用了synchronized關鍵字,避免多執行緒環境下,導致多個單例建立!

飽漢式單例模式雖然解決了延遲載入的問題,但加入synchronized關鍵字卻增加了系統的開銷,所以還需要進一步改進,想到的方法是使用內部類,這種方式使用內部類維護單例的例項,當singletondemo3 被載入的時候其內部類並不會被初始化,故可確保singletondemo3 類被載入到jvm時,不會初始化單例類,而當呼叫getinstance方法時,才會載入singletonholder,從而初始化instance,同時,由於其實例的建立是在類載入時完成,故天生對多執行緒友好,不需使用同步關鍵字,實現**如下:

/**

* 單例模式:內部類

*/public

class

singletondemo3

private

static

class

singletonholder

public

static singletondemo3 getinstance()

}

當然除了上面三種方式實現單例模式,我們還有常用的一種最簡單的方法,那就是列舉!!

/**

* 列舉類方式 最佳實踐 推薦

*/public

enum singletondemo3

}

校招準備系列 每天一道演算法題(10) 二維陣列查詢

此題來自劍指offer 題目描述 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。思路 二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。所以我們可...

每天一道演算法題

no.1 棧是特殊的線性表,它。a.對 b.錯答案 錯,它的插入和刪除都是在同一端進行的。no.2 n個葉子節點的滿二叉樹 除了葉子節點,每個節點都有兩個孩子 總共有多少個節點?a.2n 1 b.2n c.n 1 d.n答案 a 滿二叉樹我們講過了,度為0的節點比度為2的加點多乙個。滿二叉樹是特殊的...

每天一道演算法題

1.給定乙個只包括 的字串,判斷字串是否匹配。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。思路 正確思路 不需要考慮輸入內容是否合法,這只是做題,不是工程 定義乙個字典,後括號為鍵,前半部分為值 定義乙個元素儲存棧頂,注意這個設定,取棧...