上一节我们讲了util包中的Collection接口,即util包中有关数据结构的接口,再开始新的内容之前我们要继续回顾一下上一节的内容。
⑴ Collection (集合)接口
扩展了Iterable接口,位于集合层次结构的顶部,因此所有的集合都实现Collection接口,并提供了iterator()方法来返回一个迭代器。
- add()方法添加对象。
- remove方法()删除元素。
- clear()删除集合所有元素(size=0)。
- contains()方法查看集合是否包含对象。
- toArray()方法返回集合元素数组。
- equals()方法比较两个集合是否相等。
- size()方法返回集合中元素的数目。
- isEmpty()判断集合是否为空。
- hashCode()返回调用集合的散列码。
- iterator()返回调用集合的迭代器。
⑵ List(列表)接口
扩展了Collection接口,存储一个序列的元素(基于0的索引),可以包含重复的元素,但不能有null值。
- 获得特定位置的对象调用get()方法。
- 用set()方法给特定位置元素赋值。
- 用indexOf()或lastIndexOf()方法分别获得对象的第一个实例或最后一个实例所在的位置。
- subList()方法取子列表,listIterator()返回一个迭代器。
⑶ Set接口
扩展了Collection接口,该集合不允许存在相同的元素(包括唯一null值)。SortedSet接口,扩展了Set接口并声明自已是升序的集合。
- First()或Last()方法分别获得第一或最后一个对象。
- subSet()获得子集。
- headSet()和tailSet()方法分别获得从头开始或直到未尾的子集。
⑷ Queue(队列)接口
扩展了Collection接口,并声明一个队列行为(FIFO,先进先出列表)。
- Offer()方法在队列尾插入元素。
- element()和peek()方法获得但不移除队列的第一个元素。如果队列为空,element()抛出NoSuchElementException异常,peek()返回null。
- poll()和remove()方法获得并移除队列的第一个元素,如果队列为空,poll()返回null,remove()抛出异常。
⑸ Comparator(比较器)接口
定义了两个方法:compare()和equals()方法,通过改写compare()方法,能够改变对象排序的方式。
⑹ Iterator(迭代器)接口、ListIterator(列表迭代器,可进行双向遍历)接口
一般来说,使用迭代器在集合中遍历时应遵循下面的步骤:
一、通过集合的iterator()得到一个指向集合开始处的迭代器:Iterator itr=collectionObject.iterator();
二、设置一个判断是否有下一个元素的循环:如while(itr.hasNext())。
三、在循环中取出下一个元素:如Object element=itr.next();
⑺ RandomAccess(随机访问)接口
被ArrayList类和遗留的Vector类实现。
⑻Map(映射)接口、Map.Entry (Map的嵌套类、内部类)接口、SortedMap(默认按key键升序排列的映射)接口
映射是将键映射到值的对象,一个映射不能包含重复的键;每个键最多只能映射一个值。
Map接口提供三种collection 视图:
键集、值集合或键-值映射关系集。映射不是集合,因为它们不实现Collection接口,但是可以通过使用entrySet()方法获得键-值映射关系的集合视图跟效果,或使用keySet()方法获得键的集合视图,使用values()方法获得值的集合视图。
- put()方法将值放入映射中,get()得到与键k相关联的值。
- SortedMap接口增加了获取子映射的headMap()、tailMap()、subMap()方法和获取首尾键的firstKey()、lastKey()方法。
- Map.Entry接口定义了获取键值的getKey()、getValue()方法和替换值的setValue()方法。
Collection集合的有序是Set,Map的有序是TreeMap。
异常:
- 试图增加一个不兼容的对象到集合或映射中,将抛出ClassCastException;
- 如果使用无效索引,抛出IndexOutOfBoundException;
- null不允许存在于集合或映射中,如果试图使用null对象,抛出NullPointException;
- 当修改不可改变的集合或映射时,抛出UnsupportedOperationException;
- 当调用下一个对象不存在时,抛出NoSuchElementException;
集合框架接口示意(父类∈子类):
1、Collection∈⑴List,⑵Set∈SortedSet。
2、Map∈SortedMap。
啰嗦了这么多,原因还是这一块儿的数据结构部分尤为重要,下面我们再来看看一部分非数据结构的类,也就是一般工具的介绍。
操作系统常见工具可以分割为:
日历、货币、时间、时区、本地化、一般属性文件、权限、验证(正则表达式扫描器)、任务调度器、通用唯一标识符、特定语言环境配置的属性文件。包结构如图所示:
其中
ResourceBundle.Control defines a set of callback methods that are invoked by the ResourceBundle.getBundle factory methods during the bundle loading process,为1.6引入。
Locale.Builder is used to build instances of Locale from values configured by the setters.1.7版本引入
常见小工具
可分为:随机数、hash算法(已在上面一般属性文件中作为父类包含)、格式字符串的解释程序、字符串标记生成器。
java特有工具
服务提供者加载工厂、事件模型、事件通知、位向量、对象操作工具类(1.7版本引入)。
上面简单的列举了util包中除了容器外的工具类。这两部分我们是从横向的区别来分类区分的。如果要从纵向的功能来分辨util包中的借口和类的话,我们便有了如下的分类方法:
比较、迭代、随机访问、侦听、通知
如果你对util包够熟悉的话,你就应该知道每一种功能就代表了一部分的类和接口。
后序:
可能这一篇会有些狗尾续貂的感觉,但是util包的种类繁多,功能也不一而足,我们应当建立一种理念,就是把包当做一种框架,它能够为我们完成自己的任务的时候,提供一套模板,需要我们自己去实际地填充以及调用。这也是我们理解Collection接口的时候所用的方法。最后,本系列博文只是提供一个引子,这也是每一篇博文作者写作的目的和意图之一,文字只能表达心中所想十之有三,关于util包的讲解,我推荐一篇文章《java程序设计——util包》,蒋祖德著。应该仔仔细细地拜读一番。