集合类操作优化经验总结(一)

*爱你&永不变心* 提交于 2020-03-06 18:08:16

本文首先针对 Java 集合接口进行了一些介绍,并对这些接口的实现类进行详细描述,包括 LinkedList、ArrayList、Vector、Stack、Hashtable、HashMap、WeakHashMap 等,然后对一些实现类的实现方式和使用经验进行讲解,同时重点介绍 WeakHashMap。希望通过本文介绍,可以让读者对集合的操作方式、注意事项等有一些了解。

在实际的项目开发中会有很多的对象,如何高效、方便地管理对象,成为影响程序性能与可维护性的重要环节。Java 提供了集合框架来解决此类问题,线性表、链表、哈希表等是常用的数据结构,在进行 Java 开发时,JDK 已经为我们提供了一系列相应的类来实现基本的数据结构,所有类都在 java.util 这个包里,清单 1 描述了集合类的关系。

清单 1.集合类之间关系
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap

本文讲的就是集合框架的使用经验总结,注意,本文所有代码基于 JDK7。

集合接口

Collection 接口

Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素(Elements)。一些 Collection 允许相同的元素、支持对元素进行排序,另一些则不行。JDK 不提供直接继承自 Collection 的类,JDK 提供的类都是继承自 Collection 的子接口,如 List 和 Set。所有实现 Collection 接口的类都必须提供两个标准的构造函数,无参数的构造函数用于创建一个空的 Collection,有一个 Collection 参数的构造函数用于创建一个新的 Collection,这个新的 Collection 与传入的 Collection 有相同的元素,后一个构造函数允许用户复制一个 Collection。

如何遍历 Collection 中的每一个元素?

不论 Collection 的实际类型如何,它都支持一个 iterator() 的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问 Collection 中每一个元素。典型的用法如下:

Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()){
Object obj = it.next(); // 得到下一个元素
}

Collection 接口派生的两个接口是 List 和 Set。

Collection 接口提供的主要方法:

  1. boolean add(Object o) 添加对象到集合;

  2. boolean remove(Object o) 删除指定的对象;

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

  4. boolean contains(Object o) 查找集合中是否有指定的对象;

  5. boolean isEmpty() 判断集合是否为空;

  6. Iterator iterator() 返回一个迭代器;

  7. boolean containsAll(Collection c) 查找集合中是否有集合 C 中的元素;

  8. boolean addAll(Collection c) 将集合 C 中所有的元素添加给该集合;

  9. void clear() 删除集合中所有元素;

  10. void removeAll(Collection c) 从集合中删除 C 集合中也有的元素;

  11. void retainAll(Collection c) 从集合中删除集合 C 中不包含的元素。

List 接口

List 是有序的 Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素,这类似于 Java 的数组。和下文要提到的 Set 不同,List 允许有相同的元素。

除 了具有 Collection 接口必备的 iterator() 方法外,List 还提供一个 listIterator() 方法,返回一个 ListIterator 接口。和标准的 Iterator 接口相比,ListIterator 多了一些 add() 之类的方法,允许添加、删除、设定元素、向前或向后遍历等功能。实现 List 接口的常用类有 LinkedList,ArrayList,Vector 和 Stack 等。

List 接口提供的主要方法:

  1. void add(int index,Object element) 在指定位置上添加一个对象;

  2. boolean addAll(int index,Collection c) 将集合 C 的元素添加到指定的位置;

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

  4. int indexOf(Object o) 返回第一个出现元素 O 的位置;

  5. Object removeint(int index) 删除指定位置的元素;

  6. Object set(int index,Object element) 用元素 element 取代位置 index 上的元素, 返回被取代的元素。

Map 接口

Map 没有继承 Collection 接口。Map 提供 Key 到 Value 的映射,一个 Map 中不能包含相同的 Key,每个 Key 只能映射一个 Value。Map 接口提供 3 种集合的视图,Map 的内容可以被当作一组 Key 集合,一组 Value 集合,或者一组 Key-Value 映射。

Map 提供的主要方法:

  1. boolean equals(Object o) 比较对象;

  2. boolean remove(Object o) 删除一个对象;

  3. put(Object key,Object value) 添加 key 和 value。

RandomAccess 接口

RandomAccess 接口是一个标志接口,本身并没有提供任何方法,任务凡是通过调用 RandomAccess 接口的对象都可以认为是支持快速随机访问的对象。此接口的主要目的是标识那些可支持快速随机访问的 List 实现。任何一个基于数组的 List 实现都实现了 RaodomAccess 接口,而基于链表的实现则都没有。因为只有数组能够进行快速的随机访问,而对链表的随机访问需要进行链表的遍历。因此,此接口的好处是,可以在应用程序中 知道正在处理的 List 对象是否可以进行快速随机访问,从而针对不同的 List 进行不同的操作,以提高程序的性能。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!