ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:193.25KB ,
资源ID:22058349      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22058349.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Java Collection FrameworkCollection 接口文档格式.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Java Collection FrameworkCollection 接口文档格式.docx

1、Collection 接口的定义如下:public interface Collection extends Iterable . 2、行为 java.util.Collection 接口是描述 Set 和 List 集合类型的根接口,下面给出了Collection 的所有行为(不包括从Object 继承而来的方法),因此它们也刻画了 Set 或 List 执行的所有行为(List 还有额外的功能)。Collection 的行为分类和详细列表如下 :注意到,其中不包含随机访问所选择的元素 get() 方法,因为 Collection 包含 Set,而 Set 是自己维护顺序的。因此,若想访问、

2、遍历 Collection 中的元素,则必须使用迭代器; 另外,这些方法的默认实现(AbstractCollection)均直接或间接使用了迭代器。三、Collection 接口的默认实现:1、JDK 对 AbstractCollection 抽象类的描述 此抽象类提供 Collection 接口的骨干实现,以最大限度地减少实现此接口所需的工作。 要实现一个不可修改的 collection,编程人员只需扩展此类,并提供 iterator 和 size 方法的实现。(iterator 方法返回的迭代器必须实现 hasNext 和 next。); 要实现可修改的 collection,编程人员必须

