在软件构造这门课程的学习中,我们一直使用的是Java编程语言,其中我们最常用的除了八种基本数据类型,还有就是String对象外还有一个集合类,在最近的几次实验中,我愈发感觉到Java集合类的重要性!java集合类中的成员类种类繁多,最常用的是ArrayList、HashMap、HashSet,在实验中也偶尔用到过Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等等!
下面的图展示了整个集合类的成员类以及他们之间的关系。
接下来对集合类中的每一个成员类进行总结以及讲解。
这一篇讲的collection接口;首先,集合是用来存储数据的,它是基于某种数据结构数据容器。常见的数据结构:数组(Array)、集(Set)、队列(Queue)、链表(Linkedlist)、树(Tree)、堆(Heap)、栈(Stack)和映射(Map)等结构。集合大类分为了Collection和Map。Collection接口的基本框架如下图:
方法 | 作用 |
boolean add(Object o) | 向集合中加入一个对象的引用 |
void clear() | 删除集合中所有的对象,即不再持有这些对象的引用 |
boolean isEmpty() | 判断集合是否为空 |
boolean contains(Object o) | 判断集合中是否持有特定对象的引用 |
Iterartor iterator() | 返回一个Iterator对象,可以用来遍历集合中的元素 |
boolean remove(Object o) | 从集合中删除一个对象的引用 |
int size() | 返回集合中元素的数目 |
Object[] toArray() | 返回一个数组,该数组中包括集合中的所有元素 |
List是一个有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出123),其次有索引,包含了一些带索引的方法并且在List中允许存储重复的元素。
List的子类通常有两个,这两个通常是线程不安全的:
java.util.ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。
java.util.LinkedList集合数据存储的结构是链结构。方便元素添加,删除的集合。
java.util.LinkedList集合 implements List接口在日常的Java编程中,一般使用的ArrayList的集合类比较多,所以在这里总结一下ArrayList类的方法(在使用ArrayList特有的方法的时候,不可以使用多态):
public void addFirst(E e) | 将指定元素插入此列表的开头 |
public void addLast(E e) | 将指定元素添加到此列表的结尾 |
public void addpush(E e) | 将元素推如此列表所表示的推栈 |
public E getFirst() | 返回此列表的第一个元素 |
public E getLast() | 返回此列表的最后一个元素 |
public E removeFirst() | 移除并返回此列表的第一个元素 |
public E removeLast() | 移除并返回此列表的最后一个元素 |
public E pop() | 从此列表所表示的推栈处弹出一个元素 |
public boolean isEmpty() | 如果列表不包含元素,则返回true |
set接口是继承自Collection的子接口,特点是元素不重复,存储无序。在set接口的实现类中添加重复元素是不会成功的,判断两个元素是否重复根据元素类重写的hashCode()和equals()方法。
HashSet实现 Set 接口,由哈希表(底层由 HashMap 实现)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。HashSet保证元素唯一。底层数据结构是哈希表,哈希表依赖于哈希值存储添加元素时保证元素唯一,本质底层依赖两个方法:
1 int hashCode(); 2 boolean equals(Object obj);
TreeSet基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。排序方式完全取决于使用的构造方法。使用元素的自然顺序对元素进行排序(自然排序)、根据创建 set 时提供的 Comparator 进行排序(比较器排序),TreeSet保证元素的排序和唯一性的底层数据结构是红黑树(自平衡二叉树)
LinkedHashSet类具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。由链表保证元素有序由哈希表保证元素唯一
boolean addAll(Collection<? extends E> c) | 向set添加集合 |
E ceiling(E e) | 返回大于等于给定元素的最小元素,没有返回null |
Object clone() | 浅拷贝集合 |
E first() | 返回set的第一个元素 |
E last() | 返回set的最后一个元素 |
E floor(E e) | 返回给定元素的上一元素 |
E higher(E e) | 返回比给定元素大的最小元素 |
E lower(E e) | 返回比给定元素小的最大元素 |
SortedSet<E> headSet(E toElement) | 返回不包含给定元素前面的所有元素 |
SortedSet<E> tailSet(E fromElement) | 返回大于等于给定元素后面的所有元素 |
SortedSet<E> subSet(E fromElement, E toElement) | 返回开始/结束元素之间的所有元素集合 |
NavigableSet<E> headSet(E toElement, boolean inclusive) | 返回比给定元素小的元素集合,true表示小于等于 |
NavigableSet<E> tailSet(E fromElement, boolean inclusive) | 返回比给定元素大的元素集合,true表示大于等于 |
E pollFirst() | 移除第一个元素,返回null如果set为空 |
E pollLast() | 移除最后一个元素,返回null如果set为空 |
Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。BlockingQueue 继承了Queue接口。
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列是一种数据结构.它有两个基本操作:在队列尾部加人一个元素,和从队列头部移除一个元素就是说,队列以一种先进先出的方式管理数据,如果你试图向一个 已经满了的阻塞队列中添加一个元素或者是从一个空的阻塞队列中移除一个元索,将导致线程阻塞.在多线程进行合作时,阻塞队列是很有用的工具。工作者线程可 以定期地把中间结果存到阻塞队列中而其他工作者线线程把中间结果取出并在将来修改它们。队列会自动平衡负载。如果第一个线程集运行得比第二个慢,则第二个 线程集在等待结果时就会阻塞。如果第一个线程集运行得快,那么它将等待第二个线程集赶上来。
offer | 添加一个元素并返回true,如果队列已满,则返回false |
poll | 移除并返问队列头部的元素,如果队列为空,则返回null |
peek | 返回队列头部的元素,如果队列为空,则返回null |
put | 添加一个元素,如果队列满,则阻塞 |
take | 移除并返回队列头部的元素,如果队列为空,则阻塞 |
Map 接口中键和值一一映射. 可以通过键来获取值。
void clear( ) | 从此映射中移除所有映射关系(可选操作)。 |
boolean containsKey(Object k) | 如果此映射包含指定键的映射关系,则返回 true。 |
boolean containsValue(Object v) | 如果此映射将一个或多个键映射到指定值,则返回 true。 |
Set entrySet( ) | 返回此映射中包含的映射关系的 Set 视图。 |
boolean equals(Object obj) | 比较指定的对象与此映射是否相等。 |
Object get(Object k) | 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。 |
int hashCode( ) | 返回此映射的哈希码值。 |
boolean isEmpty( ) | 如果此映射未包含键-值映射关系,则返回 true。 |
Set keySet( ) | 返回此映射中包含的键的 Set 视图。 |
Object put(Object k, Object v) | 将指定的值与此映射中的指定键关联(可选操作)。 |
void putAll(Map m) | 从指定映射中将所有映射关系复制到此映射中(可选操作)。 |
Object remove(Object k) | 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 |
int size( ) | 返回此映射中的键-值映射关系数。 |
Collection values( ) | 返回此映射中包含的值的 Collection 视图。 |