学学Java基础——Java集合——Collection接口下的集合

Java集合定义

Java的集合是一种用于存储和操作多个对象的数据结构,它提供了一套统一的接口和类,方便程序员进行数据的组织和处理。Java的集合主要分为两种类型也两个接口:Collection和Map。

Collection内容

Collection接口下的东西

主要重要的是下面的三个接口,List表示一个有序的、可重复的序列;Set表示一个无序的、不可重复的集合;Queue表示一个先进先出的队列;

Collection里的定义了一些要实现的方法

boolean add(E e):向集合中添加一个元素e,如果添加成功则返回true,否则返回false。
boolean addAll(Collection<? extends E> c):向集合中添加另一个集合c中的所有元素,如果添加成功则返回true,否则返回false。
void clear():清空集合中的所有元素。
boolean contains(Object o):判断集合中是否包含一个元素o,如果包含则返回true,否则返回false。
boolean containsAll(Collection<?> c):判断集合中是否包含另一个集合c中的所有元素,如果包含则返回true,否则返回false。
boolean equals(Object o):判断集合是否与另一个对象o相等,即是否包含相同的元素和顺序(如果有序)。
int hashCode():返回集合的哈希码值,通常根据集合中的元素计算。
boolean isEmpty():判断集合是否为空,即是否不包含任何元素。
Iterator<E> iterator():返回一个迭代器对象,用于遍历集合中的元素。
boolean remove(Object o):从集合中移除一个元素o,如果移除成功则返回true,否则返回false。
boolean removeAll(Collection<?> c):从集合中移除另一个集合c中的所有元素,如果移除成功则返回true,否则返回false。
boolean retainAll(Collection<?> c):保留集合中与另一个集合c中的元素相同的元素,如果保留成功则返回true,否则返回false。
int size():返回集合中的元素个数。
Object[] toArray():将集合转换为一个数组对象,并返回。
<T> T[] toArray(T[] a):将集合转换为一个指定类型的数组对象,并返回。

Collection中的List接口

List接口有三个主要的实现类:ArrayList、LinkedList、Vector(用的没前面两个多)

ArrayList是一个动态数组,它可以自动调整大小,提供了快速的随机访问,但是插入和删除元素的效率较低。

LinkedList是一个双向链表,它可以作为列表和队列使用,提供了快速的插入和删除元素,但是随机访问的效率较低。

Vector是一个同步的动态数组,它与ArrayList类似,但是线程安全,因此性能较低。

List接口中的方法,常用的方法有:add添加,get获取,remove删除,set修改,size大小

提一嘴:list的插入时间复杂度?Java中List有很多实现其中:

1,ArrayList和ArrayDeque使用动态数组作为底层数据结构,它们在尾部插入元素的时间复杂度是O(1),但是在中间或头部插入元素的时间复杂度是O(n)

2,LinkedList使用双向链表作为底层数据结构,它在任意位置插入元素的时间复杂度都是O(1),因为只需要修改指针即可。

ArrayList

ArrayList中它可以存储任意类型的对象,包括null,而且可以自动调整大小,提供了快速的随机访问,但是插入和删除元素的效率较低。它是非同步的,如果需要线程安全,可以使用Collections类的synchronizedList方法来包装它。

(1)ArrayList的底层数据结构

ArrayList是一个动态数组,它可以自动调整大小,提供了快速的随机访问,但是插入和删除元素的效率较低。

(2)ArrayList的扩容机制,初始化

创建一个ArrayList时,它的初始容量是10,它并不会立即分配内存空间,而是在添加第一个元素时才会创建数组。如果添加元素会看是否还有空间,没有会扩容。它会创建一个长度为原来1.5倍新的数组,然后将原来的数据复制到新的上。

(扩容会有性能的消耗所以建议一开始就创建合适大小的ArrayList,trimToSize()将数组大小变为当前元素个数)

(为什么ArrayList的扩容是1.5倍呢?因为太小的话会频繁扩容降低性能,太大可能会导致空间太多剩余,而1.5倍这个值则是一个很好的选择,既能减少扩容次数,又能避免过多的空间浪费。)

(3)ArrayList的基本使用

使用add()方法向ArrayList中添加元素,使用get()方法获取指定索引处的元素,使用set()方法修改指定索引处的元素,使用remove()方法删除指定索引处或者指定对象的元素,以及使用size()方法获取ArrayList中的元素个数。

