浅谈java集合类(三)【Set,Queue】

时间:2023-02-15 10:06:36

Set是一个有趣的集合。它看起来有点像List,实际操作却有点像Map。Set也是记录一系列值的集合,但是呢,它和Map的key相同,它不能重复,否则会插入失败。所以呢,我们经常可以看见在Map中可以调用keySet()。说到这呢,它貌似就已经能做很多事了。假如你有兴趣做网络爬虫的话,有一个过滤重复链接的问题就不得不考虑了。Set貌似就是一个非常简单的解决办法了,我们可以用它来去重。

好了,我们来看看它的一写方法吧:

boolean add(E element)
//添加新元素element,假如Set中已经包含相同的元素则返回false,成功返回true
boolean addAll(Collection<? extends E> c)
//将集合中所有元素添加到Set中,返回true表示添加成功
boolean remove(Object o)
//移除指定元素,假如Set中包含该元素,则返回true

现在我们来说说他的主要实现类:HashSet,TreeSet..

HashSet类

Hash我们说得不少了,他呢,是一个链表数组,每个链表称为桶。通过调用hashCode()我们能就可以计算出他在哪个捅了,即hashCode%总桶数。确定了哪个桶还不够,因为在同一桶中,可能是相同元素,也可能是只是通过hashCode计算在同一桶中而已,通过调用equasl()就能知道是不是在同一桶中了。假如我们写一个类,重写hashCode().是它总是返回true,则他就仅仅而是一个LinkedList而已,并且还多了一些步骤,所以效率肯定是非常底下的。和之前一样,你可以指定一个初始大小,和装填因子。系统默认初始大小是16,装填因子0.75.我们指定初始大小时,系统会自动转化成2的下一个幂,而我们一开始把它初始化多大呢,推荐75%~150%。

TreeSet类

它是一个有序集合(sorted collection),可以将元素插入集合中,输出时按照一定的顺序。既然是有序,所以它是需要比较方法的,你可以在传入的类中实现Comparale接口,或者直接传入一个Comparator接口的实现类。用法与之前介绍的类似。

java.uitl.SortedSet<E>接口
Comparator<? extends E>comparator()
//获取用于对元素进行排序的比较器,如果元素用Comparable实现的compareTo方法,则返回null
E first()
E last()
//返回集合中最大或最小元素

java.util.NavigableSet<E>
E higer(E value)
E lower(E value)
//返回大于value的最小元素或者小于value的最大元素。如果没有合适元素返回null
E ceilling(E value)
E floor(E value)
//返回大于等于value的最小元素或者小于等于value的最大元素。没有合适的返回null
E pollFirst()
E pollLast()
//删除并返回这个集合中最大或最小元素。为空时返回null
Iterator<E> descendingIterator()
//返回一个按照递减顺序遍历集合的迭代器

Queue队列,就是先进先出的一个数据结构,下面我们将说说它:

我们来看看它的接口:

java.uitl.Queue<E>接口:
boolean add(E element)
boolean offer(E element)
//如果队列没有满,将给定的元素添加到双端队列的尾部并返回true。如果队列满了,第一个方法将跑出IllegalStateException,第二个则返回false
E remove()
E poll()
//假如队列不空,删除并返回这个队列头部的元素,如果队列是空的,第一个将抛出NoSuchElementException,第二个方法返回null
E element()
E peek()
//假如队列不空,返回这个队列的头部元素。假如为空,第一个将抛出NoSuchElementException,第二个方法返回null

java.util.Deque<E>接口:
void addFirst(E element)
void addLast(E element)
boolean offerFirst(E element)
boolean offerLast(E element)
//将指定元素添加至对头或者队尾。如果队满,前两个将抛出IllegalStateException,后两个返回false
E removeFirst()
E removeLast()
E pollFirst()
E pollLast()
//如果队列不空,删除并返回队头或者队尾。假如队空,前两个方法将抛出IllegalStatusException,后两个将返回false
E getFirst()
E getLast()
E peekFirst()
E peekLast()
//如果队非空,返回队头或者队尾元素,假如为空,前两个将抛出NoSuchElementException,后两个将返回null
Queue呢,则是我们默认理解的队列,即只有一个头,一个尾;而Deque是一个双头队列,而我们的LInkedList则是它的一个实现类
接下来,我们要看一下PriorityQueue,这是一个优先级队列,是一个有序的。因为是一个有优先级的,所以也需要有比较的方法,和之前介绍的类似。在没有传入Comparator接口实现类的情况下,默认是调用存入队列对象实现了的Comparable的compareTo方法。

我觉得他还是一个蛮好玩的东西。我们随意插入元素,然后可以按照我们需要的顺序输出。


好了,看了这,需要提示一个 一帮来说add,get,element....父类的方法在不满足的条件的情况下,一般时抛出异常的,而子类自己的peek,poll,offer..等等的方法一般则是直接返回false。