面经 | 闲来无事,百度一下

记得9月份秋招的时候和朋友说过一句话:如果不知道做什么的话就去面试吧,现在想起来当时的情景还是五味杂陈!更新一波梳理的百度(深圳)的Java后台面经(带答案),面经来源:https://www.nowcoder.com/discuss/124753 。


一面

1. 使用过哪些linux命令?

基本指令:ls、mkdir、cd、touch、echo、cat、cp、mv、rm、find、grep、pwd、head、tail

系统管理:stat、who、whoami、top、ps、ifconfig、ping、netstat、man、kill

打包压缩:gzip、bzip2、tar

关机重启:shutdown、halt、reboot

编辑文件:vim

权限管理:chmod

2. 使用过哪些git命令?

git init、git clone、git status、git log、git add、git diff、git commit、git reset、git revert、git rm、git clean、git mv、git stash、git banch、git checkout、git merge、git tag、git remote、git fetch、git pull、git rebase、git push、git reflog

3. Java类加载机制(重点)

类的加载指的是将类的.class文件中的二进制数据读入到内存中,并将其存放在运行时数据区的方法区内。类的加载的最终产品是在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

类的加载过程包括加载、验证、准备、解析和初始化五个阶段。

  • 加载:查找并加载类的二进制文件,在方法区中产生一个数据结构,Class对象为其访问接口。
  • 验证:确保被加载的类的正确性。包括文件格式验证、元数据验证、字节码验证和符号引用验证。
  • 准备:为类的静态变量分配内存(方法区内),并将其初始化为默认值。
  • 解析:把类中的符号引用转换为直接引用,主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用。
  • 初始化:JVM负责对类进行初始化,主要对类变量进行初始化。

类的加载是由类加载器来完成的,包括启动类加载器、扩展类加载器和应用程序类加载器。

  • 启动类加载器:负责加载存放在JDK\jre\lib目录下或被-Xbootclasspath参数指定的路径下且能被虚拟机识别的类库,如所有java.*开头的类;启动类加载器无法被程序直接使用,其他类加载器需要由启动类加载器加载到内存中之后才能去加载其他的类。
  • 扩展类加载器:负责加载存放在JDK\jre\lib\ext目录下或由java.ext.dirs系统变量指定的路径下的所有类库,如所有javax.*开头的类;开发者可以直接使用扩展类加载器。
  • 应用程序类加载器:程序的默认类加载器(除非自定义类加载器),负责加载存放在用户类路径下的所有类库,开发者可以直接使用该类加载器。

双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上。因此,所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,即无法完成该加载,子加载器才会尝试自己去加载该类。主要作用是为了防止内存中出现多份同样的字节码,保证Java程序安全稳定运行。

4. 数据库事务的四大特性

ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

5. MySQL索引与两种搜索引擎的区别(重点)

索引分类包括普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引、主键索引、组合索引。

MySQL主要有MyISAM和InnoDB两种存储引擎,主要区别有:

  • MyISAM不支持事务,是非事务安全的,而InnoDB支持四种事务,是事务安全的;
  • MyISAM锁的粒度是表级的,且不支持外键,而InnoDB支持行级锁和外键;
  • MyISAM支持全文索引,而InnoDB不支持全文索引;
  • MyISAM相对简单,效率上要优于InnoDB,存储有表的行数,小型应用可以考虑使用MyISAM;
  • MyISAM表保存成文件形式,跨平台使用更加方便。

由此可见,MyISAM用于管理非事务表,主要提供高速存储、检索以及全文搜索能力,若在应用中需要执行大量的SELECT操作,应该选择MyISAM。而InnoDB用于事务处理,具有ACID事务支持等特性,若在应用中执行大量INSERT和UPDATE操作,应该选择InnoDB。

6. 了解哪些设计模式?

Java中的设计模式有23中,可准备几种使用过的或者框架中应用比较多的,如单例模式、工厂方法模式、抽象工厂模式、代理模式和策略模式等。

7. SQL优化

SQL优化的策略有很多,网上总结的有一大堆。面试时主要还是关注索引添加、使用关联查询替代子查询、查询语句不要使用*等,建议准备几种,并亲自操刀一下,面试时就可以把来龙去脉说的一清二楚。

8. 进程间通信方式

管道、命名管道(FIFO)、消息队列、共享内存、信号量、套接字和信号。

