`

集合的API解读

阅读更多
一、首先看下集合的总体框架


集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。

抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。

实现类:8个实现类(实线表示),对接口的具体实现。

在很大程度上,一旦您理解了接口,您就理解了框架。虽然您总要创建接口特定的实现,但访问实际集合的方法应该限制在接口方法的使用上;因此,允许您更改基本的数据结构而不必改变其它代码。

  · Collection 接口是一组允许重复的对象。

  · Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。

  · List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。

  · Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。

  · 容器中的元素类型都为Object。从容器取得元素时,必须把它转换成原来的类型。


接着看下简体框架图




具体如下:


1.Collection 接口

  用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。



  (1) 单元素添加、删除操作:

   boolean add(Object o):将对象添加给集合

   boolean remove(Object o): 如果集合中有与o相匹配的对象,则删除对象o

  (2) 查询操作:

   int size() :返回当前集合中元素的数量

   boolean isEmpty() :判断集合中是否有任何元素

   boolean contains(Object o) :查找集合中是否含有对象o

   Iterator iterator() :返回一个迭代器,用来访问集合中的各个元素

  (3) 组操作 :作用于元素组或整个集合

   boolean containsAll(Collection c): 查找集合中是否含有集合c 中所有元素

   boolean addAll(Collection c) : 将集合c 中所有元素添加给该集合

   void clear(): 删除集合中所有元素

   void removeAll(Collection c) : 从集合中删除集合c 中的所有元素

   void retainAll(Collection c) : 从集合中删除集合c 中不包含的元素

  (4) Collection转换为Object数组 :

   Object[] toArray() :返回一个内含集合所有元素的array

   Object[] toArray(Object[] a) :返回一个内含集合所有元素的array。运行期返回的array和参数a的型别相同,需要转换为正确型别。

  此外,您还可以把集合转换成其它任何其它的对象数组。但是,您不能直接把集合转换成基本数据类型的数组,因为集合必须持有对象。

  “斜体接口方法是可选的。因为一个接口实现必须实现所有接口方法,调用程序就需要一种途径来知道一个可选的方法是不是不受支持。如果调用一种可选方法时,一个 UnsupportedOperationException 被抛出,则操作失败,因为方法不受支持。此异常类继承 RuntimeException 类,避免了将所有集合操作放入 try-catch 块。”

  Collection不提供get()方法。如果要遍历Collectin中的元素,就必须用Iterator。

  1.1.AbstractCollection 抽象类

  AbstractCollection 类提供具体“集合框架”类的基本功能。虽然您可以自行实现 Collection 接口的所有方法,但是,除了iterator()和size()方法在恰当的子类中实现以外,其它所有方法都由 AbstractCollection 类来提供实现。如果子类不覆盖某些方法,可选的如add()之类的方法将抛出异常。

  1.2.Iterator 接口

  Collection 接口的iterator()方法返回一个 Iterator。Iterator接口方法能以迭代方式逐个访问集合中各个元素,并安全的从Collection 中除去适当的元素。



  (1) boolean hasNext(): 判断是否存在另一个可访问的元素

    Object next(): 返回要访问的下一个元素。如果到达集合结尾,则抛出NoSuchElementException异常。

  (2) void remove(): 删除上次访问返回的对象。本方法必须紧跟在一个元素的访问后执行。如果上次访问后集合已被修改,方法将抛出IllegalStateException。

  “Iterator中删除操作对底层Collection也有影响。”

  迭代器是 故障快速修复(fail-fast)的。这意味着,当另一个线程修改底层集合的时候,如果您正在用 Iterator 遍历集合,那么,Iterator就会抛出 ConcurrentModificationException (另一种 RuntimeException异常)异常并立刻失败。

2.List接口

  List 接口继承了 Collection 接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。



  (1) 面向位置的操作包括插入某个元素或 Collection 的功能,还包括获取、除去或更改元素的功能。在 List 中搜索元素可以从列表的头部或尾部开始,如果找到元素,还将报告元素所在的位置 :

  void add(int index, Object element): 在指定位置index上添加元素element

  boolean addAll(int index, Collection c): 将集合c的所有元素添加到指定位置index

  Object get(int index): 返回List中指定位置的元素

  int indexOf(Object o): 返回第一个出现元素o的位置,否则返回-1

  int lastIndexOf(Object o) :返回最后一个出现元素o的位置,否则返回-1

  Object remove(int index) :删除指定位置上的元素

  Object set(int index, Object element) :用元素element取代位置index上的元素,并且返回旧的元素

  (2) List 接口不但以位置序列迭代的遍历整个列表,还能处理集合的子集:

   ListIterator listIterator() : 返回一个列表迭代器,用来访问列表中的元素

   ListIterator listIterator(int index) : 返回一个列表迭代器,用来从指定位置index开始访问列表中的元素

  List subList(int fromIndex, int toIndex) :返回从指定位置fromIndex(包含)到toIndex(不包含)范围中各个元素的列表视图

  “对子列表的更改(如 add()、remove() 和 set() 调用)对底层 List 也有影响。”

  2.1.ListIterator接口

  ListIterator 接口继承 Iterator 接口以支持添加或更改底层集合中的元素,还支持双向访问。ListIterator没有当前位置,光标位于调用previous和next方法返回的值之间。一个长度为n的列表,有n+1个有效索引值:




  (1) void add(Object o): 将对象o添加到当前位置的前面

   void set(Object o): 用对象o替代next或previous方法访问的上一个元素。如果上次调用后列表结构被修改了,那么将抛出IllegalStateException异常。

  (2) boolean hasPrevious(): 判断向后迭代时是否有元素可访问

   Object previous():返回上一个对象

   int nextIndex(): 返回下次调用next方法时将返回的元素的索引

   int previousIndex(): 返回下次调用previous方法时将返回的元素的索引

  “正常情况下,不用ListIterator改变某次遍历集合元素的方向 — 向前或者向后。虽然在技术上可以实现,但previous() 后立刻调用next(),返回的是同一个元素。把调用 next()和previous()的顺序颠倒一下,结果相同。”

  “我们还需要稍微再解释一下 add() 操作。添加一个元素会导致新元素立刻被添加到隐式光标的前面。因此,添加元素后调用 previous() 会返回新元素,而调用 next() 则不起作用,返回添加操作之前的下一个元素。”

  2.2.AbstractList和AbstractSequentialList抽象类

  有两个抽象的 List 实现类:AbstractList 和 AbstractSequentialList。像 AbstractSet 类一样,它们覆盖了 equals() 和 hashCode() 方法以确保两个相等的集合返回相同的哈希码。若两个列表大小相等且包含顺序相同的相同元素,则这两个列表相等。这里的 hashCode() 实现在 List 接口定义中指定,而在这里实现。

  除了equals()和hashCode(),AbstractList和AbstractSequentialList实现了其余 List 方法的一部分。因为数据的随机访问和顺序访问是分别实现的,使得具体列表实现的创建更为容易。需要定义的一套方法取决于您希望支持的行为。您永远不必亲自提供的是 iterator方法的实现。

  2.3. LinkedList类和ArrayList类

  在“集合框架”中有两种常规的 List 实现:ArrayList 和 LinkedList。使用两种 List 实现的哪一种取决于您特定的需要。如果要支持随机访问,而不必在除尾部的任何位置插入或除去元素,那么,ArrayList 提供了可选的集合。但如果,您要频繁的从列表的中间位置添加和除去元素,而只要顺序的访问列表元素,那么,LinkedList 实现更好。

  “ArrayList 和 LinkedList 都实现 Cloneable 接口,都提供了两个构造函数,一个无参的,一个接受另一个Collection”

  2.3.1. LinkedList类

  LinkedList类添加了一些处理列表两端元素的方法。



  (1) void addFirst(Object o): 将对象o添加到列表的开头

    void addLast(Object o):将对象o添加到列表的结尾

  (2) Object getFirst(): 返回列表开头的元素

    Object getLast(): 返回列表结尾的元素

  (3) Object removeFirst(): 删除并且返回列表开头的元素

    Object removeLast():删除并且返回列表结尾的元素

  (4) LinkedList(): 构建一个空的链接列表

    LinkedList(Collection c): 构建一个链接列表,并且添加集合c的所有元素

  “使用这些新方法,您就可以轻松的把 LinkedList 当作一个堆栈、队列或其它面向端点的数据结构。”

  2.3.2. ArrayList类

  ArrayList类封装了一个动态再分配的Object[]数组。每个ArrayList对象有一个capacity。这个capacity表示存储列表中元素的数组的容量。当元素添加到ArrayList时,它的capacity在常量时间内自动增加。

  在向一个ArrayList对象添加大量元素的程序中,可使用ensureCapacity方法增加capacity。这可以减少增加重分配的数量。

  (1) void ensureCapacity(int minCapacity): 将ArrayList对象容量增加minCapacity

  (2) void trimToSize(): 整理ArrayList对象容量为列表当前大小。程序可使用这个操作减少ArrayList对象存储空间。

  2.3.2.1. RandomAccess接口

  一个特征接口。该接口没有任何方法,不过你可以使用该接口来测试某个集合是否支持有效的随机访问。ArrayList和Vector类用于实现该接口。
3.Set接口

  Set 接口继承 Collection 接口,而且它不允许集合中存在重复项,每个具体的 Set 实现类依赖添加的对象的 equals()方法来检查独一性。Set接口没有引入新方法,所以Set就是一个Collection,只不过其行为不同。



  3.1. Hash表

  Hash表是一种数据结构,用来查找对象。Hash表为每个对象计算出一个整数,称为Hash Code(哈希码)。Hash表是个链接式列表的阵列。每个列表称为一个buckets(哈希表元)。对象位置的计算 index = HashCode % buckets (HashCode为对象哈希码,buckets为哈希表元总数)。

  当你添加元素时,有时你会遇到已经填充了元素的哈希表元,这种情况称为Hash Collisions(哈希冲突)。这时,你必须判断该元素是否已经存在于该哈希表中。

  如果哈希码是合理地随机分布的,并且哈希表元的数量足够大,那么哈希冲突的数量就会减少。同时,你也可以通过设定一个初始的哈希表元数量来更好地控制哈希表的运行。初始哈希表元的数量为 buckets = size * 150% + 1 (size为预期元素的数量)。

  如果哈希表中的元素放得太满,就必须进行rehashing(再哈希)。再哈希使哈希表元数增倍,并将原有的对象重新导入新的哈希表元中,而原始的哈希表元被删除。load factor(加载因子)决定何时要对哈希表进行再哈希。在Java编程语言中,加载因子默认值为0.75,默认哈希表元为101。

  3.2. Comparable接口和Comparator接口

  在“集合框架”中有两种比较接口:Comparable接口和Comparator接口。像String和Integer等Java内建类实现Comparable接口以提供一定排序方式,但这样只能实现该接口一次。对于那些没有实现Comparable接口的类、或者自定义的类,您可以通过Comparator接口来定义您自己的比较方式。

  3.2.1. Comparable接口

  在java.lang包中,Comparable接口适用于一个类有自然顺序的时候。假定对象集合是同一类型,该接口允许您把集合排序成自然顺序。



  (1) int compareTo(Object o): 比较当前实例对象与对象o,如果位于对象o之前,返回负值,如果两个对象在排序中位置相同,则返回0,如果位于对象o后面,则返回正值

  在 Java 2 SDK版本1.4中有二十四个类实现Comparable接口。下表展示了8种基本类型的自然排序。虽然一些类共享同一种自然排序,但只有相互可比的类才能排序。

类 排序
BigDecimal,BigInteger,Byte, Double, Float,Integer,Long,Short  按数字大小排序
Character  按 Unicode 值的数字大小排序
String  按字符串中字符 Unicode 值排序
  
  利用Comparable接口创建您自己的类的排序顺序,只是实现compareTo()方法的问题。通常就是依赖几个数据成员的自然排序。同时类也应该覆盖equals()和hashCode()以确保两个相等的对象返回同一个哈希码。

  3.2.2. Comparator接口

  若一个类不能用于实现java.lang.Comparable,或者您不喜欢缺省的Comparable行为并想提供自己的排序顺序(可能多种排序方式),你可以实现Comparator接口,从而定义一个比较器。




  (1)int compare(Object o1, Object o2): 对两个对象o1和o2进行比较,如果o1位于o2的前面,则返回负值,如果在排序顺序中认为o1和o2是相同的,返回0,如果o1位于o2的后面,则返回正值

  “与Comparable相似,0返回值不表示元素相等。一个0返回值只是表示两个对象排在同一位置。由Comparator用户决定如何处理。如果两个不相等的元素比较的结果为零,您首先应该确信那就是您要的结果,然后记录行为。”

  (2)boolean equals(Object obj): 指示对象obj是否和比较器相等。

  “该方法覆写Object的equals()方法,检查的是Comparator实现的等同性,不是处于比较状态下的对象。”
  • 大小: 11.3 KB
  • 大小: 5.9 KB
分享到:
评论

相关推荐

    servlet-api 集合

    这个集合包含了从2.2版本到3.0版本的Servlet-API规范的实现,这些版本的演变反映了Web应用程序开发技术的发展历程。以下是对各版本Servlet-API的详细解读: 1. **Servlet-API 2.2**:这是Servlet规范的早期版本,...

    jdk1.8 api 中文文档

    **描述解读:**"java技术文档,jdk 1.8 Api 中文版,java开发工具,编程工具文档" 描述中提到了几个关键点: 1. **Java技术文档**:这表明该文档是关于Java编程语言的,涵盖了其技术细节和用法。 2. **JDK 1.8 Api...

    Extjs资料集合(源码解读,实例)

    标题 "Extjs资料集合(源码解读,实例)" 暗示了这个压缩包包含的资源旨在帮助开发者深入理解 ExtJS 的内部工作原理和实际应用。通过源码解读,开发者可以更好地了解组件的实现细节,提升自己的编程技巧。实例则提供...

    Android、Java、Js等API

    以下是对这些API的详细解读: 1. **Java API**: - `java7_API.chm` 和 `JDK_API_1_6_zh_CN.CHM` 提供了Java 7和Java 6的中文API文档。Java API包含了标准库的所有类和接口,例如集合框架、I/O流、网络编程、多...

    收集整理的Windows API大全.rar

    《Windows API大全》是针对Windows操作系统编程的重要参考资料集合,它涵盖了Windows API的广泛内容,旨在帮助开发者更好地理解和应用这些API函数。以下是对压缩包中各文件的详细解读: 1. **xfire+1.2.6+api帮助...

    适于VC++API中文详解

    本资源以中文详细解读了VC++ API,对于C++程序员来说具有很高的参考价值,尤其是那些希望深入理解和利用Windows系统功能的开发者。 【描述】提到的“全面的API介绍”涵盖了Windows API的各种函数、结构体、常量等,...

    JavaAPI文档中文版

    Java API文档中文版是Java开发人员的重要参考资料,它详尽地介绍了Java平台标准版(Java SE)中的类库、接口和...同时,掌握如何有效地搜索和解读API文档,将极大地提高开发效率,使开发者能够充分利用Java的强大功能。

    skype api 开发 c#实例源代码

    本文将深入探讨C#环境下,利用Skype API进行开发的实践案例,并对所提供的源代码进行详细解读。 首先,我们要明白Skype API分为两种主要类型:基于API的接口和基于COM(Component Object Model)的接口。基于API的...

    jdk6_api文档 中文版

    本文将详细解读JDK6 API中文版,帮助读者深入理解Java编程的核心要素。 一、基础类库 JDK6 API文档包含了Java语言的基础类库,这些类库提供了大量的预定义类和接口,涵盖了数据类型、集合框架、输入/输出流、网络...

    JAVA API文档|JAVA API 1.7中文文档

    本篇将详细解读Java API 1.7中文版中的关键知识点。 首先,Java API 1.7,也被称为Java 7,是Java开发的一个重要版本。它引入了许多新特性,提升了开发效率和代码的可读性。以下是一些Java 7 API中的关键部分: 1....

    jfreechart 1.0.9源码、工程示例、开发文档、API集合

    通过深入研究源码、利用工程示例、查阅开发文档和API,以及理解支持库,开发者可以有效地利用这个库来提升应用程序的用户体验,使复杂的数据变得易于理解和解读。无论你是Java新手还是经验丰富的开发者,JFreeChart...

    java-jdk-1.8版本API离线文档(中文版)-海纳百川提供

    总之,Java JDK 1.8的API离线文档是开发者日常编码、学习和解决问题的重要参考资料,它详细解读了每个类、接口和方法,帮助我们更好地理解和利用Java的强大功能。无论是初学者还是经验丰富的开发者,都应该充分利用...

    jkd1.6中文api

    API文档包含了核心类库、集合框架、I/O流、网络编程、多线程、国际化、数据库连接(JDBC)、XML处理等多个方面的内容,对于初学者和有经验的开发者来说,都是不可或缺的参考资料。 二、zxbc.cn.txt 这个文件可能是...

    API函数大全整理API

    在计算机科学领域中,API(应用程序编程接口)是软件组件之间通信的一种方式,它定义了各种预定义的函数、协议和工具集合。这些功能可以帮助开发人员构建更加复杂的应用程序,而无需从头开始编写所有代码。本篇文章...

    字节跳动 CloudWeGo 源码解读-微服务中间件集合.zip

    这个压缩包“字节跳动 CloudWeGo 源码解读-微服务中间件集合.zip”很可能是对CloudWeGo框架的源代码分析和讲解资料,包含了对中间件集合的深入理解。 1. **微服务架构**:微服务是一种将单一应用程序分解为一组小型...

    jdk 1.8 api 带完整目录索引中英文版chm

    **描述解读:** 描述中提到,这个文档是"jdk 1.8 api参考文档chm格式",这意味着它是一个详尽的API指南,涵盖了JDK 1.8中的所有类、接口、方法和异常等。"中文版和英文原版两个文件"意味着开发者可以根据自己的语言...

    地区经纬度信息获取(利用Google地图API获取)

    这些类是Java标准库中用于处理网络请求、数据输入输出和集合操作的基础工具类。 6. 特定代码段的解读 代码段中包含了一些特定的字符串常量定义,如REQUESTENCODE、ADDRESS_KEY、ADDRESS_COUNTRYKEY等,这些定义用于...

    jdk api 1.8_google.zip(免费下载)

    本篇文章将重点围绕JDK API 1.8的特性、关键更新以及中英文对照文档的重要性进行详细解读。 首先,JDK 1.8的发布标志着Java语言的重大进步,引入了许多创新特性和改进。其中,最引人注目的当属Lambda表达式,这一...

    设备局域网API文档.docx

    这部分通常会介绍设备局域网API的基本概念,它是一个允许开发者通过编程方式与局域网内的设备进行通信的接口集合。这些接口可能涵盖了设备的控制、监控、状态查询等功能,旨在帮助开发者构建智能设备应用或管理系统...

    WSA.rar_C++ api pdf_Socket API_WSA_WSA api_socket

    3. **Socket API**: Socket API是网络编程中用于创建、绑定、监听、连接和发送/接收数据的一系列函数集合。在WSA中,这些函数包括`socket()`(创建套接字)、`bind()`(绑定本地地址和端口)、`listen()`(设置...

Global site tag (gtag.js) - Google Analytics