TreeMap API翻译

红黑树是NavigableMap的一个实现。

它可以根据key值排序,也可以根据创建时间排序,具体按照什么排序需根据具体的构造器来区分。

其中{@code containsKey},{@ code get},{@ code put}和{@code remove}方法的时间成本控制在log(n)之内,具体实现是由Cormen,Leiserson和Rivest的“算法导论”中的算法改编的。

注意,TreeMap的排序,和其他带有排序功能的map一样,如果实现了Map接口,无论是否明确的实现了comparator,都具有与 equals 一致的自然排序。可以在comparable中查看自然排序的精确定义。它之所以与equals有一致的排序是因为Map是从equals操作出发定义的接口,而所有排序的map是根据compareTo或者compare方法对key进行排序的。因此从排序的map的角度来看,两个依据比较方法判定相等的两个key是equal的。

注意,treeMap不是线程同步的。如果多线程同时访问一个map,且至少有一个map在修改map,那么必须在程序内部实现同步。这通常通过一些自然封装的对象来实现同步。

如果不存在这样的对象,那么需要通过Collections.synchronizedSortedMap方法封装map,这一步最好在创建时就完成,以防非同步的访问map。

SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));

在创建了一个迭代器后,任何时间都可以对map进行修改,除了当前迭代器对当前的map之外,其他任何迭代器对map进行修改都会抛出ConcurrentModificationException异常,因此,从同步修改的角度,迭代器将会迅速和干净的失败,而不是承受在不确定时间里出现的不确定的风险。

但是,迭代器的fast-fail行为并不是像它设计的那样完美,也就是说,在面对非同步的并发修改时,他不能保证一定会抛出异常。Fail-fast迭代器尽最大的可能抛出ConcurrentModificationException异常。因此,在写代码时,依赖“抛出的异常”来保证程序的正确性是不恰当的:fast-fail行为应只用来检测bug。

所有的Map.Entry都是通过类中的方法和他们生成的代表映射快照的视图返回的。它不支持Entry.setValue方法(但是可以通过put改变map关系中的mappings)

猜你喜欢

转载自blog.csdn.net/u013984781/article/details/88388541
今日推荐