面试被打脸,数据结构底层都不知道么--回去等通知吧

这篇具有很好参考价值的文章主要介绍了面试被打脸,数据结构底层都不知道么--回去等通知吧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据结构之常见的8种数据结构:

-数组Array

-链表 Linked List

-堆 heap

-栈 stack

-队列 Queue

-树 Tree

-散列表 Hash

-图 Graph

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

数据结构-链表篇

Linklist定义:


-是一种线性表,并不会按线性的顺序存储数据,即逻辑上相邻,物理上不一定相邻的元素。通过指针域来寻找对应的元素。

Linklist优缺点:

优点:
-插入、删除速度快

-灵活分配结点空间

缺点:
-查询速度慢

通过Linklist常用方法来深入底层原理


-add(E e)

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

-add(int index, E element)

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

-remove(Obeject o)

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

-remove(int index)

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

-ListIterator正向遍历

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

-反向遍历

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

总结:


-插入、删除速度快是因为只要通过前后指针就能插入或者删除到链表中,不需要移动其它元素,插入头尾节点更快,因为Node结构体中保存了头尾指针。

-查询速度慢是因为,查询先通过右位移运算来判断对链表是前半部分遍历还是后半部分遍历,剩下的半部分遍历则是一个个节点遍历,头尾查询快,因为保存了头尾指针。
 

数据结构--数组篇
数组的定义:


-申请一块连续的内存空间来存储相同类型数据的集合

-数组存储的是对象的引用而非是对象本身

数组的优缺点:


优点:查询速度快(O(1)复杂度),因为它的存储是连续的内存空间,查找元素=首地址 + 每个元素所分配的空间*下标

从cpu的读取:cpu在读取数组的时候,可以借助缓存机制预读数组的数据,cpu在读取内存的时候会把一块连续的内存空间读入,当进行遍历时,直接命中。而链表是跳跃式的地址,在缓存中命中的概率低,就要跑到内存中去读取数据,缓存的速度远大于内存的读取速度。

缺点:插入 、删除速度慢,因为需要移动该元素后面的所有元素位置

数组的使用场景:


-适合查询多,插入、删除少的场景(整体上来说)

通过数组方法来深入底层原理


ArrayList方法中的常用方法
-add(E e)方法

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展
流程图:

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展
remove(int index)方法:

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

remove(Object o)方法

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

remove注意:remove(Object o)方法使用了2个对null跟非null分别使用了==跟equals做了等值比较,找到元素对应的索引位置后再删除与remove(int index)方法步骤基本一样

Iterator遍历方法

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

迭代注意:迭代过程中有2次的ConcurrentModification检验,一次是2个记录修改次参数expectedModCount = modCount等值校验。二次是 i >= elementData.length,并发过程中多次调用next方法。

Iterator的remove方法

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

关于System.arraycopy,Array.copyof区别:
-System.arraycopy(Object src, int srcPos, Object dest, int destPos,int length)

有5个参数

src :原数组

srcPos:原数组开始元素拷贝的索引位置

dest:目标数组

destPos:在目标数组的索引位置开始拷贝

length:拷贝的数组长度

-Arraycopyof 底层调用的也是Native方法的System.arraycopy

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展
面试点提问:几种删除方式有什么区别


重点关注:expectedModCount = modCount;ConcurrentModificationException

for循环删除跟Iterator删除方式有什么不同?

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

Iterator方法:

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展

正序for循环则直接调用remove(Object)或者remove(index)方法,修改了modCount++的值,但是并没有走checkForComodification()检验,该方法只针对了实现了Iterator<E>的类,想要正确删除元素请使用倒序删除

以上2个方法都可以直接删除元素不会报错,正序for循环不保证结果正确性

可以用foreach加强循环删除么?
a,foreach底层的实现原理就是通过Iterator迭代来实现的。所以会存在修改次数跟预期值修改值的比较判断。

b,而foreach循环在删除元素的时候走的是fastRemove()方法,

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展
c,只增加了modCount++

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展
d,并没有expectedModCount = modCount赋值语句,在下一次的循环就会报错

面试被打脸,数据结构底层都不知道么--回去等通知吧,面试题,java知识,面试,数据结构,职场和发展
综上所述:使用Iterator跟for循环是可以成功删除元素的,foreach循环则不行。checkForComodification()检验,该方法只针对了实现了Iterator<E>的类,而Iterator跟foreach底层实现都是依赖这个接口。for循环则不依赖

注意上面的Demo只是说删除元素时会不会报错,并不是说上面几种方式都能正确删除完全,使用for循环保证正取删除元素可以使用倒序的方式,或者使用Iterator方式(推荐)。
 文章来源地址https://www.toymoban.com/news/detail-689947.html

