百度Java电面一面面经

百度Java电面一面面经


最近开始刷面经。

首先声明这个面经不是我的,是牛客上的大佬发出来的,然后没有答案,我把答案整理出来,因为很多你看上去知道,但真要你说就不知道如何开口,我先整理出答案,如果下次遇到就可以有思路去回答,这里面的答案只是自己的看法,具体的内容在其他分类博客也有总结。

面经原地址:百度Java电面一面

如果需要看面经,牛客有个帖子也整理了不同方法的面经—— 2020秋招面经大汇总!(岗位划分)
在这里插入图片描述


目录

  1. 自我介绍
  2. 介绍一下项目
  3. 讲解一下GC过程,包括GC算法、常用的GC收集器工作原理,对象分配与晋身条件等等,相关的都一把梭。
  4. 介绍一下Java集合,ArrayList与LinkedList有什么区别,分别有什么适用场景(高频考点)
  5. HashMap与HashSet有什么区别,两者在查询某个值的效率上是否有区别
  6. ConcurrentHashMap原理,与HashMap有什么区别(高频考点)
  7. (1)volatile原理
    (2)volatile修饰long变量,修饰一个数组能否保证内存可见性
  8. (1)Mysql索引的底层实现原理。
    (2)(a,b,c)复合索引,(b,c)能不能用到索引
    (3)Mysql为什么要遵循最左匹配原则,可以从索引的底层实现来考虑。
  9. 两道算法题,口述思路即可。
    (1)求二叉树的高度与宽度
    (2)求一个无序数组中是否存在两个值相加等于给定值,然后是否存在3个值呢–twoSum, threeSum问题

1. 自我介绍

xxx


2. 介绍一下项目

xxx


3. 讲解一下GC过程,包括GC算法、常用的GC收集器工作原理,对象分配与晋身条件等等,相关的都一把梭。

GC的过程:
  1. 分代回收器有两个分区,分别为新生区和老年区,新生代和老年代的默认的空间占比为1:2;

  2. 新生代使用的是复制算法,新生代里有3个分区,Eden,To survivor,From survivor,默认占比为8:1:1,当 Eden 区的空间用完时,程序又需要创建对象,JVM 的垃圾收回器就会执行 minor GC。

    • 把 Eden + From 区存活的对象放到 to 区;
    • 清空 Eden + from 区;
    • From 区和 To 区交换,From 区变为 To 区,To 区变为 From 区。
  3. 每次 From 区 和 To 区移动时存活的对象,年龄就 +1,当年龄到达 15(默认为15),升级为老年代,大对象也会直接进入老年代。

  4. 老年代空间占比达到某个值之后就会触发全局垃圾回收,一般是使用标记整理算法。如果老年代执行 full gc 依然无法进行对象的保存,就会产生 OOM 异常。

  5. 循环往复就构成了整个分代垃圾收集器的执行过程。

GC的算法
  1. 引用计数法:每个对象维护一个引用计数器,当对象被引用时计数器+1,当引用的对象被释放后计数器 -1,当计数器为 0 时就会被回收。缺点是

    1. 每次对对象赋值时均要维护引用计数器,且计数器本身也有一定的消耗。
    2. 较难处理循环引用的问题。
  2. 复制算法:按照容量划分两个大小相同的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存利用率不高,只有原来的一半。

  3. 标记-清除算法:从根集合开始扫描,对存活的对象进行标记。扫描整个内存空间,回收未标记的对象。缺点:

    1. 两次扫描,耗时严重。
    2. 会产生内存碎片。
  4. 标记-整理算法:从根集合开始扫描,对存活的对象进行标记。再次扫描,并往一端滑动存活的对象。优点:没有内存碎片。缺点:需要移动对象的成本高。


4. 介绍一下Java集合,ArrayList与LinkedList有什么区别,分别有什么适用场景(高频考点)

