Collections类中的实用工具

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。下面这个例子演示了为它们分别构建只读版本的正确方法:
 

//: 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!");
  }
} ///:~

对于每种情况,在将其正式变为只读以前,都必须用有有效的数据填充容器。一旦载入成功,最佳的做法就是用“不可修改”调用产生的句柄替换现有的句柄。这样做可有效避免将其变成不可修改后不慎改变其中的内容。在另一方面,该工具也允许我们在一个类中将能够修改的容器保持为private状态,并可从一个方法调用中返回指向那个容器的一个只读句柄。这样一来,虽然我们可在类里修改它,但其他任何人都只能读。
为特定类型调用“不可修改”的方法不会造成编译期间的检查,但一旦发生任何变化,对修改特定容器的方法的调用便会产生一个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(并发修改违例)。我们将这一机制称为“立即失败”——它并不用更复杂的算法在“以后”侦测问题,而是“立即”产生违例。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索方法
, 容器
, collection
, java容器 collection
, collections
, map容器
, collection...
, 只读
, c++map类
, 一个
collect
collections工具类、java实用工具类、vs 配置类型 实用工具、mybatis 实用 工具类、java collections类,以便于您获取更多的相关知识。

时间: 2024-08-03 03:52:56

Collections类中的实用工具的相关文章

collections-Java问题:Collections类中copy方法的疑问,求解答

问题描述 Java问题:Collections类中copy方法的疑问,求解答 解决方案 copy方法,第二个参数的list长度要小于第一个参数的list长度. 也就是copy方式是把第二个参数中的list值放到第一个参数的list中,从0开始

Pig系统分析(7) Pig实用工具类

Explain Explain是Pig提供的调试工具,使用explain可以输出Pig Lation的执行计划.值得一提的是,explain支持-dot选项,将执行计划以DOT格式输出, (DOT是一种图形描述语言,请参考http://zh.wikipedia.org/zh/DOT%E8%AF%AD%E8%A8%80) 代码实现详见org.apache.pig.impl.plan.DotPlanDumper,这部分实现为我们设计执行计划可视化提供了参考. 下图部分截取了使用Graphviz打开物

常用的Facebook Apps实用工具

Facebook平台下的有很多优秀的Apps实用工具,大量的第三方工具极大扩展了Facebook的功能和应用,给Facebook带来了巨大的成功.在Facebook海量的实用工具中,我挑选了几个优秀的Apps推荐给大家,安装后会令大家的Facebook功能得到很大的增强,以下是这些应用程序清单和介绍. Twitter - 可以将Twitter发布的信息同步到Facebook,也可以在Facebook发布信息到Twitter上,这是Twitter官方页面推荐的实用工具,同步速度非常快,Twitte

分页封装实用工具类及其使用方法

分页封装实用工具类及其使用方法 作者: javaboy2012 Email:yanek@163.com qq:    1046011462     package com.yanek.util; import java.util.List; public class PageBean { /** * @param args */ public static void main(String[] args) { } private int currentpage; // 当前页数 private

详解java中的Collections类_java

一般来说课本上的数据结构包括数组.单链表.堆栈.树.图.我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组.二维数组无法完全表达你要表达的东西,而定义一个类Class有太过麻烦,这时候,你可以考虑一下用Java中的Collections类.使用Collections类,必须在文件头声明import java.util.*; 一.动态.有序.可变大小的一维数组Vector与ArrayList  Collectio

工具类中调用dao层的方法,spring配置如何写

问题描述 工具类中调用dao层的方法,spring配置如何写 private Set readSensitiveWord() { Set set = new HashSet(); List list = sensitiveDao.findSensitive(); if(list.size()>0){ for(Sensitive s : list){ set.add(s); } } return set; } 在这个方法中我要调用dao层的方法findSensitive().sensitiveDa

源码剖析AQS在几个同步工具类中的使用

感谢网友[张超盟]的投稿 1. 前言 AQS(AbstractQueuedSynchronizer)是 java.util.concurrent的基础.J.U.C中宣传的封装良好的同步工具类Semaphore.CountDownLatch.ReentrantLock.ReentrantReadWriteLock.FutureTask等虽然各自都有不同特征,但是简单看一下源码,每个类内部都包含一个如下的内部类定义: abstract static class Sync extends Abstra

java-JAVA中Collections类的“synchronizedXXXX”方法有什么用处?

问题描述 JAVA中Collections类的"synchronizedXXXX"方法有什么用处? 解决方案 ArrayList对象不是线程安全的,但Collection.synchronizedXXX方法可以把它转成线程安全的对象. 上面的代码没用多线程,Collection.synchronizedXXX的用法也不对,所以在这段代码里其实没什么作用. 参见:http://my.oschina.net/infiniteSpace/blog/305425 解决方案二: 这是同步的方法,

hibernate-新手求助!Hibernate中如何把几个核心接口写在一个工具类中?

问题描述 新手求助!Hibernate中如何把几个核心接口写在一个工具类中? 要写一个Struts2+Hibernate 整合的CRUD , 然后不知道怎么把 Session.SessionFactory.Configuration.Transaction这几个类写在 util包中的工具类里?求各位大神解答一下.万分感谢!!! 解决方案 定义一个类,把这些作为内嵌类全部贴过来 解决方案二: http://m.blog.csdn.net/blog/StubbornPotatoes/7705693