1.定時器Timer類
構造定時器時,需要設置一個時間間隔,并告知定時器,當到達時間間隔時需要做什么操作。定時器需要知道調用哪一個方法,并要求傳遞的對象所屬的類實現了java.awt.event包的ActionListener接口
例:
Class TimePRinter implements ActionListener{ public void actionPerformed(ActionEvent event ) { Date now = new Date(); System.out.println(now); }}ActionListener listener = new TimePrinter();Timer t=new Timer(1000,listener);t.start();
2.局部類final變量做計數器
使用一個長度是1的數組做計數
final int[] count =new int[1];for(int i=0;i<dates.length;i++) dates[i]=new Date() { public int compareTo(Date other) { counter[0]++; return super.compareTo(other); } }; 3.拋出原始異常
在catch子句中可以拋出一個異常,這樣做的目的是改變異常的類型。如需拋出高級異常,而不丟失原始異常的細節,可使用:
try{ access the database}catch(SqlException e){ Throwable se =new ServletException(“database error”); se.initCause(e); throw se;}4.finally語句中異常的處理
finally中的語句可能出現異常時,建議獨立使用try/catch 和try/finally語句塊,這樣可以提高代碼的清晰度。例如:
InputStream in= …try{ try{ code that might throw exceptions }finally{ in.close(); }}catch(IOException e){ Show error dialog}
內層的try語句塊只有一個職責,就是確保關閉輸入流。外層的try語句塊也只有一個職責,就是確保報告出現的錯誤。這種設計方式不僅清楚,而且還具有一個功能,就是將會報告finally中出現的錯誤。
5.斷言
斷言機制允許在測試期間向代碼中插入一些檢查語句。當代嗎發布是,這些插入的檢測語句將會被自動的移走
方式一:assert 條件 ;
方式二:assert 條件 : 表達式 ;
表達式的將被傳入AssertionError的構造器,并轉換成一個消息字符串。
6.泛型中變量的命名
在構造泛型時,類型變量使用大些形式,且比較短。在Java庫中,使用變量E表示集合的元素類型,K和V分別表示表的關鍵字與值得類型。T(需要時還可以使用臨近的字母U和S)表示“任意類型”
Java泛型在運行時存在一個類型擦除的過程,中間過程會將泛型擦除為Object類,因此,不能使用基本類型實例化類型參數。因此,沒有Pair<double>,只有Pair<Double>
7.Iterator使用
Iterator接口的remove方法見會刪除上次調用next方法時返回的元素。在大多數情況下,決定刪除某個元素之前應該先看一下這個元素是很具有實際意義的。然而,如果想要刪除指定位置上的元素,仍然需要約過這個元素。
例:刪除字符串集合中第一個元素:
Iterator<String> it = c.iteraotr();it.next();it.remove();
8.Vector與ArrayList
對于一個經驗豐富的Java程序員來說,在需要動態數組時,可能會使用Vector類。Vector類的所有方法都是同步的。可以由兩個線程安全地訪問一個Vector對象,但是,如果由一個線程訪問Vector,代碼要在同步操作上耗費大量的時間。而ArrayList方法不是同步的,因此,建議在不需要同步時使用ArrayList,而不是Vector
9.線程中斷異常處理
不要將InterruptedException異常抑制在很低的層次上,比如
void mySubTask(){ try{ sleep(delay);} catch(InterruptedException e){}}這樣會導致調用者無法檢測或捕獲這一異常。應使用以下兩種方式
1) 在catch字句中調用Thread.currentThread().interrupt()來設置中斷
Void mySubTask(){ try{ sleep(delay); }catch(InterruptedException e){ Thread.currentThread().interrupt(); }}2) 更好的選擇是,用throws InterrupterException標記你的方法
void mySubTask() throws InterrupterException{ sleep(delay);}10.synchronized關鍵字
public synchronized voi method() { method body}等價于
public void method(){ this.intrinsicLock.lock(); try{ method body }finally{ this.intrinsicLock.unlock(); }}11.使用Object鎖
public class Bank{ public void transfer(int from ,int to , int mount){ synchronized(lock){ accounts[from]-=amount; accounts[to]+=amount; } System.out.println(…); } private double[] account; private Object lock = new Object();}12.Java類庫中的集合
ArrayList 一種可以動態增長和縮減的索引序列
LinkedList 一種可以在任何位置進行高效的差如何刪除操作的有序序列
ArrayDeque 一種用循環數組實現的雙端隊列
HashSet 一種沒有重復元素的無序集合
TreeSet 一種有序集
EnumSet 一種包含枚舉類型值的集
LinkedHashSet 一種可以記住元素插入次序的集
PriorityQueue 一種允許高效刪除最小元素的集
HashMap 一種存儲鍵值關聯的數據結構
TreeMap 一種鍵值有序排列的映射表
EnumMap 一種鍵值屬于枚舉類型的映射表
LinkedHashMap 一種可以記住鍵值項添加次序的映射表
WeakHashMap 一種其值無用后可以被垃圾回收器回收的映射表
IdentityHashMap 一種用==,而不是用equals比較鍵值的映射表
新聞熱點
疑難解答