3、另外重写此类的 add 方法(否则,会抛出 UnsupportedOperationException),iterator 方法返回的迭代器还必须另外实现其 remove 方法(AbstractCollection 的移除方法间接调用迭代器的移除方法)。按照 Collection 接口规范中的建议,编程人员通常应提供一个 void (无参数)和 Collection 构造方法。AbstractCollection 抽象类定义如下:public abstract class AbstractCollection implements Collection2、行为(对上述 Collection 接

4、口中方法的实现情况)下面给出了抽象类 AbstractCollection 对 Collection 接口的实现情况: public boolean add(E e) throw new UnsupportedOperationException(); public boolean addAll(Collection c) boolean modified = false; Iterator e = c.iterator(); while (e.hasNext() if (add(e.next() / 调用了上面定义的 add 方法 modified = true; return modifi

5、ed; public abstract Iterator iterator(); /未提供具体实现,将实现延迟到具体容器 public boolean remove(Object o) e = iterator(); if (o=null) if (e.next()=null) e.remove(); /内部使用了迭代器的 remove 方法,故具体容器的迭代器实现密切相关 return true; else if (o.equals(e.next() return false; public boolean removeAll(Collection if (c.contains(e.next

6、() public boolean retainAll(Collection if (!c.contains(e.next() public void clear() e.next(); public boolean contains(Object o) while (e.hasNext() if (e.next()=null) if (o.equals(e.next() /内部调用了的 equals方法,故与 equals 方法实现密切相关 public boolean containsAll(Collectioncontains(e.next() /内部调用了的 contains 方法,故

7、与 contains 方法实现密切相关 /此处省略两个 toArray 方法的实现 public abstract int size(); public boolean isEmpty() return size() = 0; /内部调用了的 size 方法,故与 size 方法实现密切相关对以上实现进行总结 :【增】:add, addAll 两个方法的实现是可选的,此处均默认 UnsupportedOperationException ;【查】:iterator 未提供具体实现,将实现延迟到具体容器,其对外屏蔽了不同容器的差异性,以统一的方式对容器访问、遍历 ;【删】:remove(Obje

8、ct),removeAll(Collection) ,retainAll(Collection) 和 clear() 四个方法的实现均直接调用了具体容器的迭代器(由 iterator() 方法返回)的 remove 方法 ;contains(Object o) 和 containsAll(Collection c) 两个方法的实现均直接或间接调用了元素的 equals 方法 ;【基本方法】:size 方法实现与具体容器相关, isEmpty 方法的实现均直接调用了 size 方法 ;【容器与数组转换】:分别提供与泛型 toArray 方法 和 原生 toArray 方法; 从源代码中我们可以知

9、道,几乎所有方法的实现都与迭代器相关,并且有以下特点:执行各种不同的添加和移除方法在 Collection 接口中都是可选操作,因为他们会改变容器的结构;Collection 接口中的读取方法都不是可选操作 ;四、Optional operations(可选操作)1、简述 执行各种不同的添加和移除方法在 Collection 接口中都是可选操作, 这意味着实现类并不需要为这些方法提供功能定义。 这是一种很不寻常的接口定义方式。正如你所看到的那样,接口是面向对象设计中的契约,它声明 “无论你选择如何实现该接口,我保证你可以向该接口发送这些消息。”但可选操作违反这个非常基本的原则,它声明调用某些方

10、法将不会执行有意义的行为,相反,他们会抛出异常。 为什么会将方法定义为可选呢? 因为这样做可以防止在设计中出现接口爆炸的情形。容器类库中的设计看起来总是为了描述每个主题的变体,而最终患上了令人困惑的接口过剩症。甚至这么做仍不能捕获接口的各种特例,因为总是有人会发明新的接口。“未获支持的操作” 这种方式可以实现 Java 容器类库的一个重要目标:容器应易学易用。未获支持的操作是一种特例,可以延迟到需要时实现。但是,为了让这种方式能够工作:UnsupportedOperationException 必须是一种罕见事件。即,对于大多数类而言,所有操作都应该可以工作,只有在特例(例如,通过Arrays

11、.asList()所得到的容器)中才会有未获支持的操作。在 Java 容器类库中确实如此,因为你在 99% 的时间里使用的容器类,如 ArrayList、LinkedList、HashSet 和 HashMap,以及其他的具体实现,都支持所有操作。这种设计留下了一个“后门”,如果你想创建新的 Collection, 但是没有为 Collection 接口中的所有方法都提供有意义的定义,那么它仍旧适合现有类库。如果一个操作是未获支持的,那么在实现接口的时候可能就会导致 UnsupportedOperationException 异常,而不是将产品程序交给客户后才出现此异常,这种情况是有道理的。毕

12、竟,他表示编程上有错误:使用了不正确的接口实现。值得注意的是,未获支持操作只有在运行时才能探测到,因此他们表示动态类型检查。2、示例 最常见的未获支持的操作,都来源于背后由固定尺寸的数据结构支持的容器。当你用 Arrays.asList() 将数组转换为 List 时,就会得到这样的容器。此外,你还可以通过使用 Collection 类中“不可修改”的方法,选择创建任何会抛出会抛出 UnsupportedOperationException 的容器。 请看下面的例子:public class Unsupported static void test(String msg, List list)

13、 System.out.println(- + msg + - Collection c = list; subList = list.subList(1, 8); / Copy of the sublist: c2 = new ArrayList(subList); try c.retainAll(c2); catch (Exception e) retainAll(): + e); c.removeAll(c2);removeAll(): c.clear();clear(): c.add(Xadd(): c.addAll(c2);addAll(): c.remove(Cremove():

14、/ The List.set() method modifies the value but / doesnt change the size of the data structure: list.set(0, List.set(): public static void main(String args) List list = Arrays.asList(A B C D E F G H I J K L.split(); test(Modifiable Copy, new ArrayList(list); / 产生新的尺寸可调的 / ArrayListArrays.asList(), li

15、st); / 产生固定尺寸的 ArrayListunmodifiableList(), Collections.unmodifiableList(new ArrayList(list); / 产生不可修改的列表 /* Output:- Modifiable Copy - - Arrays.asList() - java.lang.UnsupportedOperationException - unmodifiableList() - java.lang.UnsupportedOperationException因为 Arrays.asList() 实际上会产生一个 Arraylist ,它基于

16、一个固定大小的数组,仅支持那些不会改变数组大小的操作。所以,任何会引起对底层数据结构的尺寸进行修改的方法(add/remove 相关)都会产生一个 UnsupportedOperationException 异常,以表示对该容器未获支持操作的调用。 因此,Arrays.asList() 的真正意义在于:将其结果作为构造器参数传递给任何 Collection (或者使用 addAll 方法、Collections.addAll 静态方法),这样可以生成一个动态的容器。 由以上程序片段可知, Arrays.asList() 返回固定尺寸的List,而 Collections.unmodifiabl

17、eList() 产生不可修改的列表。正如输出所示,前者支持 set 操作,而后者不支持。若使用接口,那么还需要两个附加的接口,一个具有可以工作的 set 方法,另一个没有,因为附加的接口对于 Collection 的各种不可修改子类型来说是必须的。因此,可选方法可以避免 接口爆炸。 针对 Arrays.asList() 这种情况给出解释:1.首先该方法的源码为: public static asList(T. a) return new ArrayList(a);2.紧接着看上述方法所返回的由固定尺寸的数据结构支持的容器源码(部分):private static class ArrayList

18、 extends AbstractList implements RandomAccess, java.io.Serializable private static final long serialVersionUID = -2764017481108945198L; private nal E a; ArrayList(E array) if (array=null) throw new NullPointerException(); a = array; public int size() return a.length; public Object toArray() return a

19、.clone(); public T toArray(T a) int size = size(); if (a.length size) return Arrays.copyOf(this.a, size, (Class) a.getClass(); System.arraycopy(this.a, 0, a, 0, size); if (a.length asize = null; return a; public E get(int index) return aindex; public E set(int index, E element) /该容器支持的操作 E oldValue

20、= aindex; aindex = element; return oldValue; public int indexOf(Object o) for (int i=0; ia.length; i+) if (ai=null) return i; if (o.equals(ai) return -1; return indexOf(o) != -1;.其余代码省略针对 Add 操作: 该容器的该行为继承于 AbstractList 抽象类,直接或间接调用 add(int index, E element) 方法,抛出 UnsupportedOperationException/ AbstractList 中的方法public boolean add(E e) add(size(), e);public void add(int index, E element) throw new UnsupportedOperationExc

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1