举个例子

list.add("gty"); // 在ArrayList的末尾添加一个字符串"gty"
list.add(0, "gty"); // 在ArrayList的第一个位置插入一个字符串"gty"
String s = list.get(1); // 获取ArrayList中第二个位置的字符串,并赋值给变量s
list.set(1, "Java"); // 将ArrayList中第二个位置的字符串修改为"Java"
list.remove(0); // 删除ArrayList中第一个位置的字符串
list.remove("Java"); // 删除ArrayList中第一次出现的字符串"Java"
int n = list.size(); // 获取ArrayList中的元素个数,并赋值给变量n

(4)使用场景

当需要一个支持随机访问的集合,即可以通过索引来快速地访问或修改指定位置的元素的情况。当需要一个支持迭代器和增强for循环两种遍历方式的集合,即可以使用Iterator或for-each来遍历ArrayList中的元素的情况。

 LinkedList

(1)LinkedList的底层数据结构

LinkedList底层是一个基于双向链表实现的动态列表,它可以根据需要自动调整大小,提供了快速的插入和删除元素,但是随机访问的效率较低。

(2)LinkedList的扩容机制,初始化

LinkedList的扩容流程是指当LinkedList中的元素个数超过了链表的容量时,会在链表的头部或尾部添加新的节点,并将原来的节点与新节点连接起来。这个过程叫做扩容,扩容的策略是每次增加一个节点。

(3)LinkedList的基本使用

要向LinkedList中添加元素,可以使用add方法,在不指定索引的情况下,默认在链表尾部添加元素。

要从LinkedList中获取元素,可以使用get方法,传入一个索引参数,返回该索引位置的元素。

要修改LinkedList中的元素,可以使用set方法,传入一个索引参数和一个新的元素值,替换该索引位置的原有元素,并返回被替换的元素。

要删除LinkedList中的元素,可以使用remove方法,在不指定索引的情况下,默认删除链表头部的元素,并返回被删除的元素。也可以传入一个索引参数或一个对象参数,删除指定位置或指定值的元素,并返回被删除的元素

要获取LinkedList中的元素个数,可以使用size方法,返回链表中的节点数量。基本和ArrayList差不多。

(4)使用场景

当需要一个支持双向遍历的数据结构,即可以从头到尾或从尾到头遍历数据的情况。当需要一个支持多个指针或迭代器同时访问同一个数据结构的情况。

Vector

(1)Vector的底层数据结构

Vector的底层也是动态数组,自动扩容

(2)Vector的扩容机制

如果使用无参构造器创建Vector对象,那么它的初始容量为10,每次扩容时,容量会增加为原来的两倍。

如果使用有参构造器创建Vector对象,并指定初始容量和扩容增量,那么它的初始容量为指定值,每次扩容时,容量会增加为原来的值加上扩容增量。如果没有指定扩容增量,那么默认为0,此时每次扩容时,容量也会增加为原来的两倍。

(3)Vector的基本使用

Vector也是add方法添加,get方法获取,set方法修改,remove进行删除

(4)Vector的使用场景

要自动扩容的情况,或者开始不知道大小的情况,需要线程安全的情况,当需要一个支持枚举和迭代器两种遍历方式的集合,即可以使用Enumeration或Iterator接口来遍历向量中的元素。

Collection中的Set接口

Set接口表示一个不包含重复元素的集合。Set接口的特点是它对元素的顺序没有要求,只关注元素是否相等。

常用HashSet, TreeSet, LinkedHashSet等。TreeSet继承AbstractSet。

Set接口中的方法:

add(E e):向集合中添加一个元素,如果元素已存在,则不添加,返回false;否则添加成功,返回true。

remove(Object o):从集合中删除一个元素,如果元素存在,则删除成功,返回true;否则删除失败,返回false。

clear():清空集合中的所有元素。

contains(Object o):判断集合中是否包含一个元素,如果包含,则返回true;否则返回false

size():返回集合中的元素数量。

isEmpty():判断集合是否为空,如果为空,则返回true;否则返回false。

clone():返回集合的一个副本,即一个新的TreeSet对象,包含相同的元素。

iterator():返回集合的一个迭代器对象,可以用来遍历集合中的元素。

