java源码阅读-集合接口

时间:2022-03-21 17:50:40

Collection接口

JAVA SDK不提供任何对Collection接口的直接实现,只提供对一些子接口的实现,子接口的实现必须有两个构造函数,一个是无参的构造函数,用于创建空集合,另一个是以Collection为参数的构造函数,用于复制集合类

int size();---返回集合中的元素个数,如果个数大于'Integer.MAX_VALUE',则返回'Integer.MAX_VALUE'
Object[] toArray();---此方法是数组和集合的一个桥梁,转换时会'另开辟一个新数组',无论这个集合是否由数组支持实现的(如List)
<T> T[] toArray(T[] a);---同样,此方法转换时也是另开辟一个新的数组,并且可以指定数组长度,如果'指定的数组长度大于集合中的元素个数',那么后面的数组内容会被赋值为null,如果'指定数组元素为0或小于集合中的元素个数',那么会自动扩展为何集合同样个数的一个数组长度

List

List是一个允许重复项的有序集合,内部实现由数组支持,可以通过下标来进行插入或查询等操作

bboolean remove(Object o);---若'有重复元素',则只会删除第一次出现的那一个
boolean addAll(int index, Collection<? extends E> c);---可以指定插入位置,若'指定的插入位置没有元素'会抛出IndexOutOfBoundsException

Set

Set是一种不包含重复的元素的无序集合,允许有null值,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。

Queue

用于处理操作之前保存元素,除了Collection提供的方法外,还提供了额外的方法,这些方法有两种执行结果,要么成功返回,要么失败抛出异常。
queue有两种插入操作,后一种插入操作专门用于容量限制,大多数情况下,不容易失败

<table BORDER CELLPADDING=3 CELLSPACING=1>
     <caption>Summary of Queue methods</caption>
     <tr>
         <td></td>
         <td ALIGN=CENTER><em>Throws exception</em></td>
         <td ALIGN=CENTER><em>Returns special value</em></td>
     </tr>
     <tr>
         <td><b>Insert</b></td>
         <td>{@link Queue#add add(e)}</td>
         <td>{@link Queue#offer offer(e)}</td>
     </tr>
     <tr>
         <td><b>Remove</b></td>
         <td>{@link Queue#remove remove()}</td>
         <td>{@link Queue#poll poll()}</td>
     </tr>
     <tr>
         <td><b>Examine</b></td>
         <td>{@link Queue#element element()}</td>
         <td>{@link Queue#peek peek()}</td>
     </tr>
 </table>

通常队列都是先进先出(FIFO)的方式,但也有例外,比如优先队列(根据提供的顺序的元素或元素的自认顺序)和后进先出队列(LIFO),在一个FIFO队列,所有新的元素插入队列的尾部。其他类型的队列可以使用不同的安置规则,但是每个队列的代码实现中都必须指定其排序属性。

boolean add(E e);---'成功'则插入,'失败'则抛出异常
boolean offer(E e);---'成功'则插入,'失败'则返回false
E remove();---'检索'队列头元素,返回后'删除',若是'空队列',则抛出异常
E poll();---'检索'队列头元素,返回后'删除',若是'空队列',则返回null
E element();---'检索'队列元素(返回队列头元素),但是'不删除',若是'空队列'则抛出异常
E peek();---'检索'队列元素(返回队列头元素),但是'不删除',若是'空队列',则返回null

Map

Map没有继承Collection接口,Map接口是提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。即是一一映射。
我们可以把这个接口方法分成三组操作:改变、查询和提供可选视图,改变操作允许您从映射中添加和除去键-值对。键和值都可以为 null。但是,您不能把Map 作为一个键或值添加给自身。

V get(Object key);---若'key值对应的value',则返回,若没有则返回null,另外,在允许有空value的Map中,返回null不一定是没有此key,此时还需要另行判断,例如containsKey()方法
V put(K key, V value);---存放key-value对,若'key值存在',则原key值对应的value会被新的替换掉
V remove(Object key);---删除key-value对并返回value值,若'原key值不存在',则返回null
Set<K> keySet();---返回所有的key值
Collection<V> values();---返回所有的value值
Set<Map.Entry<K, V>> entrySet();---返回所有的键值对集合
'以上两个修改',如果有迭代器正在进行操作,那么除了迭代器自己的remove操作,其余都是不允许的