jdk1.6拾遺之assert,TreeSet

在看heritrix是發現有這個關鍵字,沒見過mark下,[b]查jdk1.6發現沒有此關鍵字,估計在1.6中就不再使用了。[/b]
其介紹如下
[b]Java斷言assert的使用方法[/b]
摘自(http://www.cnblogs.com/change/archive/2005/05/24/161772.html)
用assert.斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式爲 true.如果表達式計算爲 false,那麼系統會報告一個 AssertionError.它用於調試目的:
assert(a > 0); // throws an AssertionError if a <= 0斷言可以有兩種形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 應該總是產生一個布爾值。
Expression2 可以是得出一個值的任意表達式。這個值用於生成顯示更多調試信息的 String 消息。
[b](最近發現在Berkeleydb 中應用了assert,發現這個關鍵字的用法還是不錯的,主要應用調試或者爲空提示,防止在程序中出現其他錯誤)[/b]

斷言在默認情況下是禁用的。要在編譯時啓用斷言,需要使用 source 1.4 標記:javac -source 1.4 Test.java要在運行時啓用斷言,可使用 -enableassertions 或者 -ea 標記。

要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。
要系統類中啓用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啓用或者禁用斷言。

可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用於驗證傳遞給私有方法的參數。不過,斷言不應該用於驗證傳遞給公有方法的參數,因爲不管是否啓用了斷言,公有方法都必須檢查其參數。
不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試後置條件。另外,斷言不應該以任何方式改變程序的狀態。
2.TreeSet
public class TreeSet<E>extends AbstractSet<E>implements NavigableSet<E>, Cloneable, Serializable基於 TreeMap 的 NavigableSet 實現。使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的 Comparator 進行排序,具體取決於使用的構造方法。

此實現爲基本操作(add、remove 和 contains)提供受保證的 log(n) 時間開銷。

注意,如果要正確實現 Set 接口,則 set 維護的順序(無論是否提供了顯式比較器)必須與 equals 一致。(關於與 equals 一致 的精確定義,請參閱 Comparable 或 Comparator。)這是因爲 Set 接口是按照 equals 操作定義的,但 TreeSet 實例使用它的 compareTo(或 compare)方法對所有元素進行比較,因此從 set 的觀點來看,此方法認爲相等的兩個元素就是相等的。即使 set 的順序與 equals 不一致,其行爲也是 定義良好的;它只是違背了 Set 接口的常規協定。

注意,此實現不是同步的。如果多個線程同時訪問一個 TreeSet,而其中至少一個線程修改了該 set,那麼它必須 外部同步。這一般是通過對自然封裝該 set 的對象執行同步操作來完成的。如果不存在這樣的對象,則應該使用 Collections.synchronizedSortedSet 方法來“包裝”該 set。此操作最好在創建時進行,以防止對 set 的意外非同步訪問:

SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));此類的 iterator 方法返回的迭代器是快速失敗 的:在創建迭代器之後,如果從結構上對 set 進行修改,除非通過迭代器自身的 remove 方法,否則在其他任何時間以任何方式進行修改都將導致迭代器拋出 ConcurrentModificationException。因此,對於併發的修改,迭代器很快就完全失敗,而不會冒着在將來不確定的時間發生不確定行爲的風險。

注意,迭代器的快速失敗行爲無法得到保證,一般來說,存在不同步的併發修改時,不可能作出任何肯定的保證。快速失敗迭代器盡最大努力拋出 ConcurrentModificationException。因此,編寫依賴於此異常的程序的做法是錯誤的,正確做法是:迭代器的快速失敗行爲應該僅用於檢測 bug。
此類是 Java Collections Framework 的成員。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章