toArray():将集合转换为一个数组对象,包含相同的元素。

hashCode():返回集合的哈希码值,根据集合中所有元素的哈希码值计算得到。

equals(Object o):判断集合是否与另一个对象相等,即是否是同一个Set类型,并且包含相同的元素。

HashSet

(1)底层结构

HashSet的底层是使用一种称为哈希表的数据结构,HashSet内部是使用HashMap来存储元素的(将整个元素作为key)。(哈希表是一种数组和链表(或红黑树)的结合体,它可以根据元素的哈希值快速地定位和查找元素,也可以动态地调整数组的大小。)

(2)扩容机制

HashSet中的有几个参数:

初始容量(initial capacity):这是哈希表创建时的容量,默认值为16。

最大容量(maximum capacity):这是哈希表能够达到的最大容量,默认值为2^30。

加载因子(load factor):这是哈希表在其容量自动增加之前可以达到多满的一种尺度,默认值为0.75。

阈值(threshold):这是哈希表在进行扩容操作之前能够达到的最大元素数量,等于初始容量乘以加载因子。

扩容(resize):这是当哈希表中的元素数量超过阈值时,将数组的容量扩大为原来的两倍,并重新分配所有元素的哈希值和索引位置。

HashSet的扩容机制与HashMap的扩容机制相同,都是在达到一定的阈值时,将数组的容量扩大为原来的两倍,并重新计算所有元素的哈希值和索引位置。

(3)基础使用

HashSet提供了一些常用的方法来操作集合中的元素,例如:

add(E e):向集合中添加一个元素,如果元素已存在,则不添加,返回false;否则添加成功,返回true。
remove(Object o):从集合中删除一个元素,如果元素存在,则删除成功,返回true;否则删除失败,返回false。
clear():清空集合中的所有元素。
contains(Object o):判断集合中是否包含一个元素,如果包含,则返回true;否则返回false。
size():返回集合中的元素数量。
isEmpty():判断集合是否为空,如果为空,则返回true;否则返回false。
clone():返回集合的一个副本,即一个新的HashSet对象,包含相同的元素。
iterator():返回集合的一个迭代器对象,可以用来遍历集合中的元素。
toArray():将集合转换为一个数组对象,包含相同的元素。
hashCode():返回集合的哈希码值,根据集合中所有元素的哈希码值计算得到。
equals(Object o):判断集合是否与另一个对象相等,即是否是同一个Set类型,并且包含相同的元素。

LinkedHashSet

(1)底层结构

LinkedHashSet的底层是使用了LinkedHashMap作为存储结构,而LinkedHashMap是基于HashMap和双向链表实现的

(2)扩容机制

与hashSet基本一样:当我们创建一个默认的LinkedHashSet对象时,它的初始容量为16,加载因子为0.75,那么它的阈值为16 * 0.75 = 12,意思是当我们向LinkedHashSet中添加第13个元素时,它会触发扩容操作,将数组的容量扩大为32,并重新计算所有元素在新数组中的位置

(3)基础使用(与hashSet基本一样)

LinkedHashSet提供了一些常用的方法来操作集合中的元素,例如:

add(E e):向集合中添加一个元素,如果元素已存在,则不添加,返回false;否则添加成功,返回true。
remove(Object o):从集合中删除一个元素,如果元素存在,则删除成功,返回true;否则删除失败,返回false。
clear():清空集合中的所有元素。
contains(Object o):判断集合中是否包含一个元素,如果包含,则返回true;否则返回false。
size():返回集合中的元素数量。
isEmpty():判断集合是否为空,如果为空,则返回true;否则返回false。
clone():返回集合的一个副本,即一个新的LinkedHashSet对象,包含相同的元素。
iterator():返回集合的一个迭代器对象,可以用来遍历集合中的元素。
toArray():将集合转换为一个数组对象,包含相同的元素。
hashCode():返回集合的哈希码值,根据集合中所有元素的哈希码值计算得到。
equals(Object o):判断集合是否与另一个对象相等,即是否是同一个Set类型,并且包含相同的元素。

LinkedHashSet和HashSet的主要区别在于它们对元素的顺序是否保持。

HashSet是无序的,它不保证元素的插入顺序和迭代顺序一致。它使用哈希表作为底层数据结构,根据元素的哈希值来决定元素的存储位置

