靜態類和靜態方法
如果一個類要被聲明為static的,只有一種情況,就是靜態內部類。
靜態內部類實際上與普通類(即類名必須與文件名一樣的頂級類)一樣,只是靜態內部類在某一類的內部定義了而已,既然是類,要想使用就必須實例化。概念上與靜態變量、靜態方法是不一樣的,不要被“靜態”兩個字迷惑了(不要以為凡是靜態的東西就不需要實例化就可以直接使用,靜態內部類是有區別),而且只有靜態內部類,而沒有靜態類(頂級類)的概念。
例子:
public class Singleton{ private Singleton(){} private static class SingletonHolder{ private final static Singleton instance; } public Singleton getInstance(){ return SingletonHolder.instance; } }
靜態方法只能訪問靜態成員,實例方法可以訪問靜態和實例成員。之所以不允許靜態方法訪問實例成員變量,是因為實例成員變量是屬於某個對象的,而靜態方法在執行時,並不一定存在對象。靜態方法中也不能使用關鍵字this。
倒排索引
Inverted Index
如果翻譯成轉置索引可能更好懂,它就相當於做了矩陣轉置。
倒排索引是一種索引方法,被用來存儲在全文搜索下某個單詞在一個文檔或者一組文檔中的存儲位置的映射。
反射
反射API中提供的動態代理也是非常強大的功能,可以原生實現AOP中 的方法攔截功能。正如英文單詞reflection的含義一樣,使用反射API的時候就好像在看一個Java類在水中的倒影一樣。知道了Java類的內部 結構之后,就可以與它進行交互,包括創建新的對象和調用對象中的方法等。
這種交互方式與直接在源代碼中使用的效果是相同的,但是又額外提供了運行時刻的靈活性。使用反射的一個最大的弊端是性能比較差。相同的操作,用反射API所需的時間大概比直接的使用要慢一兩個數量級。不過現在的JVM實現中,反射操作的性能已經有了很大的提升。
Java 反射API的第一個主要作用是獲取程序在運行時刻的內部結構。
枚舉類型
Enumerated Type
enum 類型不支持 public 和 protected 修飾符的構造方法,因此構造函數一定要是 private 或 friendly 的。也正因為如此,所以枚舉對象是無法在程序中通過直接調用其構造方法來初始化的。
由於 enum 類型的值實際上是通過運行期構造出對象來表示的,所以在 cluster 環境下,每個虛擬機都會構造出一個同義的枚舉對象。因而在做比較操作時候就需要注意,如果直接通過使用等號 ( ‘ == ’ ) 操作符,這些看似一樣的枚舉值一定不相等,因為這不是同一個對象實例。
多線程
Java中實現多線程有兩種方法:繼承Thread類、實現Runnable接口,在程序開發中只要是多線程,肯定永遠以實現Runnable接口為主,因為實現Runnable接口相比繼承Thread類有如下優勢:
1、可以避免由於Java的單繼承特性而帶來的局限;
2、增強程序的健壯性,代碼能夠被多個線程共享,代碼與數據是獨立的;
3、適合多個相同程序代碼的線程區處理同一資源的情況。
下面是通過實現Runnable接口實現的多線程程序,代碼如下:
lass MyThread implemments Runnable{ private int ticket =5; public void run(){ for(int i=0;i<10;i++){ if(ticket>0){ System.out.println("ticket="+ticket--); }}}} public class RunnableDemo{ public static void main (String[] args){ MyThread my = new MyThread(); new Thread(my).start(); new Thread(my).start(); new Thread(my).start(); }}
多路歸並算法
歸並排序也是一種使用分治法來實現的有效排序算法,它是現代計算機創始人John von Neumann於1945年發明的。
歸並排序在眾多排序算法中既是穩定排序,又有不錯的效率,同時,歸並排序不僅可以用於內排序,還可以用於外排序。
歸並排序的思路如下(以二路歸並為例):
將數組划均分為兩個子數組;
對兩個字數組進行排序;
將排序好的兩個字數組歸並。
所謂 N路歸並 是指將數組均分為N個子數組,將字數組排序后再歸並。因此二路歸並是歸並排序的最一般的情況。
例子:
def msort(array): length=len(array) if length ==1; return array else: mid=length/2 left = msort(array[0:mid) right = msort(array[mid:length]) return merge(left,right)
非遞歸
def msort(array) step=1 while step<length: for left in range(0,length-step,2*step): result=merge(array[left:left+step]), array[left+step:min(left+2*step,length)]) array=array[0:left]+result+array[min(left+2*step,length)] step=step*2 return array def merge(left,right): llen=len(left) lcur=0 rlen=len(right) rcur=0 result=[] while lcur<llen and rcur<rlen: lone= left[lcur] rone=right[rone] result.append{min(lone,rone)} if lone<rone: lcur+=1 else: rcur+=1 result+=lefte[lcur:] result+=right[rcur:] return result
文章轉載自 樂橙谷http://www.lechenggu.com/bbs/topic/57fdb5c19c73a464f54e7574