Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
轻松解读源码系列之Java集合接口&抽象类(3)—List、Set、Queue,希望能够帮助你!!!。
大家好,我是程序员xiao熊,本篇内容将为大家分享Java集合接口Collection的三大子接口:List、Set、Queue;这些接口和抽象类是Java集合框架的基础,为具体的子类实现提供了规范以及基础实现,降低了子类实现的成本;本篇包含内容如下:
List是一个有序的集合(也称为序列),继承自Collection,Collection是直接父接口;其具备了如下规范和特性:
子类实现接口时需要注意:
使用的注意事项:
boolean add(E e) |
将元素添加至列表尾部 |
void add(int index, E element)(新增) |
在指定位置添加元素 |
boolean addAll(Collection<? extends E> c) |
添加一个集合中的元素到当前集合的尾部 |
boolean addAll(int index, Collection<? extends E> c) (新增) |
在指定位置添加指定集合中的所有元素至当前集合的尾部 |
void clear() |
清除集合元素 |
boolean contains(Object o) |
判断是否包含指定的对象 |
boolean containsAll(Collection<?> c) |
判断是否包含集合中的所有元素 |
boolean equals(Object o) |
判断对象是否与当前集合相等,要求:集合的元素相等、元素顺序相同 |
E get(int index) (新增) |
获取指定索引位置的元素 |
int hashCode() |
返回集合的hashCode;逻辑如下: int hashCode = 1; for (E e : list) hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); |
int indexOf(Object o) (新增) |
获取指定对象在列表中的索引位置(从头部开始) |
boolean isEmpty() |
判断结合是否为空 |
Iterator<E> iterator() |
返回列表的iterator对象 |
int lastIndexOf(Object o) (新增) |
返回指定对象在列表的索引位置(从尾部开始) |
ListIterator<E> listIterator()(新增) |
返回列表的listiterator |
ListIterator<E> listIterator(int index) (新增) |
返回定位在指定索引位置处的listiterator |
E remove(int index) (新增) |
删除指定所以位置处的元素 |
boolean remove(Object o) |
删除指定对象 |
boolean removeAll(Collection<?> c) |
删除存在于指定集合中的元素 |
default void replaceAll(UnaryOperator<E> operator) (新增) |
根据原来的元素计算新的元素,并进行替换 |
boolean retainAll(Collection<?> c) |
保留指定集合中元素 |
E set(int index, E element) (新增) |
更新指定索引位置处的元素 |
int size() |
返回元素数量 |
default void sort(Comparator<? super E> c) (新增) |
按照指定的comparator进行排序 |
default Spliterator<E> spliterator() |
返回List的spliterator |
List<E> subList(int fromIndex, int toIndex) (新增) |
根据开始和结束下标获取子列表 注意:不包含下标范围,例如: [1, 6) |
Object[] toArray() |
将元素以Object数组形式返回,返回的数组与集合互不影响 |
<T> T[] toArray(T[] a) |
返回指定类型的数组,返回的数组与集合互不影响 |
Set接口是对数学上“集合”的抽象,是一个不会包含重复元素的集合,继承自Collection,Collection是其直接父级接口;更准确的说是set集合不会包含两个满足e1.equals(e2)的元素, 并且只有一个null元素;其具备以下规范和特性:
使用的注意事项:
在时如果将可变对象用作set元素,则必须非常小心。如果对象是集合中的一个元素,但其值的改变影响了等值比较,则集合的行为将会是不确定的。还有一个特殊情况是,不允许一个集合包含自己作为一个元素;
Set接口对add、equals以及hashcode有一些新增的规则约束,具体的方法如红色字体部分
boolean add(E e) |
添加元素,如果元素已存在,则返回false,集合保持不变;否则元素添加成功 |
boolean addAll(Collection<? extends E> c) |
添加集合中的元素至当前集合,如果元素已存在,不添加;最终的结果就是两个set集合的并集;需要注意的是,如果在add过程中,入参集合c发生了变化,则addAll操作的结果是不确定的 |
boolean equals(Object o) |
比较指定对象与此集合是否相等。如果指定对象也是一个集合,两个集合的大小相同,并且指定集合的每个成员都包含在这个集合中(或者等价地说,这个集合的每个成员都包含在指定集合中),返回true;这个定义确保了equals方法的逻辑在set接口的不同实现中都是正确的; |
int hashCode() |
返回此集合的哈希码值。集合的哈希码定义为集合中元素的哈希码之和,其中null元素的哈希码定义为零。这确保了对于任意两个集合s1和s2, s1.equals(s2)意味着s1. hashcode ()==s2. hashcode(),这符合Object.hashCode()的一般约定。 |
void clear() |
清除集合中的元素 |
boolean contains(Object o) |
判断是否包含某个元素 |
boolean containsAll(Collection<?> c) |
判断是否包含指定集合中的所有元素 |
boolean isEmpty() |
判断当前集合是否是空集合 |
Iterator<E> iterator() |
返回当前集合的iterator对象 |
boolean remove(Object o) |
删除指定的元素对象,如果元素存在,则返回true;否则返回false; |
boolean removeAll(Collection<?> c) |
删除当前集合中存在于指定集合中的元素;如果当前集合于指定的集合有交集,则返回true(说明当前集合会发生变化);否则返回false; |
boolean retainAll(Collection<?> c) |
保留存在于指定集合中的所有元素 |
int size() |
返回集合中元素的数量 |
default Spliterator<E> spliterator() |
返回集合的spliterator对象 |
Object[] toArray() |
将元素以Object数组形式返回,返回的数组与集合互不影响 |
<T> T[] toArray(T[] a) |
返回指定类型的数组,返回的数组与集合互不影响 |
队列是在队头删除/获取元素,在队尾添加元素的线性表,在JDK中对应的接口是Queue;Queue继承自Collection接口,Collection是其直接父接口。除了基本的集合操作,Queue还提供了插入、获取(删除)和检索元素的操作。每类方法都有两种形式:一种在操作失败时抛出异常,另一种返回特殊值(null或false,取决于操作)。其中,insert操作返回特殊值的形式专门设计用于有容量限制的队列实现。在其他大多数实现中,insert操作不会失败。
队列方法总结 |
||
抛出异常 |
返回固定的值 |
|
Insert操作 |
add(e) |
offer(e) |
Remove操作 |
remove() |
poll() |
Examine操作(检索元素) |
element() |
peek() |
队列一般是按照FIFO的规则存放元素;但是在队列的实现类中,也有例外,例如PriorityQueue,它是按照元素的comparator的结果决定元素顺序,或者是元素本身的顺序。LIFO队列(或者是栈)也是例外,它是按照LIFO(后进先出)的规则存放元素。不管以什么排序规则存储元素,队列的头结点(第一个元素)是remove()或者poll()方法在被调用时需要删除的元素。在一个FIFO队列中,所有新加入的元素都会被添加到对列表尾部;其他类型的队列具体实现,可能会使用不同的存放元素的规则;对于队列的实现类来说,必须要指定存放元素排序规则;
实现队列的注意事项:
队列使用注意事项:
Queue的实现类通常不允许插入null值,不过也有例外的实现类:LinkedList;LinkedList是可以接收null值;但是即使实现类设计为可以接收null值,也最好不要把null值存入队列中,因为null值在某些场景下是有用的,例如poll方法通过返回null值,表示队列为空,
由于Queue了继承了Collection, 也会拥有Collection的方法,约束和实现规范与Collection保持一致,具体参考Collection的说明;此外,Queue作为队列的实现,还提供了队列专用的方法,具体如下:
boolean add(E e) |
在队列尾部添加元素,如果添加成功,则返回true,如果添加失败,则抛出异常 |
E element() |
获取队列头结点元素,但不会删除;如果队列为空,会抛出异常 |
boolean offer(E e) |
在队列尾部添加元素,如果添加成功,则返回true,如果添加失败,则返回false(这是与add()的区别) |
E peek() |
获取队列头结点元素,但不会删除;如果队列为空,则会返回null |
E poll() |
获取队列头结点元素,并删除;如果队列为空,则会返回null |
E remove() |
获取队列头结点元素,并删除;如果队列为空,则会抛出异常 |
更多关于Java集合的内容,可参考以下文章:
欢迎关注【程序员xiao熊】,今天的分享就到这里,欢迎大家在评论区进行交流
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。