面试总结

一、数据结构与算法
    1.二叉树前序、中序、后续遍历方式(递归以及非递归)
    2.二叉树的深度以及广度遍历方式
    3.二叉树遍历情况中所有连续节点的最大的值
    4.求数组所有可能的子数组
    5.给定一个数,求一个有序数组的两个数的和满足这个数(可以拓展一下变成两个无序的数组)
    6.求一个数组的第二大值
    7.大文件(不能加载进内存)的排序问题
    8.快速排序、归并排序、冒泡排序、选择排序(复杂度分别是多少)
    9.hash、HashMap、索引(b tree/ b+ tree) 时间复杂度?
        hash表时间复杂度为O(1)
        HashMap在最理想的情况下,时间复杂度为O(1)(此情况下,hash表没有数据冲突),
        否则时间复杂度为O(n)(此情况下,主要是查询链表用时)
        二叉查找树查询的时间复杂度是O(logN)
    
二、Java基础
    1.string、stringbulider、stringbuffer的区别
    2.ArrayList、LinkedList、Vector区别
    3.Class.forName和classloader的区别
        Java中Class.forName和classloader都可以用来对类进行加载。
        Class.forName除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
        而classloader只将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
        
    4.Java设计模式
        23种设计模式。
        设计模式(Design pattern):是针对设计问题的通用解决方案。
        使用设计模式:可以把它应用到特定的应用中,用于解决相似的问题。
        使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
        
    5.mysql索引的好处以及对应的数据结构
        创建索引可以大大提高系统的性能,优点:
        第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
        第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
        第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
        第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
        第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
        mysql索引的数据结构是B+树
        
    6.CocurrentHashMap底层结构
        CocurrentHashMap是由Segment数组和HashEntry数组组成。Segment是重入锁(ReentrantLock),作为一个数据段竞争锁,每个HashEntry一个链表结构的元素,
        利用Hash算法得到索引确定归属的数据段,也就是对应到在修改时需要竞争获取的锁。
        锁分段技术就是对数据集进行分段,每段竞争一把锁,不同数据段的数据不存在锁竞争,从而有效提高 高并发访问效率。
        CocurrentHashMap在get方法是无需加锁的,因为用到的共享变量都采用volatile关键字修饰,巴证共享变量在线程之间的可见性(每次读取都先同步缓存和内存,直接从内存中获取值,
        虽然不是原子操作,但根据JAVA内存模型的happen before原则,对volatile字段的写入操作先于读操作,
        能够保证不会脏读),volatile为了让变量提供线程之间的内存可见性,会禁止程序执行结果的重排序(导致缓存优化的效果降低)
        
    7.ThreadLocal底层结构
    
    8.HashMap底层结构
    
    9.Java解决Hash冲突的四种方式
    
    10.JVM的具体细节(内存结构、GC算法、GC工具、引用方式等)
    
    三、大数据框架
        1.hadoop
            HDFS、Yarn、MapReduce原理以及执行过程,特别是MapReduce最好能结合源码说一些
            
        2.Flume+Kafka一个实时流采集框架
            熟悉flume的工作流程,source、channel、sink、拦截器、以及自定义source、自定义sink、自定义拦截器
            熟悉kafka的主要组件(broker节点、副本、partition)、kafka工作原理(kaffka生产消费模型)、kafka跟其他MQ
            对比的一个情况、kafka怎么保证三种消费状态(at most once、at least once、at exactlt once)
            结合kafka具体可能出现的网络瓶颈、zookeeper的GC情况
            
        3.storm
            storm具体结构(spout + bolt)、storm调优具体方式、storm的如何保证高可靠、ack确认机制、storm的雪崩解决办法、
            strom计算pv、uv 、dv的具体方式(最好别采用set的方式)
            
        4.Hbase
            hbase具体架构,(架构图),hbase读写过程(着重强调bulkload)、hbase的表以及rowkey设计(预防热点问题)、hbase热点
            问题带来的危害
            
        5.redis
            redis使用方式、redis数据结构类型、redis的bitmap结构、redis持久化、redis的淘汰机制、redis的缓存击穿
            
        6.spark
            spark提交一个任务的执行过程(job划分、stage划分、task生成、资源调度、shuffle详细过程等)、spark core的一些经典编程(
            spark core的二次排序,spark core的分组求top N)、spark 的优化、spark sql的堆外内存溢出情况、spark的优化(大概七八个)
    
    四、项目具体问题
        1.集群资源情况
        
        2.数据量
        
        3.具体项目(以及具体项目遇到的问题,解决方案)
        
    五、其他
         1.rpc框架通信协议
         
         2.谈自己对一些具体问题的看法(包括产品设计、分析)
       

  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页
评论

打赏作者

autumnLemon

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值