首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java基础

*负载因子就要扩容 创建一个新数组,容量是之前的2倍,然后将之前的元素拷贝到新数组中. 1.8之前需要重新计算每个元素在数组中的下标,即重新计算hash; 1.8中只需要看看原来的hash值新增的那个bit...它是HashMap的子类,在HashMap数据结构的基础上,还维护着一个双向链表链接所有元素,这个链表定义了迭代顺序,同HashMap一样,key只可以有一个null,value可以有多个null 支持两种排序...即通过get方法访问的元素,会放到链表尾部,也就是按照了访问时间进行排序,基于这个特性和 添加元素:先添加到HashMap数据结构里,然后维护双向链表的关系,添加到链表尾部 删除元素:先从HashMap...数据结构里删除,同时将其从链表里面删除 TreeMap LinkedHashMap虽然可以根据插入顺序和访问顺序排序,但是无法自定义排序规则,而TreeMap可以 实现基于红黑树,key不能为null,...length:复制的长度; src 和 dest 必须是同类型或者可以进行转换类型的数组 LinkedList 双向链表,插入和删除操作比 ArrayList 更加高效,随机访问的效率要比 ArrayList

59910

剖析面试最常见问题之Java集合框架(1)

说说 List,Set,Map 三者的区别? List(对付顺序的好帮手):存储的元素是有序的、可重复的。 Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。...集合框架底层数据结构总结 List Arraylist:Object[]数组 Vector:Object[]数组 LinkedList:双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)...另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。...Hashtable:数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的 TreeMap:红黑树(自平衡的排序二叉树) 如何选用集合?...当我们需要保存一组类型相同的数据的时候,我们应该是用一个容器来保存,这个容器就是数组,但是,使用数组存储对象具有一定的弊端, 因为我们在实际开发中,存储的数据的类型是多种多样的,于是,就出现了“集合”,