LinkedHashSet是有序的,它保证元素的插入顺序和迭代顺序一致。它使用哈希表和双向链表作为底层数据结构,根据元素的哈希值来决定元素的存储位置,同时使用链表来维护元素的次序

TreeSet

TreeSet可以存储不重复的任意类型的对象,并且按照一定的排序规则来排列元素。TreeSet的特点是它可以对元素进行自然排序或者自定义排序,但是它不保证元素的插入顺序和迭代顺序一致。

(1)底层结构

TreeSet的底层是使用一种称为红黑树的数据结构,它是一种自平衡的二叉搜索树,可以保证在添加、删除和查找元素时,都有较高的效率。

(2)扩容机制

TreeSet的扩容机制与HashMap和HashSet不同,它不是在达到一定的阈值时,将数组的容量扩大为原来的两倍,并重新计算所有元素的哈希值和索引位置。TreeSet的扩容机制是在每次添加或删除元素时,检查是否破坏了红黑树的性质,如果是,则进行相应的旋转和变色操作,恢复平衡。

(红黑树的性质是指:

每个节点要么是红色,要么是黑色。

根节点是黑色。

每个叶子节点(NIL节点,空节点)是黑色。

如果一个节点是红色,那么它的两个子节点都是黑色。

从任意一个节点到其每个叶子节点的所有路径上包含相同数目的黑色节点。)

(3)基础使用

add(E e):向集合中添加一个元素,如果元素已存在,则不添加,返回false;否则添加成功,返回true。

remove(Object o):从集合中删除一个元素,如果元素存在,则删除成功,返回true;否则删除失败,返回false。

clear():清空集合中的所有元素。

contains(Object o):判断集合中是否包含一个元素,如果包含,则返回true;否则返回false

size():返回集合中的元素数量。

isEmpty():判断集合是否为空,如果为空,则返回true;否则返回false。

clone():返回集合的一个副本,即一个新的TreeSet对象,包含相同的元素。

iterator():返回集合的一个迭代器对象,可以用来遍历集合中的元素。

toArray():将集合转换为一个数组对象,包含相同的元素。

hashCode():返回集合的哈希码值,根据集合中所有元素的哈希码值计算得到。

equals(Object o):判断集合是否与另一个对象相等,即是否是同一个Set类型,并且包含相同的元素。
除了这些通用的方法,TreeSet还提供了一些特有的方法来利用其排序特性,例如:

first():返回集合中最小的元素。

last():返回集合中最大的元素。

lower(E e):返回集合中小于给定元素e的最大元素,如果不存在,则返回null。

higher(E e):返回集合中大于给定元素e的最小元素,如果不存在,则返回null。

floor(E e):返回集合中小于等于给定元素e的最大元素,如果不存在,则返回null。

ceiling(E e):返回集合中大于等于给定元素e的最小元素,如果不存在,则返回null。

pollFirst():移除并返回集合中最小的元素,如果为空,则返回null。

pollLast():移除并返回集合中最大的元素,如果为空,则返回null。

subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive):返回一个子集视图,包含从fromElement到toElement之间(根据fromInclusive和toInclusive决定是否包含边界)的所有元素。

headSet(E toElement, boolean inclusive):返回一个子集视图,包含小于(根据inclusive决定是否包含等于)toElement的所有元素。

tailSet(E fromElement, boolean inclusive):返回一个子集视图,包含大于(根据inclusive决定是否包含等于)fromElement的所有元素。

总结

因此如果你需要一个访问快速的Set,你应该使用HashSet,因为它的添加、删除和查找操作都是常数时间复杂度。如果你需要一个保持插入顺序的Set,你应该使用LinkedHashSet,因为它可以按照添加顺序来遍历元素。如果你需要一个排序的Set,你应该使用TreeSet,因为它可以对元素进行自然排序或自定义排序。

Collection中的Queue接口

Java的Queue是一种实现了先进先出(FIFO)原则的数据结构,它可以用来存储和处理一系列有序的元素,并且有多个实现类,例如LinkedList、ArrayDeque、PriorityQueue等。

LinkedList上面有了就不再次写了

Queue接口提供了以下几个主要的方法:

add(E e):向队列尾部添加一个元素,如果成功返回true,如果队列已满则抛出异常。

