2024年9月arraydeque(一个数据的集合的特点)

 更新时间:2024-09-21 07:32:10

  ⑴arraydeque(一个数据的集合的特点

  ⑵一个数据的集合的特点

  ⑶底层数据结构是数组增加和删除的效率低,查询和修改的效率高能够存储null值线程不安全,效率高有索引,能够方便检索元素可重复,我们自己可以通过选择排序去重复不可以排序,但是可以通过Collection.sort()方法排序Vector的特点:Vector是老版本的ArrayList,唯一区别就是Vector是线程安全的接口Deque:实现类ArrayDeque:基于数组的双端队列具备数组的特点;队列的功能,对端队列的功能,栈结构的功能适用于大量查询修改操作实现类LinkedList:基于链表的双端队列具备链表的特点;队列的功能,对端队列的功能,栈结构的功能适用于大量增加,删除Set接口的特点:实现类:HashSet:基于哈希表结构存储无序,因为对象的hashCode值和哈希表存储的索引有关,hashCode是相对随机,所以无序唯一,去重复依赖于hashCode和equals方法可以存储null,但是null不能重复实现类:treeSet:基于二叉树的结构去重复,依赖于二叉树的存储特点,排序依赖于二叉树的取特点有自然排序和比较器排序实现类:LinkedHashSet:基于链表和哈希表有序的,链表保证有序唯一,哈希表保证唯一

  ⑷public《T》Tarray){ArrayDeque《T》queue=newArrayDeque《T》();for(Tt:array){queue.addFirst(t);}returnqueue.toArray(newT);}//哈,瞎编的。单纯从知识上觉得应该这样做。这个函数是反转数组的,你把串组给它,就就返回你给反转后的结果。有错误。泛型不能创建数组。只能以对象数组形式反转了。方法不用多变。代码中泛型都去掉,换成Object就可以了。

  ⑸[源码探究]ArrayDeque双端队列使用&实现原理分析

  ⑹对于Queue(先进先出的详细使用方式和实现原理,可参考文章:BlockingQueue使用方式及源码阅读

  ⑺ArrayDeque

  ⑻写csb题目时惊叹为什么会有这种东西,于是搜索了一番,发现这容器还是很有意思的,于是搬运了一下。参考:ArrayDeque-(jianshu.)JavaArrayDeque-Java教程-菜鸟教程(cainiaojc.)

  ⑼在ArrayDeque类实现这两个接口:JavaQueue和JavaDeque

  ⑽使用了数组来存储数据,同时用两个int值head和tail来表示头部和尾部。不过需要注意的是tail并不是尾部元素的索引,而是尾部元素的下一位,即下一个将要被加入的元素的索引。

  ⑾ArrayDeque有三个构造函数来初始化,除了无参的构造函数使用了默认容量,其它两个构造函数会通过allocateElements函数来计算初始容量

  ⑿数组的大小很特殊,大小必为的n次方(^n。下面我们看看allocateElements方法

  ⒀对于一个小于^的值,经过五次右移和位或操作后,可以得到一个^k-的值。最后再将这个值+,得到^k。通过这个方法,可以将一个任意的初始值转化为^n的值.()不过有一点不足在于,如果本身传进来的值就是^n的值,那么经过转化会变成^(n+),所以我们在不用刻意去传入^n的值。()如果传入的值大于等于^,那么经过转化会变成负值,即《,此时会把初始值设置为^,即最大的容量只有^

  ⒁在ArrayDeque中,数组是作为环形来使用的,正常情况下在末尾添加元素后,tail=tail+是要判断是否越界,如果越界,会变为从索引开始。参考如下图片,当H添加到索引后,tail值会+,此时tail=,但是越界了,所以应该将tail设置为。

  ⒂我们看看tail=(tail+)&(elements.length-)的正确性:

  ⒃所以当tail+《=length-,此时数组并没有越界,(tail+)&(elements.length-)后得到的还是tail+。如果tail+=length,此时数组越界了,(tail+)&(elements.length-)后得到。

  ⒄所以通过(tail+)&(elements.length-)可以跳过条件判断在环形数组中获取正确的索引值,然后再判断新的tail是否等于head,如果结果为true,那么数组已经满了,需要扩容,即doubleCapacity()。

  ⒅原理和addLast相同

  ⒆无论是从头部还是从尾部添加元素,都会判断tail==head,如果两个索引相遇,说明数组空间已满,需要扩容操作.

  ⒇ArrayDeque支持从头尾两端移除元素

  ⒈在上文中,我们讲了怎么去实现一个ArrayDeque,但Java标准库中已经为我们准备好了,我们只需按规则使用就行

  ⒉add()-将指定的元素插入ArrayDeque双端队列的末尾addFirst()-在ArrayDeque双端队列的开头,插入指定的元素addLast()-在ArrayDeque双端队列的末尾插入指定的内容(等效于add()注意:如果ArrayDeque双端队列已满,则所有这些方法add(),addFirst()和addLast()都会引发IllegalStateException

  ⒊offer()-将指定的元素插入ArrayDeque双端队列的末尾offerFirst()-在ArrayDeque双端队列的开始处插入指定的元素offerLast()-将指定的元素插入ArrayDeque双端队列的末尾注意:offer(),offerFirst()并offerLast()返回true是否成功插入元素;否则,返回。如果ArrayDeque双端队列已满,则这些方法返回false。

  ⒋getFirst()-返回ArrayDeque双端队列的第一个元素getLast()-返回ArrayDeque双端队列的最后一个元素注:如果ArrayDeque双端队列为空,getFirst()和getLast()抛出NoSuchElementException。

  ⒌peek()-返回ArrayDeque双端队列的第一个元素peekFirst()-返回ArrayDeque双端队列的第一个元素(等效于peek()peekLast()-返回ArrayDeque双端队列的最后一个元素注:如果ArrayDeque双端队列为空,peek(),peekFirst()和getLast()抛出NoSuchElementException

  ⒍remove()-返回并从ArrayDeque双端队列的第一个元素中删除一个元素remove(element)-返回并从ArrayDeque双端队列的头部删除指定的元素removeFirst()-返回并从ArrayDeque双端队列中删除第一个元素(等效于remove()removeLast()-返回并从ArrayDeque双端队列中删除最后一个元素注意:如果数组双端队列为空,则remove(),removeFirst()和removeLast()方法将引发异常。另外,如果找不到元素,则remove(element)会引发异常。

  ⒎poll()-返回并删除ArrayDeque双端队列的第一个元素pollFirst()-返回并删除ArrayDeque双端队列的第一个元素(等效于poll()pollLast()-返回并删除ArrayDeque双端队列的最后一个元素注意:如果ArrayDeque双端队列为空,则如果找不到该元素,则poll(),pollFirst()和pollLast()返回null。

  ⒏iterator()-返回可用于遍历ArrayDeque双端队列的迭代器descendingIterator()-返回一个迭代器,该迭代器可用于以相反顺序遍历ArrayDeque双端队列注:为了使用这些方法,我们必须导入java.util.Iterator包。使用迭代器的方法如下

  ⒐element()-从ArrayDeque双端队列的头部返回一个元素。contains(element)-在ArrayDeque双端队列中搜索指定的元素。如果找到该元素,则返回true,否则返回false。size()-返回ArrayDeque双端队列的长度。toArray()-将ArrayDeque双端队列转换为数组并返回。clone()-创建ArrayDeque双端队列的副本并返回它。

  ⒑push()-在堆栈顶部添加一个元素peek()-从堆栈顶部返回一个元素pop()-返回并从堆栈顶部删除元素

  ⒒Java中哪些类实现了Iterator接口

  ⒓是java.lang的接口Iterable吧所有已知子接口:BeanContext,BeanContextServices,BlockingDeque《E》,BlockingQueue《E》,Collection《E》,Deque《E》,List《E》,NavigableSet《E》,Queue《E》,Set《E》,SortedSet《E》所有已知实现类:AbstractCollection,AbstractList,AbstractQueue,AbstractSequentialList,AbstractSet,ArrayBlockingQueue,ArrayDeque,ArrayList,AttributeList,BatchUpdateException,BeanContextServicesSupport,BeanContextSupport,ConcurrentLinkedQueue,ConcurrentSkipListSet,CopyOnWriteArrayList,CopyOnWriteArraySet,DataTruncation,DelayQueue,EnumSet,HashSet,JobStateReasons,LinkedBlockingDeque,LinkedBlockingQueue,LinkedHashSet,LinkedList,PriorityBlockingQueue,PriorityQueue,RoleList,RoleUnresolvedList,RowSetWarning,SerialException,ServiceLoader,SQLClientInfoException,SQLDataException,SQLException,SQLFeatureNotSupportedException,SQLIntegrityConstraintViolationException,SQLInvalidAuthorizationSpecException,SQLNonTransientConnectionException,SQLNonTransientException,SQLRecoverableException,SQLSyntaxErrorException,SQLTimeoutException,SQLTransactionRollbackException,SQLTransientConnectionException,SQLTransientException,SQLWarning,Stack,SyncFactoryException,SynchronousQueue,SyncProviderException,TreeSet,Vector

  ⒔下列算法的功能是比较两个链串的大小,其返回值为:请在空白处填入适当的内容

  ⒕s=s-》nexts=s-》nextS!=nullS!=nullReturn

  ⒖如何判断arraydeque的堆头

  ⒗publicinterfaceDeque《E》extendsQueue《E》{}两个常用的实现类:publilassArrayDeque《E》extendsAbstractCollection《E》implementsDeque《E》,Cloneable,Serializable{}publilassLinkedList《E》extendsAbstractSequentialList《E》implementsList《E》,Deque《E》,Cloneable,Java.io.Serializable常用操作voidaddFirst(Ee)队首插入元素。voidaddLast(Ee);队尾插入元素。EgetFirst();获得队首元素。EgetLast();获得队尾元素。EremoveFirst();移除队首元素并返回其值。EremoveLast();移除队尾元素并返回其值。publilassDequeueTest{publicstaticvoidmain(Stringargs){Deque《Integer》dq=newArrayDeque《Integer》();dq.addFirst();dq.addLast();dq.addFirst();dq.addLast();while(!dq.isEmpty()){System.out.println(dq.getFirst());dq.removeFirst();}}}/**/

  ⒘集合可以说是学习Java中最重要的一块知识点了,无论做任何业务系统,集合总是最为基础的那块API。我第一次接触集合,是在我大三的时候,那时候去面试,面试官问我:你了解过集合吗?可惜那时候没什么项目经验,所以基本没有了解过,因此也错失了机会。到了现在,我已经工作了年了,也做过了大大小小十几个项目。这些项目中有简单的SSH项目,也有分布式高并发的复杂项目。无论在哪个项目中,关于集合的时候是必不可少的。但我现在慢慢回顾过去做的项目,我发现自己使用到的集合还是比较少,基本上只有:ArrayList、HashSet、HashMap这几个。但当我开始深入去了解JDK集合的整个体系时,我发现之前的我了解得确实非常浅显。例如关于List的实现有ArrayList、LinkedList、Vector、Stack这四种实现,但我们很多时候只是直接使用ArrayList,而不是根据场景去选择。.学习集合源码,能够让我们使用得更加准确。当我们深入学习了源码之后,我们就能够了解其特性,从而能够根据我们的使用场景去做出更好的选择,从而让我们的代码运行效率更高。我们举一个最简单的例子——ArrayList和LinkedList。它们两者底层采用了完全不同的实现方式,ArrayList使用数组实现,而LinkedList则使用链表实现。这使得ArrayList的读取效率高,而LinkedList的读取效率低。但因为LinkedList采用链表实现,所以其增加和删除比较方便,而ArrayList则比较麻烦。所以ArrayList比较适合用于读场合较多的情况,而LinkedList比较适合用于增加、删除较多的场景。我们来看另外一个例子——HashMap和TreeMap。乍看之下,他们都是Map集合的实现,但是它们内部有着截然不同的实现。HashMap是Map接口的哈希实现,其内部使用了链表和红黑树实现。而TreeMap是Map接口的有序实现,其内部使用了红黑树实现。所以HashMap一般用来存储key、value的实现,而TreeMap常用存储需要排序的元素。除了我们举的这两个例子之外,还有许多这样的例子,比如:HashMap与LinkedHashMap的区别,HashMap与WeakHashMap的区别,LinkedList与ArrayDeque的区别。.学习集合源码,让我们学习经典的设计方式。在集合的整个架构设计中,其类继承体系非常简单,但是却很经典。例如:Collection接口设计了集合通用的操作,每个集合类型都有对应的接口(List、Set、Map,每个集合类型都有对应的抽象实现(AbstractList、AbstractSet、AbstractMap等。当我们阅读这些源码的时候,这种设计方式都会潜移默化地影响我们。当我们之后自己设计一个框架的时候,我们就会不知不觉地用上去。所有的创新都是从模仿开始的,所以阅读优秀的集合源码很重要。.帮助通过面试,获得更高的薪酬。现在关于集合的原理是Java工程师面试的家常菜,几乎每一个企业的面试都会问到。如果你连这块东西都没搞清楚,那么你就不需要聊其他了,直接被干掉。而如果你能将整个Java集合体系清晰地说出去,并且举一反三地对比,那么你就比其他人优秀了。.学习经典的数据结构。还记得大学在学习数据结构的时候,我们都是从理论上去记忆。但是当我看完集合源码之后,我忽然发现——JDK集合源码简直就是数据结构的最佳实践呀!数据结构中最为基础的几个结构为:顺序表、单链表、双向链表、队列、栈、二叉堆、红黑树、哈希表。这些所有的实现都能在JDK集合的实现中找到。例如:ArrayList就是顺序表的实现,LinkedList就是双向链表的实现,Stack就是栈的实现,HashMap就是哈希表的实现,TreeMap就是红黑树的实现,PriorityQueue就是二叉堆的实现。.所有技术的基础集合源码可以说是JDK所有源码中最为简单的一块了,而且也是其他所有源码的基础。例如线程池的源码中也大量使用了阻塞队列,如果你连集合源码都搞不懂,那么线程池的源码你也肯定看不懂的。而如果线程池源码看不懂,那么你ty的源码也看不懂的。ty源码看不懂,那么dubbo的源码也是看不懂的。看明白了么?这些技术都是一换扣着一换的。如果你想要后续学习更加快速,那么你就必须把最基础的东西学明白了。如果连最基础的东西都没学明白,就直接去学其他更复杂的东西,最后只会越来越难,最终逃脱不了放弃的命运。读到了这里,我相信你也对集合的重要性有了不一样的认识。那么接下来一段时间,就让我和你一起来深入学学集合源码吧。如果觉得读了有用,那么请给我一个赞吧。你们的赞是我继续写下去的动力!

  ⒙ArrayDeque:LinkedList

  ⒚ArrayDeque和LinkedList都实现了Deque双端队,从两端取值/添加/删除.ArrayDeque,内部有个成员,object数组,index头,index尾Objectelements保存元素inthead,标记object数组的index零inttail标记object数组的indexlast=length-依靠两个下标索引Object数组实现队尾/对头的添加删除等.LinkedList,内部有成员双向链表Link?voidLink,通过链表实现在对头队尾的添加删除等动作.

您可能感兴趣的文章:

相关文章