51740
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java集合框架常见面试题

    另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。...当我们需要保存一组类型相同的数据的时候,我们应该是用一个容器来保存,这个容器就是数组,但是,使用数组存储对象具有一定的弊端, 因为我们在实际开发中,存储的数据的类型是多种多样的,于是,就出现了“集合”,...注意双向链表和双向循环链表的区别,下面有介绍到!) 插入和删除是否受元素位置的影响: ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。...值; LinkedHashSet 是 HashSet 的子类,能够按照添加的顺序遍历; TreeSet 底层使用红黑树,能够按照添加元素的顺序进行遍历,排序的方式有自然排序和定制排序。...,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。

    64221

    经典数据结构和算法回顾

    链表是个很基础的东西,后面一些复杂的算法或数据结构的本质也是一个链表。链表和顺序表(也就是数组)都可以再进一步抽象成更复杂的数据结构。 比如队列和栈,不过是在链表或顺序表的基础上限制单端操作而已。...首先是较为简单的BF算法,这种算法原理非常简单,比如连个串a(主串)和b(模式串),首先将a1和b1进行比较,如果相同,则将b2与a2进行比较,如果还相同,继续拿a3与b3比,直到b串匹配完,怎匹配完成...排序算法 冒泡排序 以升序为例,冒泡排序每次扫描数组,将逆序修正,每次恰好将最大的元素过五关斩六将推到最后,再在剩余的元素重复操作 ?...可见,冒泡排序的平均时间复杂度为O(n^2) 选择排序 以升序为例,每次扫描数组,找到最小的元素直接挪到第一个来,再在剩余的数组中重复这样的操作 ?...插入排序的平均时间复杂度也是O(n^2) 堆排序 堆排序也是一种插入排序,不过是向二叉堆中插入元素,而且以堆排序中的方式存储二叉堆,则二叉堆必定是一棵完全二叉树,堆排序设计的主要操作就是插入和删除之后的堆调整

    62610

    LinkedHashMap 源码剖析

    //注意这里的recordAccess方法, //如果链表中元素的排序规则是按照插入的先后顺序排序的话,该方法什么也不做, //如果链表中元素的排序规则是按照访问的先后顺序排序的话...都放在双向链表的尾部,这样遍历双向链表时,Entry的输出顺序便和插入的顺序一致,这也是默认的双向链表的存储顺序;当它为true时,表示双向链表中的元素按照访问的先后顺序排列,可以看到,虽然Entry插入链表的顺序依然是按照其...4、注意构造方法,前四个构造方法都将accessOrder设为false,说明默认是按照插入顺序排序的,而第五个构造方法可以自定义传入的accessOrder的值,因此可以指定双向循环链表中元素的排序规则...accessOrder是否为true,如果为true,它会将当前访问的Entry(在这里指put进来的Entry)移动到双向循环链表的尾部,从而实现双向链表中的元素按照访问顺序来排序(最近访问的Entry...//注意这里的recordAccess方法, //如果链表中元素的排序规则是按照插入的先后顺序排序的话,该方法什么也不做, //如果链表中元素的排序规则是按照访问的先后顺序排序的话,则将e移到链表的末尾处

    56010

    C++ STL快速入门

    STL是C++中的标准模板库,本文不深究STL的发展以及版本,以囫囵吞枣的形式讲一些STL组成部分。 STL容器是STL学习中要重点关注的,STL容器有两大类,顺序容器和关联容器。...顺序容器有可变长动态数组vector、双端队列deque、双向链表list,它们之所以被称为顺序容器,是因为元素在容器中的位置同元素的值无关,即容器不是排序的。...list容器也是顺序容器的一种,它是双向链表,所以不支持随机访问(就是不能用数组下标也不能用"的符号),因为元素有前置指针和后置指针,所以在定位到要增加删除位置的地方,增删可以在常量时间内完成...set容器是关联容器的一种,是排序好的集合(元素已经进行了排序),不允许有相同元素。不能直接修改set容器中元素的值。...因为元素被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上进行查找等操作就会得到错误的结果。

    10310

    常见的数据结构

    另一种是使用链表存储线性表的元素,即用一组任意的存储单元存储线性表的数据元素。 数组 数组是一种大小固定的数据结构,连续的内存空间和数据类型。...链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,这些节点不必在内存中相连。...链表的实现还有其它的方式,常见的有循环单链表,双向链表,循环双向链表。循环单链表 主要是链表的最后一个节点指向第一个节点,整体构成一个链环。...树与二叉树 树型结构是一类非常重要的非线性数据结构,其中以树和二叉树最为常用。 树 树 是由n(n>=1)个有限节点组成一个具有层次关系的集合。...拉链法处理哈希冲突:在散列表中,每个桶(bucket)或者槽(slot)会对应一条链表,所有散列值相同的元素会放到相同槽位对应的链表中。 位图 位图法就是bitmap的缩写。

    88130

    数据结构与算法之美读书笔记

    ,有效使用 CPU 的缓存机制,可以很方便的定位元素在 O(1) 的时间通过下标访问到元素插入和删除操作比较低效,平均时间复杂度为 O(n)大小是固定的Hash 表底层可以使用数组存储数据,借助 hash...、删除元素较方便,不是连续存储的数据单向链表、双向链表、循环链表(解决约瑟夫问题)、双向循环链表栈 or 队列栈是一种操作受限的数据结构,只支持入栈和出栈操作。...非叶结点仅具有索引作用,只包含导航信息,不包含实际的值所有的叶子结点和相连的节点使用双向链表相连,便于区间查找和遍历树的遍历方式:根据根节点的遍历时间分为前中后序遍历堆型结构堆是一个完全二叉树堆中的每个节点的值必须大于或者等于每个字节点...(大顶堆)解决问题Top K 问题优先级队列排序我写的博客三个基本属性:时间复杂度、空间复杂度、排序算法的稳定性排序算法的稳定性(排序后相等元素之间原有的先后顺序不变):稳定的排序算法,排序效果可以叠加...:和插入排序的思想类似,不同点在于在没有排序的数组元素中进行交换找到最大或最小元素进行排序查找我写的博客二分查找循环退出条件:low<=highmid 取值:(low+high)/2 因为数据可能比较大会产生溢出

    28520

    数据结构考研面试被问的问题_考研程序设计与数据结构

    、最短路径 链表存储结构和顺序存储结构的区别 顺序存储结构:是以数据元素的相对物理位置来表示数据元素之间的逻辑关系的 链表存储结构 :以指针指向来表示数据元素之间的逻辑关系。...每一个节点包括两个部分,一个用来存储数据,一个存储下一个元素的地址。 判断整个链表是否有环,如何找到这个环 提问:给定一个单链表,只给出头指针h: 1.如果判断是否存在环? 2.如何知道环的长度?...单链表和双链表的区别 单链表 :只能向后访问,不能逆向访问 双链表 :在单链表的基础上添加一个指向前驱结点的指针域,实现双向遍历 简述KMP算法 KMP算法是在简单模式匹配的基础上对串的模式匹配进行优化...这里所移动的位置依靠与NEXT[]数组,求next[]数组的方法是比较前后缀相同元素。...考虑是否重新选取分割位置; 5.分割成两个序列时,只对其中一个递归进去,另一个序列仍可以在这一函数内继续划分,可以显著减小栈的大小(尾递归): 6.将单向扫描改成双向扫描,可以减少划分过程中的交换次数

    64810

    JAVA面试50讲之5:Vector,ArrayList,LinkedList的区别

    EnumSet的集合元素也是有序的,      它们以枚举值在Enum类内的定义顺序来决定集合元素的顺序 2) List List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引...,而是按照队列元素的大小进行重新排序,这点从它的类名也可以      看出来 3.2) Deque Deque接口代表一个"双端队列",双端队列可以同时从两端来添加、删除元素...LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致(注意和TreeMap对所有的key-value...2、Vector具有数组所具有的特性、通过索引支持随机访问、所以通过随机访问Vector中的元素效率非常高、但是执行插入、删除时效率比较地下、具体原因后面有分析。...3、双向链表: 每个链表节点,包含两个引用,一个指向前驱节点,一个指向后驱节点,也就是——双向链表。

    1.9K10

    Java集合详解6:这次,从头到尾带你解读Java中的红黑树

    因此,根据链表中元素的顺序可以将LinkedHashMap分为:保持插入顺序的LinkedHashMap和保持访问顺序的LinkedHashMap,其中LinkedHashMap的默认实现是按插入顺序排序的...但是,不得不说,扩容是一个非常耗时的过程,因为它需要重新计算这些元素在新table数组中的位置并进行复制处理。...所谓重哈希是指重新计算原HashMap中的元素在新table数组中的位置并进行复制处理的过程。...注意这里的recordAccess方法,如果链表中元素的排序规则是按照插入的先后顺序排序的话,该方法什么也不做;如果链表中元素的排序规则是按照访问的先后顺序排序的话,则将e移到链表的末尾处,笔者会在后文专门阐述这个问题...的值为false时,表示双向链表中的元素按照Entry插入LinkedHashMap到中的先后顺序排序,即每次put到LinkedHashMap中的Entry都放在双向链表的尾部,这样遍历双向链表时,Entry

    81900

    深入理解LinkedHashMap和LRU缓存

    基本元素 Entry   LinkedHashMap采用的hash算法和HashMap相同,但是它重新定义了Entry。...但是,不得不说,扩容是一个非常耗时的过程,因为它需要重新计算这些元素在新table数组中的位置并进行复制处理。...所谓重哈希是指重新计算原HashMap中的元素在新table数组中的位置并进行复制处理的过程。...注意这里的recordAccess方法,如果链表中元素的排序规则是按照插入的先后顺序排序的话,该方法什么也不做;如果链表中元素的排序规则是按照访问的先后顺序排序的话,则将e移到链表的末尾处,笔者会在后文专门阐述这个问题...的值为false时,表示双向链表中的元素按照Entry插入LinkedHashMap到中的先后顺序排序,即每次put到LinkedHashMap中的Entry都放在双向链表的尾部,这样遍历双向链表时,Entry

    44630

    Java集合详解5:深入理解LinkedHashMap和LRU缓存

    因此,根据链表中元素的顺序可以将LinkedHashMap分为:保持插入顺序的LinkedHashMap和保持访问顺序的LinkedHashMap,其中LinkedHashMap的默认实现是按插入顺序排序的...但是,不得不说,扩容是一个非常耗时的过程,因为它需要重新计算这些元素在新table数组中的位置并进行复制处理。...所谓重哈希是指重新计算原HashMap中的元素在新table数组中的位置并进行复制处理的过程。...注意这里的recordAccess方法,如果链表中元素的排序规则是按照插入的先后顺序排序的话,该方法什么也不做;如果链表中元素的排序规则是按照访问的先后顺序排序的话,则将e移到链表的末尾处,笔者会在后文专门阐述这个问题...的值为false时,表示双向链表中的元素按照Entry插入LinkedHashMap到中的先后顺序排序,即每次put到LinkedHashMap中的Entry都放在双向链表的尾部,这样遍历双向链表时,Entry

    1.5K00

    老哥,您看我这篇Java集合,还有机会评优吗?

    发送哈希冲突时,HashMap 的解决方法是将相同映射地址的元素连成一条链表,如果链表的长度大于8时,且数组的长度大于64则会转换成红黑树数据结构。...的基础上添加了一条双向链表,默认存储各个元素的插入顺序,但由于这条双向链表,使得 LinkedHashMap 可以实现 LRU缓存淘汰策略,因为我们可以设置这条双向链表按照元素的访问次序进行排序 ?...LinkedHashMap 是 HashMap 的子类,所以它具备 HashMap 的所有特点,其次,它在 HashMap 的基础上维护了一条双向链表,该链表存储了所有元素,默认元素的顺序与插入顺序一致...image.png 而 LinkedHashMap 是采用 HashMap和双向链表实现的,这条双向链表中保存了元素的插入顺序。...而元素的排列顺序有2种,和 TreeMap 相同:自然排序和定制排序,常用的构造方法已经在下面展示出来了,TreeSet 默认按照自然排序,如果需要定制排序,需要传入Comparator。

    56810

    java中的集合

    HashSet 具有以下特点:不能保证元素的排列顺序、HashSet 不是线程安全的、集合元素可以是 null HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等...对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode(Object obj)方法,以实现对象相等规则。即:“相等的对象必须具有相等的散列码”。...Set实现类之二:LinkedHashSet LinkedHashSet 是 HashSet 的子类 LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用双向链表维护元素的次序...Map实现类之二:LinkedHashMap LinkedHashMap 是 HashMap 的子类 在HashMap存储结构的基础上,使用了一对双向链表来记录添加元素的顺序 与LinkedHashSet...reverse(List):反转 List 中元素的顺序 shuffle(List):对 List 集合元素进行随机排序 sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序 sort

    1.6K20

    Java 集合常见知识点&面试题总结(上),2022 最新版!

    另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。...:红黑树(自平衡的排序二叉树) 如何选用集合?...当我们需要保存一组类型相同的数据的时候,我们应该是用一个容器来保存,这个容器就是数组,但是,使用数组存储对象具有一定的弊端, 因为我们在实际开发中,存储的数据的类型是多种多样的,于是,就出现了“集合”,...注意双向链表和双向循环链表的区别,下面有介绍到!) 插入和删除是否受元素位置的影响: ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。...LinkedHashSet 的底层数据结构是链表和哈希表,元素的插入和取出顺序满足 FIFO。TreeSet 底层数据结构是红黑树,元素是有序的,排序的方式有自然排序和定制排序。

    32320

    3分钟速读原著《Java数据结构与算法》(二)

    第三章 简单排序 1.简单排序的种类 1.1 冒泡排序:算法运行速度非常慢,简单来说就是每两个元素都需要执行一次比较,最终得出结果. 1.2 选择排序:选择排序就是把每个数都和其中的一个固定值进行比较...,将被标记的这个元素插入到局部有序的队列当中,因此而不断轮换对应的标记元素,从而完成所有的排序 1.4 对象排序:根据对象当中的某个属性来排序 1.5 单词排序:字母顺序排序,根据字母表的字母顺序进行排序...排序包括比较数组中数据项的关键字和移动响应的数据项 3.3 本章所有的算法的时间负责度都是O(n2),n表示元素个数,O表示复杂度(详见大O表示法) 3.4 不变性指的是算法运行时保持不变的条件 3.5...冒泡排序算法是效率最差的算法,但是最简单 3.6 如果具有相同关键字的数据项,经过排序他它们的顺序保持不变,这笔昂的排序就是稳定的 第四章 栈和队列 一、栈 举例说明:在邮局经常需要去处理邮件,邮件会从下至上堆积成为一个栈...,例如优先级队列就可以使用有序链表来进行实现 5.双端链表 双向链表要区分于双端链表,双端链表是可以找到该节点的上一个节点的,但是双向链表只是能够从链表的两端同时进行遍历,并不能够找到任意一个节点的上一个节点

    56420

    CC++工程师面试题(STL篇)

    顺序容器 容器并非排序的,元素的插入位置同元素的值无关,包含 vector、deque、list vector:动态数组 元素在内存连续存放。随机存取任何元素都能在常数时间完成。...list:双向链表 元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取。 2....list(链表):查找时间复杂度为O(n),因为链表是一种线性结构,需要从头开始顺序查找元素。...vector 和 list 的区别: 底层数据结构: vector: 底层使用动态数组实现。 list: 底层使用双向链表实现。 插入和删除操作: vector: 插入和删除元素效率低。...vector 容器扩容的过程需要经历以下 3 步: 重新在堆上创建更大的动态数组,大小是原来的2倍; 将旧内存空间中的数据,按原有顺序移动到新的内存空间中; 最后将旧的内存空间释放。

    18600

    Java 集合源码详解

    Java 集合源码详解 集合和数组: 数组声明了它容纳的元素的类型,而集合不声明存储Object类型 可以通过泛型进行规范! 数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。...ArrayList 中存储元素的代码中,我们看到,每当向数组中添加元素时 都要去检查添加后元素的个数是否会超出当前数组的长度 如果超出,数组将会进行扩容,以满足添加数据的需求。...因为LinkedList是一个双向链表,next prev 分布表示 item 的下一个元素 和 上一个元素!...,这使得元素看起来以插入顺序保存的。...而且, TreeSet存储的是一组,相同类型的数据… 不像之前, 123 "ABC" new User() 它一次只能存储一组类型… 因为, TreeSet会对存储的值进行排序…类型不同如何排序~

    13410

    JDK容器学习之LinkedHashMap (一):底层存储结构分析

    ,区别是其排序方式依据的是进入Map的先后顺序 LinkedHashMap 继承自 HashMap, 直接看其内部方法,并没有覆盖HashMap的增删查询接口,连tables数组也没有重新覆盖,所以数据结构基本没啥变化...双向链表的维护 既然LinkedHashMap在HashMap的基础上维护了一个双向链表,那么这个链表的增删修改的逻辑是怎样的?...新增一个Map中不存在,但出现hash碰撞 同上 小结 LinkedHashMap 存储结构和 HashMap 相同,依然是数组+链表+红黑树 LinkedHashMap 额外持有一个双向链表,维护插入节点的顺序...最终的数据结构如下图 实际的元素存储与HashMap一致,依然是数组+链表+红黑树的形式 区别在于: 除了维护数组+链表的结构之外,还根据插入Map先后顺序维护了一个双向链表的头尾head,tail...Node基本结构,相比较HashMap而言,还增加了 before,after 两个分别指向双向链表中前后节点的属性 即下图中的双向链表中的节点,其实值依然是下面的数组+链表结构中的元素 ?

    87350
    领券