offer(E e):向队列尾部添加一个元素,如果成功返回true,如果队列已满则返回false。

remove():从队列头部移除并返回一个元素,如果队列为空则抛出异常。

poll():从队列头部移除并返回一个元素,如果队列为空则返回null。

element():从队列头部返回一个元素,但不移除,如果队列为空则抛出异常。

peek():从队列头部返回一个元素,但不移除,如果队列为空则返回null。

ArrayDeque

ArrayDeque是一个双端队列,它可以在两端进行插入和删除操作。它的底层是一个循环数组,长度可以自动扩容,但必须是2的幂次方。它不是线程安全的,也不允许存储空元素。

(1)底层结构

使用循环数组做为底层数据结构,有高效的删除和插入效率,它有以下几个属性:

elements:一个Object类型的数组,用来存储队列中的元素。

head:一个int类型的变量,指向队列头部元素的索引位置。

tail:一个int类型的变量,指向队列尾部元素的下一个索引位置。

capacity:一个int类型的常量,表示数组的容量,默认值为16。

(循环数组的效果,ArrayDeque使用了两个变量head和tail来表示队列的头部和尾部。head指向队列中第一个元素的位置,tail指向队列中下一个待插入元素的位置。当head和tail相等时,表示队列已满。当head和tail都为0时,表示队列为空。)

(为了避免取模运算带来的性能损耗,ArrayDeque使用了位运算来计算下一个head或tail的位置。例如,当tail增加1时,使用(tail + 1) & (elements.length - 1)来计算新的tail位置。这样可以保证tail始终在0到elements.length - 1之间循环。)

(2)扩容机制

当创建一个ArrayDeque对象时,可以指定初始容量,也可以使用默认容量16。如果指定的容量不是2的幂次方,那么会计算出一个最接近且大于指定容量的2的幂次方作为实际容量。当向ArrayDeque中添加元素时,会检查当前数组是否已满。如果已满,那么会调用doubleCapacity方法进行扩容。扩容的方式是创建一个新的数组,长度是原数组的两倍,并将原数组中的元素复制到新数组中,保持原有的顺序。

(3)基础使用

ArrayDeque():创建一个空的双端队列,默认容量为16。

ArrayDeque(int numElements):创建一个空的双端队列,并指定初始容量。如果指定的容量不是2的幂次方,则会计算出一个最接近且大于指定容量的2的幂次方作为实际容量

ArrayDeque(Collection<? extends E> c):创建一个包含指定集合元素的双端队列,并按照集合迭代器返回的顺序排列元素。

add(E e):将指定元素插入到双端队列的末尾。如果插入成功,则返回true;否则抛出IllegalStateException异常。

addFirst(E e):将指定元素插入到双端队列的头部。如果插入成功,则返回true;否则抛出IllegalStateException异常。

addLast(E e):将指定元素插入到双端队列的末尾。如果插入成功,则返回true;否则抛出IllegalStateException异常。该方法与add(E e)等效。

offer(E e):将指定元素插入到双端队列的末尾。如果插入成功,则返回true;否则返回false

offerFirst(E e):将指定元素插入到双端队列的头部。如果插入成功,则返回true;否则返回false

offerLast(E e):将指定元素插入到双端队列的末尾。如果插入成功,则返回true;否则返回false。该方法与offer(E e)等效。

getFirst():返回双端队列的第一个元素,但不删除它。如果双端队列为空,则抛出NoSuchElementException异常。

getLast():返回双端队列的最后一个元素,但不删除它。如果双端队列为空,则抛出NoSuchElementException异常。

peek():返回双端队列的第一个元素,但不删除它。如果双端队列为空,则返回null

peekFirst():返回双端队列的第一个元素,但不删除它。如果双端队列为空,则返回null。该方法与peek()等效。

peekLast():返回双端队列的最后一个元素,但不删除它。如果双端队列为空,则返回null。

remove():检索并删除此双端队列表示的队列的头部(即第一个元素)。如果此双端队列为空,则抛出NoSuchElementException异常。

remove(Object o):从此双端队列中删除指定元素的单个实例。如果存在这样的元素,则返回true,否则返回false。

removeFirst():检索并删除此双端队列的第一个元素。如果此双端队列为空,则抛出NoSuchElementException异常。

