Time of Update: 2018-12-07
策略模式是設計模式中很重要的一種,它的主要意圖就是:定義了演算法族,分別封裝起來,讓它們之間可以互相替換。它讓演算法的變化可以獨立於使用演算法的客戶,使得我們可以隨時更改它們而不影響用戶端的代碼,而用戶端可以自由選擇不同的演算法執行。 要想瞭解策略模式,我們就要理解幾個重要概念: 1.什麼是策略? 2.什麼是演算法? 3.演算法可替換的條件?
Time of Update: 2018-12-07
如果我們希望防止多個線程同時存取方法內部的部分代碼而不是防止訪問整個方法,通過這種方式分離出來的程式碼片段被稱為臨界區。那麼怎麼建立臨界區?這時就需要關鍵字synchronized。synchronized必須先指定某個對象,獲得該對象的鎖,來用來對花括弧內的代碼進行同步控制,如: synchronized(syncObject){...}
Time of Update: 2018-12-07
Time of Update: 2018-12-07
Time of Update: 2018-12-07
ArrayList和Array是我們在實際編程中經常使用的容器,而且因為ArrayList相當於動態化的數組,所以它們之間有太多的相似,以至於我們在選擇哪種來儲存元素的時候,會有小小的迷惑。 那麼,這兩者的區別和適用場合分別是什麼呢?一存放的內容
Time of Update: 2018-12-07
重構,在我們的程式設計中真的是非常重要的東西,它的作用,甚至可以說是魔法,能讓我們的代碼煥發生機,散發出優美的味道。因為重構並不能說是程式語言的文法,所以對於重構的介紹在市面上是比較少的,尤其是真正擲地有聲的權威著作,只能靠我們在自己的每次實踐中不斷實踐,不斷思考。就以我自己的一次重構經曆來說。
Time of Update: 2018-12-07
Time of Update: 2018-12-07
本次重構的目的,就是想要嘗試一下自己總結出來的代碼結構。很多新手,像我,總會在main方法中大量調用方法,使得main方法特別臃腫,這樣的代碼太難看了,我覺得,main方法的作用應該只是我們的程式的入口,就是它只是一個啟動的作用,最好就是只有一個調用的方法,然後這個方法再調用其他方法,這樣層層調用下去,條理性會更高點,然後我們也可以知道每個方法間的邏輯聯絡是怎樣,最主要的作用就是,通過這樣的處理,我們就可以找出我們代碼中的邏輯冗餘(一些功能相似但是外觀不一樣的方法體),以及一些不必要的臨
Time of Update: 2018-12-07
遍曆List,然後刪除其中的元素,這種操作存在風險,如果改變List的結構,就會影響到我們接下來的操作,這是危險的,甚至有些資料我們在毫不知情的情況下就被刪除掉。這都是不允許的,為應對這種情況,我們可以做一個映射,將原來List映射到新的List上,比如說,可以將不需要刪除的元素放到一個新的List上,而不是在原有List上直接刪除得到,這樣更加安全,但是很多情況下,我們根本就不知道資料是怎樣的,它哪些是重複的,需要進行判斷,但是在迴圈中如果這樣寫:
Time of Update: 2018-12-07
Time of Update: 2018-12-07
上個學期看了本《程式員的思維修鍊》,相信很多人都聽說過這本書,看完之後的感覺是有點豁然開朗的感覺,就像以前看的《駭客與畫家》,《暗時間》一樣,都對自己的生活,學習和工作有了新的認識,尤其是《程式員思維修鍊》裡面講到的敏捷開發這部分,更是激起我對敏捷式軟體開發 (Agile Software
Time of Update: 2018-12-07
在一些面試題目中,也會有所謂的指定位元為固定數位題目,比如說,這裡就有一個題目: 在1000以內的素數中,後面兩位元字是69的個數是? 我們來寫代碼吧,很簡單的代碼:public static void main(String[] args) { int counter = 0; for (int i = 69; i <= 1000; i = i + 100) { if (isPrime(i)) {
Time of Update: 2018-12-07
明年就要開始找工作了,所以現在正在準備中,惡補一些資料結構的基礎知識和面試題目,因此,在這裡不週期性整理一些題目。我發現,素數判斷是一個很常見的演算法,基本上,我看到的很多題目都要涉及到素數的判斷,比如說,1024到687432的所有素數的和,或者720的N次方中,有哪些數是素數等等,大體涉及到素數的題目,核心問題就是要懂得如何判斷素數。 那麼,如何判斷素數呢?素數是指只能被自身和1整除的自然數,常見而且比較容易實現的演算法是試除法:將該數N用<=N的所有素數去試除,
Time of Update: 2018-12-07
Time of Update: 2018-12-07
在並發編程中,線程的概念是非常重要的。說到線程,自然就要提到進程。下面就先釐清這兩個概念。進程是運行在自己的地址空間內的自包容的程式,線程是在進程中的一個單一的順序控制流程。因此,單個進程是可以擁有多個線程。所以,這裡我們可以知道,進程和線程的區別。 線程是很容易讓人跟任務混在一起,事實上,兩者根本不是同一個東西,只是經常捆在一起講。準確的說,任務是由執行線程來驅動的,任務是附著線上程上的。
Time of Update: 2018-12-07
內部類的構造器必須串連到指向其外圍類對象的引用,所以繼承內部類時,必須初始化這個引用,而在匯出類中,與外圍類對象預設的串連必須斷絕,以保持外圍類與匯出類的獨立性。如:class InheritInner extends WithInner.Inner{ InheritInner(WithInner with){ with.super();
Time of Update: 2018-12-07
我想了很久,還是無法得出一個準確的答案。如果從匿名內部類和局部內部類的存在意義來說的話,它們對於外圍類的方法來說,都是不可見的,但是不可見,只是方法無法使用它們,並不能說明什麼,內部類的方法和變數還是可以訪問的,只要有建立執行個體。所以,問題就可以歸於以下幾點的解決:1.如果內部類的引用不是final,會怎麼樣? 這問題從引用是final這點就已經解釋了。因為final是不能修改該引用所指向的對象,所以如果不是final,該引用所指向的對象可以被修改。問題又來了:2.
Time of Update: 2018-12-07
Time of Update: 2018-12-07
因為手頭上的東西需要用到Node.js,而且還是要在Linux下編程,所以我就去裝ubuntu虛擬機器(因為我是校園網,用ubuntu上不了網),這個過程也是折騰得我要死,所以我要在這裡和那些要裝在win7 32位下安裝ubuntu虛擬機器的同學說聲,用VMware吧,不要用那個什麼VirtureBox,那個我裝過,用不了。安裝完後,我就開始跟著教程來學習,結果,哈,第一個例子就將我難住了!難住我的並不是什麼文法的問題,而是我根本就不會用Linux!!我之前一直在windows下編程,
Time of Update: 2018-12-07
今天在一個需要在TabWidget中添加其他組件的東西,一開始從網上收集資料,發現如果沒有添加組件,在manifest中即使沒有添加<TabWidget></TabWidget>還是可以運行,但是一旦需要添加則必須加上,否則會報出這樣的錯誤:Could not create tab content because could not find view with