Java源碼解析TreeMap簡介
TreeMap是常用的排序樹,本文主要介紹TreeMap中,類的注釋中對TreeMap的介紹。代碼如下。
/**
* A Red-Black tree based {@link NavigableMap} implementation.
* The map is sorted according to the {@linkplain Comparable natural
* ordering} of its keys, or by a {@link Comparator} provided at map
* creation time, depending on which constructor is used.
* <p>This implementation provides guaranteed log(n) time cost for the
* {@code containsKey}, {@code get}, {@code put} and {@code remove}
* operations. Algorithms are adaptations of those in Cormen, Leiserson, and
* Rivest's <em>Introduction to Algorithms</em>.
* <p>Note that the ordering maintained by a tree map, like any sorted map, and
* whether or not an explicit comparator is provided, must be <em>consistent
* with {@code equals}</em> if this sorted map is to correctly implement the
* {@code Map} interface. (See {@code Comparable} or {@code Comparator} for a
* precise definition of <em>consistent with equals</em>.) This is so because
* the {@code Map} interface is defined in terms of the {@code equals}
* operation, but a sorted map performs all key comparisons using its {@code
* compareTo} (or {@code compare}) method, so two keys that are deemed equal by
* this method are, from the standpoint of the sorted map, equal. The behavior
* of a sorted map <em>is</em> well-defined even if its ordering is
* inconsistent with {@code equals}; it just fails to obey the general contract
* of the {@code Map} interface.
* <p><strong>Note that this implementation is not synchronized.</strong>
* If multiple threads access a map concurrently, and at least one of the
* threads modifies the map structurally, it <em>must</em> be synchronized
* externally. (A structural modification is any operation that adds or
* deletes one or more mappings; merely changing the value associated
* with an existing key is not a structural modification.) This is
* typically accomplished by synchronizing on some object that naturally
* encapsulates the map.
* If no such object exists, the map should be "wrapped" using the
* {@link Collections#synchronizedSortedMap Collections.synchronizedSortedMap}
* method. This is best done at creation time, to prevent accidental
* unsynchronized access to the map: <pre>
* SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));</pre>
* <p>The iterators returned by the {@code iterator} method of the collections
* returned by all of this class's "collection view methods" are
* <em>fail-fast</em>: if the map is structurally modified at any time after
* the iterator is created, in any way except through the iterator's own
* {@code remove} method, the iterator will throw a {@link
* ConcurrentModificationException}. Thus, in the face of concurrent
* modification, the iterator fails quickly and cleanly, rather than risking
* arbitrary, non-deterministic behavior at an undetermined time in the future.
* <p>Note that the fail-fast behavior of an iterator cannot be guaranteed
* as it is, generally speaking, impossible to make any hard guarantees in the
* presence of unsynchronized concurrent modification. Fail-fast iterators
* throw {@code ConcurrentModificationException} on a best-effort basis.
* Therefore, it would be wrong to write a program that depended on this
* exception for its correctness: <em>the fail-fast behavior of iterators
* should be used only to detect bugs.</em>
* <p>All {@code Map.Entry} pairs returned by methods in this class
* and its views represent snapshots of mappings at the time they were
* produced. They do <strong>not</strong> support the {@code Entry.setValue}
* method. (Note however that it is possible to change mappings in the
* associated map using {@code put}.)
* <p>This class is a member of the
* <a href="{@docRoot}/../technotes/guides/collections/index.html" rel="external nofollow" >
* Java Collections Framework</a>.
* @param <K> the type of keys maintained by this map
* @param <V> the type of mapped values
* @author Josh Bloch and Doug Lea
* @see Map
* @see HashMap
* @see Hashtable
* @see Comparable
* @see Comparator
* @see Collection
* @since 1.2
**/
這是一個基于紅黑樹的可導航的實現(xiàn)。這個map基于key的可比較的自然順序,或者基于在map創(chuàng)建時提供的Comparator的順序來存儲元素。
這個實現(xiàn)提供可保證的log(n)的時間復雜度來完成containsKey,get,put和remove操作。
需要注意到這一點,不管是否顯式提供了排序器,如果這個排序map想要正確實現(xiàn)Map接口,tree map維護的順序必須和equals保持一致,就像任何排序map那樣。之所以會這樣,是因為Map接口是根據(jù)equals操作來定義的,但是排序map進行所有key的比較時使用的是他們的compareTo方法,所以,從排序map的觀點來看,被這個方法認為相等的兩個key,才是相等的。盡管如果它的順序和equals不一致,排序map的行為也是正常的,它只是沒有遵守Map接口的通常約定。
請注意這個實現(xiàn)是非同步的。如果多個線程并發(fā)訪問一個treemap,并且至少有一個線程修改結(jié)構(gòu),必須進行外部同步。這個通常是通過在包含這個map的對象上進行同步來實現(xiàn)的。如果沒有這樣的對象,那么這個map需要用Collections.synchronizedSortedMap方法包裝一下。最好是在創(chuàng)建map時就這樣做,以防止意外非同步訪問這個map。代碼如下SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));
所有這個類的集合視角方法返回的集合的iterator方法返回的迭代器都是fast-fail的:如果迭代器創(chuàng)建后的任何時間map發(fā)生了結(jié)構(gòu)性改變,除了通過迭代器的刪除方法外,迭代器都會拋出同步修改異常。于是,面對同步修改時,迭代器會迅速干凈的失敗,而不是冒著在未來的不確定的時間發(fā)生不一致或無法確定的行為的風險。
這個類和它的視圖的方法返回的Map.Entry對代表了他們被創(chuàng)建時的快照。他們不支持Entry.setValue方法。
這個類是Java集合框架的一個成員。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
mybatis plus generator 根據(jù)數(shù)據(jù)庫自動生成實體類的實現(xiàn)示例
本文主要介紹了mybatis plus generator 根據(jù)數(shù)據(jù)庫自動生成實體類的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
MybatisPlus字段類型轉(zhuǎn)換的實現(xiàn)示例
本文主要介紹了MybatisPlus如何完成字段類型轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03
Java 基于UDP協(xié)議實現(xiàn)消息發(fā)送
這篇文章主要介紹了Java 基于UDP協(xié)議實現(xiàn)消息發(fā)送,幫助大家更好的理解和學習Java網(wǎng)絡(luò)編程,感興趣的朋友可以了解下2020-11-11
Java8新特性之泛型的目標類型推斷_動力節(jié)點Java學院整理
泛型是Java SE 1.5的新特性,泛型的本質(zhì)是參數(shù)化類型,也就是說所操作的數(shù)據(jù)類型被指定為一個參數(shù)。下面通過本文給分享Java8新特性之泛型的目標類型推斷,感興趣的朋友參考下吧2017-06-06

