<b>Collections类中的实用工具</b>[Java编程]
本文“<b>Collections类中的实用工具</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
Collections类中含有其他大量有效的实用工具(如表二):
enumeration(Collection) 为自变量产生原始气势的Enumeration(列举)
max(Collection),min(Collection) 在自变量顶用调集内对象的自然对比办法产生最大或最小元素
max(Collection,Comparator),min(Collection,Comparator) 在调集内用对比器产生最大或最小元素
nCopies(int n, Object o) 返回长度为n的一个不可变列表,它的全部句柄均指向o
subList(List,int min,int max) 返回由指定参数列表后推得到的一个新列表.可将这个列表想象成一个“窗口”,它自索引为min的地方开始,恰好完毕于max的前面
enumeration(Collection) |
Produces an old-style Enumeration for the argument. |
max(Collection) min(Collection) |
Produces the maximum or minimum element in the argument using the natural comparison method of the objects in the Collection. |
max(Collection, Comparator) min(Collection, Comparator) |
Produces the maximum or minimum element in the Collection using the Comparator. |
nCopies(int n, Object o) |
Returns an immutable List of size n whose handles all point to o. |
subList(List, int min, int max) |
Returns a new List backed by the specified argument List that is a window into that argument with indexes starting at min and stopping just before max. |
表二
注意min()和max()都是伴随Collection对象工作的,而非伴随List,所以没必要耽忧Collection能否需求排序(就象早先指出的那样,在履行一次binarySearch()——即二进制搜索——之前,必须对一个List大概一个数组履行sort()).
1. 使Collection或Map不可改正
普通,成立Collection或Map的一个“只读”版本显得更有利一些.Collections类答应我们到达这个目标,办法是将原始容器传送进入一个办法,并令其传回一个只读版本.这个办法共有四种改变情势,辨别用于Collection(假如不想把调集当作一种更特别的范例对待)、List、Set以及Map.下面这个例子演示了为它们辨别构建只读版本的精确办法:
关于每种情形,在将其正式变成只读从前,都必须用有有效的数据填充容器.一旦载入成功,最佳的做法就是用“不可改正”调用产生的句柄替换现有的句柄.这样做可有效避免将其变成不可改正后不慎改变此中的内容.在另一方面,该工具也答应我们在一个类中将可以改正的容器保持为private状况,并可从一个办法调用中返回指向那个容器的一个只读句柄.这样一来,固然我们可在类里改正它,但其他任何人都只能读.//: ReadOnly.java // Using the Collections.unmodifiable methods package c08.newcollections; import java.util.*; public class ReadOnly { public static void main(String[] args) { Collection c = new ArrayList(); Collection1.fill(c); // Insert useful data c = Collections.unmodifiableCollection(c); Collection1.print(c); // Reading is OK //! c.add("one"); // Can't change it List a = new ArrayList(); Collection1.fill(a); a = Collections.unmodifiableList(a); ListIterator lit = a.listIterator(); System.out.println(lit.next()); // Reading OK //! lit.add("one"); // Can't change it Set s = new HashSet(); Collection1.fill(s); s = Collections.unmodifiableSet(s); Collection1.print(s); // Reading OK //! s.add("one"); // Can't change it Map m = new HashMap(); Map1.fill(m, Map1.testData1); m = Collections.unmodifiableMap(m); Map1.print(m); // Reading OK //! m.put("Ralph", "Howdy!"); } } ///:~
为特定范例调用“不可改正”的办法不会造成编译期间的查抄,但一旦发生任何改变,对改正特定容器的办法的调用便会产生一个UnsupportedOperationException违例.
2. Collection或Map的同步
synchronized关键字是“多线程”机制一个非常重要的部份.我们到第14章才会对这一机制作深化的探究.在这儿,大家只需注意到Collections类供应了对整个容器举行自动同步的一种途径.它的语法与“不可改正”的办法是近似的:
//: Synchronization.java // Using the Collections.synchronized methods package c08.newcollections; import java.util.*; public class Synchronization { public static void main(String[] args) { Collection c = Collections.synchronizedCollection( new ArrayList()); List list = Collections.synchronizedList( new ArrayList()); Set s = Collections.synchronizedSet( new HashSet()); Map m = Collections.synchronizedMap( new HashMap()); } } ///:~
在这种情形下,我们通过得当的“同步”办法直接传送新容器;这样做可避免不慎表暴露未同步的版本.
新调集也供应了能避免多个进程同时改正一个容器内容的机制.若在一个容器里反复,同时另一些进程参与,并在那个容器中插入、删除或改正一个对象,便会面对发生冲突的危险.我们大概已传送了那个对象,大概它位位于我们前面,大概容器的大小在我们调用size()后已发生了收缩——我们面对各种各样大概的危险.针对这个问题,新的调集库集成了一套办理的机制,能查出除我们的进程自己需求负责的之外的、对容器的其他任何改正.若探测到有其他方面也预备改正容器,便会当即产生一个ConcurrentModificationException(并发改正违例).我们将这一机制称为“当即失利”——它并不用更复杂的算法在“今后”侦测问题,而是“当即”产生违例.
以上是“<b>Collections类中的实用工具</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |