百度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有什么区别,两者在查询某个值的效率上是否有区别

HashMap HashSet
接口实现 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为什么要遵循最左匹配原则,可以从索引的底层实现来考虑。

百度Java电面一面面经相关推荐

  1. 百度 Java 后端三轮面试题,这些你会吗?

    前面的话 告别了2018 ,也早已正式进入2019 面试一直都是大家关注的热门话题,俗话说"金三银四",如今已经一月份了,三月份还会远么,如果你打算在年后跳槽,那么是时候该着手准备 ...

  2. 通往大神之路,百度Java面试题前200页。

    转载自 通往大神之路,百度Java面试题前200页. 基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 ...

  3. 百度入股电商直播服务商“卡美啦” 备战2020年双11

    10月19日消息,天眼查信息显示,卡美啦运营主体杭州创年网络科技有限公司在10月14日出现工商变更,百度全资控股公司达孜县百瑞翔创业投资管理有限责任公司成为卡美啦股东之一. TechWeb从百度方面了 ...

  4. Java电商平台-电商订单系统全解析

    说明:Java电商平台-电商订单系统全解析主要讲解OMS的内容,设计,开发,架构等知识 今天分享将会分为以下三个环节来阐述: 1.订单系统的介绍 2.订单系统的解构 3.垂直电商订单系统设计思路 一. ...

  5. 百度java面试题(一)2020整理

    百度后端面经2020 一面-2019/09/19 自我介绍 syncronized 各种使用,加static和普通的区别:volatile的作用,还讲了java内存模型,不用会如何 ThreadLoc ...

  6. JAVA电商秒杀实战(三)

    JAVA电商秒杀实战(三)- - 实现第三方登录 QQ登录 短信验证码登录 QQ登录 首先导入所需要的相关依赖: <dependency><groupId>org.apache ...

  7. java电商和企业项目_java电商和企业项目

    这里比较的都是国外的开源项目,备选项目有: Smilehouse Workspace.Pulse.Shopizer.ofbiz.bigfish.broadleaf1.Smilehouse Worksp ...

  8. 【session】Java电商平台开发技能图谱,探秘双十一百万PV

    您将学习 Java电商平台开发技能图谱,探秘双十一百万PV 分享内容 企业级Java开发技能图谱 从宏观到微观,Java到底怎么学 为了支撑双十一,我们对Java程序做了什么 你将认识 热爱分享的常乐 ...

  9. 整理出来了,百度Java工程师社招三面面经,速取!

    最近在群里看到有许多大佬都在分享自己的面试经历,大佬们面试的互联网公司都好高大上.整理出一份百度Java工程师的三面面经,希望对大家能有帮助. 一面(50min过) 1.首先是自我介绍: 2.关键 S ...

最新文章

  1. 前端不哭!最新优化性能经验分享来啦 | 技术头条
  2. [导入]Don's Loose
  3. (Mybatis)日志工厂
  4. 微服务有麻烦吗? Lagom在这里为您提供帮助。 尝试一下!
  5. java数组与C++数组间的区别
  6. php mysql关键技术_中高级PHP开发者应该掌握哪些技术?
  7. Linux---僵尸进程的解决办法
  8. 移动端html右滑空白,BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法...
  9. VC知识库的离线包整合
  10. Axure元件库web组件库典藏版 (含五大类159小类组件 )
  11. ftp命令及dos中操作ftp命令
  12. 《深入浅出图神经网络》
  13. 网络爬虫的基本结构是什么?如何建立网络爬虫抓取数据?
  14. 从传统外企到阿里 P9,这位 Java 工程师经历了什么?
  15. 关于Nginx服务器的一些粗略认识
  16. Backtrader概念(四)-Cerebro参数
  17. JavaScript专题(一)变量提升与预编译,一起去发现Js华丽的暗箱操作
  18. 云服务器远程一键登录出现SSH connection failed: All configured authentication methods failed *解决办法。
  19. vatic—视频标注工具安装出现error及注意事项
  20. JetBrains PyCharm 设置显示行号

热门文章

  1. 浅谈Linux磁盘存储管理续【逻辑卷管理(LVM)】
  2. 四则运算2的单元测试
  3. 更新整理本人所有博文中提供的代码与工具(Java,2013.11)
  4. Visual Media Server – 2 - 下载模块草图
  5. PHP 解析xml(包含非英文字符)
  6. 牛客 - 奇怪的背包问题增加了(贪心)
  7. redis 槽点重新分配 集群_redis集群高可用部署-cluster-槽点的迁移查看
  8. 电视机当计算机屏幕,电视机可以当电脑显示器吗
  9. 乘积的C语言,c语言矩阵相乘
  10. 二项式反演[bzoj3622]已经没有什么好害怕的了