ArrayList与LinkedList区别
  1. 是否保证线程安全:ArrayList 和 LinkedList 都是不同步的,不保证线程安全。

  2. 底层数据结构:ArrayList 是基于动态数组的数据结构,实现了 list 接口。动态数组即如果没有指定数组的大小,则默认申请大小为10 的数组,当元素个数增加,数据无法存储,系统就会申请一个长度为当前长度的1.5 倍的数组,然后把之前的数据拷贝到新建的数组中。LinkedList底层使用的是双向链表数据结构(JDK1.6之前为循环双向链表,1.7 之后取消的循环)

  3. 插入和删除是否受元素位置的影响:

    1. ArrayList 采用数组存储,所以插入和删除的时间复杂度受元素位置的影响。比如添加到数组的指定位置,可能就会移动大量的数组元素,并可能触发扩容机制;如果是删除数组指定位置的元素,那么可能会移动大量的元素;AarrayList 里面的删除元素,就是将该位置置为null。
    2. LinkedList 采用链表存储,所以插入,删除元素的时间复杂度不受元素位置的影响,都是近似为O(1),而数组的时间复杂度近似为O(n);
  4. 是否支持快速随机访问:LinkedList 不支持高效的随机元素访问,而 ArrayList支持快速随机访问。快速随机访问就是通过元素的序号快速获取元素对象。

  5. 内存空间占用:ArrayList 的空间浪费主要体现在 list列表的尾部会预留一定的容量空间,而 LinkedList的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间(因为要存放直接后继和直接前驱以及数据)

适用场景
  1. 如果应用程序对数据有较多的随机访问,ArrayList要优于LinkedList,因为LinedList要移动指针。
  2. 如果应用程序对数据更多的是插入或者删除操作,较少读取操作,LinkedList 要优于 ArrayList,因为ArrayList 插入或者删除数据后要移动数据。

具体可以参考博客:ArrayList与LinkedList区别源码分析


5. HashMap与HashSet有什么区别,两者在查询某个值的效率上是否有区别

HashMapHashSet
接口实现HashMap实现了Map接口HashSet实现了Set接口
存储对象HashMap存储键值对HashSet仅仅存储对象,而且不允许集合中有重复的值
添加方法HashMap使用put()方法将元素放入map中HashSet使用add() 方法将元素放入set中
hashCode值计算HashMap使用键对象来计算hashCode值HashSet使用成员对象来计算hashCode值,对于两个对象来说hashCode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同,则返回false
获取对象速度HashMap比较快,因为使用唯一的键来获取对象HashSet较HashMap来说比较慢

ConcurrentHashMap原理,与HashMap有什么区别(高频考点)

ConcurrentHashMap的数据结构已经接近HashMap,相对而言,ConcurrentHashMap只是增加了同步的操作来控制并发,从JDK1.7 版本的 ReentrantLock+Segment+HashEntry,到JDK1.8版本中的synchronized + CAS + HashEntry+红黑树。

  1. 数据结构:取消了Segment分段锁的数据结构,取而代之的是 数组+链表+红黑树的结构。
  2. 保证线程安全机制:JDK1.7采用segment的分段锁机制实现线程安全,其中segment继承自ReentrantLock。JDK1.8采用 CAS+synchronized来保证线程安全。
  3. 锁的粒度:JDK1.7对需要进行数据操作的segment 加锁,JDK1.8调整为对每个数组元素加锁(Node)
  4. 链表转化为红黑树:定位节点的hash算法简化会带来弊端,Hash冲突加剧,因此在链表节点数量大于8时,会将链表转化为红黑树进行存储。
  5. 查询时间复杂度:从原来的遍历链表O(n),变成遍历红黑树O(logN)

HashMap的特点之前详见:HashMap源码解析(JDK1.8)


7. Volatile原理

1. volatile原理
  1. 保证可见性
  2. 不保证原子性
  3. 禁止指令重排

详细总结见博客:Java多线程之volatile详解

2. volatile修饰long变量,修饰一个数组能否保证内存可见性

volatile 修饰long遍历,修饰一个数组都可以保证可见性。


8. MySQL相关

1)Mysql索引的底层实现原理。

索引是帮助MySQL高效获取数据的排好序的数据结构。

(2)(a,b,c)复合索引,(b,c)能不能用到索引
(3)Mysql为什么要遵循最左匹配原则,可以从索引的底层实现来考虑。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值