到了这里,关于面试被打脸,数据结构底层都不知道么--回去等通知吧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis底层数据结构

    SDS全称是Simple Dynamic String,具有如下显著的特点: 常数复杂度获取字符串长度:C语言获取一个字符串的长度需要遍历整个字符串时间复杂度为O(N),而SDS在属性len中记录了字符串长度,获取字符串长度的时间复杂度为O(1)。 杜绝缓冲区溢出:C字符串在执行拼接字符串时,如果

    2024年02月13日
    浏览(46)
  • MySQL底层数据结构

    一个sql语句在mysql中究竟是如何运行的?又应该通过怎样的方式去查找我们要找的数据?这里就涉及到几种存储数据的算法; 可以做索引的数据结构有数组、链表、二叉搜索树和B树(B-树、B+树)。 2.1、HASH 由于HASH查询和写入的时间复杂度是O(1),这意味着只需要一次hash计算就

    2024年02月08日
    浏览(47)
  • Redis - 底层数据结构

    Redis 的底层数据结构主要以下几种: SDS(Simple Dynamic String, 简单动态字符串) ZipList(压缩列表) QuickList(快表) Dict(字典) IntSet(整数集合) ZSkipList(跳跃表) 在 Redis 中,并不会直接使用 C 语言自带的字符串结构作为实际的存储结构,而只是将字符串作为字面量使用,大多数情况使用自

    2023年04月12日
    浏览(44)
  • redis 底层数据结构详解

    目录   1.字符串 1.1 SDS定义 1.2 SDS1好处 2.列表 2.1 void 实现多态 3 字典 3.1   底层实现是hash表 3.2 字典结构 3.3 哈希算法 3.3.1 rehash 3.3.2 rehash的触发时机 3.3.3 渐进式rehash 扩展或收缩哈希表需要将ht[0]里面的所有键值对rehash到ht[1]里面,但是,这个rehash动作并不是一次性、集中式

    2023年04月09日
    浏览(48)
  • java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层

    对于数据结构我这边只告诉你右边框框里的 栈的特点:后进先出,先进后出,入栈也成为压栈,出栈也成为弹栈 栈就像一个弹夹 队列先进先出后进后出 队列像排队 链表查询满 但是增删快(相对于数组而言) 拓展:还有一个双向链表 他在查询元素的时候更快些,因为他在拿到一个元素

    2024年02月05日
    浏览(48)
  • Redis - 数据类型映射底层结构

    从数据类型上体现就是,同一个数据类型,在不同的情况下会使用不同的编码类型,底层所使用的的数据结构也不相同。 字符串对象的编码可以是 int 、 raw 和 embstr 三者之一。 embstr 编码是专门用于保存简短字符串的一种优化编码方式,与 raw 编码会调用两次内存分配函数分

    2023年04月21日
    浏览(38)
  • JAVASE->数据结构|顺序表底层逻辑

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 目标: 1. 什么是 List 2. List 常见接口介绍 3. List 的使用 本章主要学习顺序表底层逻辑,大致是一样的,不差多少。 在集合框架中, List 是一个接口,继承自 Co

    2024年04月29日
    浏览(38)
  • InnoDB底层的一些主要数据结构

    MySQL的InnoDB存储引擎使用了一些关键的底层数据结构来优化数据的存储、索引和查询。以下是InnoDB底层的一些主要数据结构: 1. **B+树索引**:    - InnoDB的主要数据结构是B+树(平衡树的一种变体),用于存储表数据和索引。    - 每个InnoDB表都有一个主键索引(如果没有显式

    2024年02月01日
    浏览(44)
  • 关于对索引底层数据结构的理解

    目录 我们在谈论索引底层的数据结构之前,我们不妨先想一下索引是什么以及索引存在的作用 Hash 二叉搜索树与二叉平衡树 多叉平衡查找树(B树) B+树 索引:是一种特殊的文件,包含着对数据库表中所有记录的引用指针,而其的作用也体现的很明确了,我们通过创建索引来

    2024年02月09日
    浏览(45)
  • 源码分析——ConcurrentHashMap源码+底层数据结构分析

    1. 存储结构 Java 7 中 ConcurrentHashMap 的存储结构如上图,ConcurrnetHashMap 由很多个 Segment 组合,而每一个 Segment 是一个类似于 HashMap 的结构,所以每一个 HashMap 的内部可以进行扩容。但是 Segment 的个数一旦 初始化就不能改变 ,默认 Segment 的个数是 16 个,你也可以认为 ConcurrentH

    2024年02月13日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包