9. 拓扑排序

在图论中,拓扑排序是指用有向无环图中各个顶点所构成的有序序列。该序列必须满足如下条件:

  • 每个顶点出现且仅出现一次;
  • 设图中一顶点A到另一顶点B存在一条路径,则B在此图的拓扑排序序列中位于A之后。

注意:只有有向无环图才存在拓扑排序。

应用:某大学计算机专业必修课程以及这些课程之间的先后顺序关系图即为典型的有向无环图,可以进行拓扑排序。

实现:拓扑排序的最优算法是基于邻接表来实现的,具体实现过程暂且略过,后续单独来写。

10. 具体介绍一下SSM

SSM框架包括Spring+SpringMVC+Mybatis。

Spring是一个轻量级的容器框架,回答时主要答两点:控制反转(IoC)和面向切面编程(AOP),具体的使用和理解就需要自己下功夫来理解啦。

SpringMVC很好地实现了模型、视图和控制器的解耦,使用DispatchServlet来拦截请求,交给目标处理器类的相应方法来处理,处理完成后再返回给视图。

MyBatis是一个轻量级的基于Java的持久层框架,实现对象关系映射,将POJO映射为数据库中的记录。

11. 未来的发展规划

算是一个套路题吧,在和盘托出自己的规划前建议好好想一下企业所需要什么样的人。踏实做事,那就要表明自己在三到五年打算在当前的技术领域好好积累之类的决心,至于五年之后的规划就可以大概说一下想走技术路线还是管理路线,并补充说:毕竟五年之后自己各方面的成长和认知都会有质的提升,到时候可能还会根据实际情况进行调整等。

纯粹一家之言,欢迎补充。


二面

1. 项目情况及项目中遇到的难题

这个没啥说的,简历中所涉及到的技术点都需要完全熟悉,而不是被问到的时候说这部分不是自己做的,因为简历中涉及到的基本都是必问题。项目中遇到的难题也务必准备一两个,描述清楚问题是什么原因产生的以及自己是怎么解决的。

2. MySQL索引与两种搜索引擎的区别

只能说这个问题很重要,具体见一面的第5题。

3. 介绍一下Java虚拟机(JVM)及垃圾回收(GC)

分模块来回答,包括JVM运行时数据区、Java内存模型、内存泄漏、垃圾回收、GC调优等。

强烈推荐《深入理解Java虚拟机:JVM高级特性与最佳实践》一书,这本书真的需要在面试准备阶段至少精读两遍,因为JVM是面试必问内容,公众号后台回复「电子书」即可获取电子版书籍资源。

4. 代码题

  • 字符串倒叙输出(手撕)
  • 在有序数组中找出和为key的两个值(手撕)
  • 找出1到n中重复的数字(思路)
  • 100G大文件数据如何排序(思路)

这部分就不拿具体的代码出来秀了,主要还是要有基本的算法思路,面试前主要刷《剑指Offer》和《程序员代码面试指南-IT名企算法与数据结构题目最优解》这两本书就足够打怪升级了,公众号后台回复「电子书」即可获取电子版书籍资源。


补充

刚刚在回想关于未来的发展规划时,突然间想起了华为的佛系性格测评。我是八月中旬被邀请参加的武长区优招面试,面试前做了一次性格测评,傻傻地根据提示选择自己内心最真实的答案。面试完成之后,大概在九月初的时候,华为又给我发了一次性格测评说:测评系统未能成功生成您的在线测评结果,可能原因是未按内心真实情况进行选择,需要重新测评。结果当时真的是太年轻,打开测评继续按着自己的内心最真实的想法进行测评。测评结束后,脑子一转在网上发现华为性格测评居然有攻略,攻略推荐选择不愿当领导、愿意加班、遇事完全不焦虑等选项,果然还是年轻了一把,最终结果也可想而知。虽然面试结果挺不错的,面试官当场就说想要我去深圳那边去工作,还专门起来和我握手了,结果挂在性格测评上。

经验分享给大家,但愿各位在求职路上能被各大企业温柔以待!


欢迎关注

Java名企面试吧,隔天10点24分,我们不见不散!

丙子先生的宗旨是,隔天以短篇幅讲高试题,不增加太多负担,但需要持之以恒。

能力有限,欢迎指教!

你可能感兴趣的:(面经,百度,Java,面试)