removeLast():检索并删除此双端队列的最后一个元素。如果此双端队列为空,则抛出NoSuchElementException异常。

removeFirstOccurrence(Object o):删除此双端队列中第一次出现的指定元素(从头到尾遍历双端队列时)。如果存在这样的元素,则返回true,否则返回false。

removeLastOccurrence(Object o):删除此双端队列中最后一次出现的指定元素(从头到尾遍历双端队列时)。如果存在这样的元素,则返回true,否则返回false。

poll():检索并删除此双端队列表示的队列的头部(即第一个元素),如果此双端队列为空,则返回null。

pollFirst():检索并删除此双端队列的第一个元素,如果此双端队列为空,则返回null。

pollLast():检索并删除此双端队列的最后一个元素,如果此双端队列为空,则返回null。

pop():从此双端队列表示的堆栈中弹出一个元素。这相当于调用removeFirst()。

PriorityQueue

PriorityQueue是一种基于优先级堆的无界优先队列,它的元素可以按照自然顺序或者指定的比较器进行排序。PriorityQueue不允许插入null元素,也不允许插入不可比较的对象(否则可能会抛出ClassCastException)。PriorityQueue的头部是最小的元素,如果有多个元素相同,那么头部是其中任意一个,顺序是随机的。

上面的按照自然顺序或者指定的比较器进行排序。怎么理解呢就是:

自然顺序是指元素之间的默认比较规则,通常是按照字典序或者数值大小进行比较。例如,如果PriorityQueue中存放的是整数,那么自然顺序就是从小到大的顺序。

指定的比较器是指用户自定义的一个类或者函数,它可以实现自己的比较逻辑,来决定元素之间的优先级。例如,如果PriorityQueue中存放的是学生对象,那么用户可以指定一个比较器,根据学生的成绩或者姓名来排序。

无论是自然顺序还是指定的比较器,都必须满足一种叫做严格弱序(strict weak ordering)的条件,即:

对于任意两个元素a和b,如果a < b,则b不小于a。
对于任意三个元素a、b和c,如果a < b且b < c,则a < c。
对于任意两个元素a和b,如果a不小于b且b不小于a,则a等于b。

再那么怎么创建指定比较器呢?

指定的比较器需要实现Comparator接口,并重写compare(Object o1, Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。

也就是如果compare方法返回正数,表示前一个元素大于后一个元素,那么就会交换它们的位置,实现升序排序如果返回负数,表示前一个元素小于后一个元素,那么就不交换,保持原来的顺序;如果返回0,表示两个元素相等,那么就不影响排序结果

(1)底层结构

PriorityQueue的底层结构是一个Object数组,它可以用一棵完全二叉树来表示。任意一个非叶子节点的权值,都不大于其左右子节点的权值。这样就保证了每次出队或者入队时,都能够快速地找到最小的元素。

(2)扩容机制

PriorityQueue的容量是动态增长的,它至少和队列大小一样大。当元素被添加到PriorityQueue时,它的容量会自动增长,具体的增长策略没有指定。

(3)基础使用

PriorityQueue提供了以下方法:

add(E e): 将指定的元素插入此优先级队列。如果队列已满,则抛出IllegalStateException异常。

clear(): 从此优先级队列中删除所有元素。

comparator(): 返回用于为了在这个队列中的元素,或比较null如果此队列根据所述排序 natural ordering 的元素。

contains(Object o): 如果此队列包含指定的元素,则返回 true 。

forEach(Consumer<? super E> action): 对 Iterable 每个元素执行给定操作,直到处理 Iterable 所有元素或操作引发异常。

iterator(): 返回此队列中元素的迭代器。

offer(E e): 将指定的元素插入此优先级队列。如果队列已满,则返回false。

peek(): 检索但不删除此队列的头部,如果此队列为空,则返回null。

poll(): 检索并删除此队列的头部,如果此队列为空,则返回null。

remove(Object o): 从此队列中删除指定元素的单个实例(如果存在)。

size(): 返回此集合中的元素数。

spliterator(): 在此队列中的元素上创建 late-binding 和故障快速 Spliterator 。

toArray(): 返回包含此队列中所有元素的数组。

toArray(T[] a): 返回包含此队列中所有元素的数组; 返回数组的运行时类型是指定数组的运行时类型。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值