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

本文整理了百度深圳Java后台岗位的面试经验,涵盖Linux命令、Git使用、Java类加载机制、数据库事务特性、MySQL索引、设计模式、SQL优化、进程间通信、拓扑排序、SSM框架等核心知识点。

记得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,也买了很多的有关Java的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,不妨过来讨论一下哦! 第1章 Java概述 1.1 Java的发展史 1.1.1 Java起源 1.1.2 Java发展 1.2 Java是什么 1.2.1 Java语言 1.2.2 Java平台 1.2.3 Java网络操作系统 1.3 Java的特点 1.4 Java程序类型 1.5 JDK与JRE 1.5.1 Java开发工具包 1.5.2 Java运行环境 1.6 Java技术体系 1.7 Java虚拟机 1.7.1 虚拟机数据类型 1.7.2 Java虚拟机的生命周期 1.7.3 Java虚拟机的体系结构 1.8 垃圾收集器 1.9 本章习题 第2章 Java开发环境 2.1 J2SE的下载和安装 2.1.1 J2SE的下载 2.1.2 J2SE的安装 2.2 环境变量的配置与测试 2.2.1 设置环境变量path 2.2.2 设置环境变量classpath 2.2.3 环境变量的测试 2.3 API文档的下载与使用 2.4 第一个应用程序 2.4.1 HelloWorld程序 2.4.2 程序运行编译命令 2.4.3 HelloWorld编译与运行 2.5 简单开发工具介绍 2.5.1 EditPlus的编译与运行 2.5.2 在UltraEdit上开发Java 2.6 集成开发环境Eclipse介绍 2.6.1 Eclipse下载与安装 2.6.2 Eclipse的透视图 2.6.3 Eclipse的视图(View) 2.6.4 Eclipse的编辑器 2.6.5 Eclipse的工具栏和菜单栏 2.6.6 使用Eclipse编写HelloWorld程序 2.7 本章习题 第3章 Java语言基础 3.1 标识符 3.1.1 标识符的概念 3.1.2 变量命名规则 3.1.3 变量命名技巧 3.2 关键字 3.3 注释 3.4 数据类型 3.4.1 整型 3.4.2 浮点型 3.4.3 字符型 3.4.4 布尔型 3.5 变量与常量 3.5.1 变量声明 3.5.2 变量赋值和初始化 3.5.3 常量 3.6 类型转化 3.6.1 数值类型之间的转换 3.6.2 强制类型转换 3.7 运算符 3.7.1 算术运算符 3.7.2 关系运算符 3.7.3 逻辑运算符 3.7.4 位运算符 3.7.5 自动递增和递减 3.7.6 三元运算符 3.7.7 运算符的优先级 3.8 本章习题 第4章 程序流程控制 4.1 顺序结构 4.2 条件语句 4.2.1 if语句 4.2.2 if-else语句 4.2.3 if-else-if语句 4.2.4 if语句的嵌套 4.2.5 布尔表达式 4.2.6 开关语句 4.3 循环语句 4.3.1 while循环结构 4.3.2 do-while 循环结构 4.3.3 for循环结构 4.3.4 循环的嵌套 4.4 转向语句 4.4.1 break中断语句 4.4.2 continue条件继续语句 4.4.3 标签语句 4.5 返回语句 4.6 综合实例:水仙花数 4.7 本章习题 第5章 字符串 5.1 字符串简介 5.1.1 字符串常量 5.1.2 String创建字符串常量 5.1.3 StringBuffer创建字符串 5.2 连接字符串 5.2.1 与字符串的连接 5.2.2 与其他数据类型的连接 5.3 String字符串操作 5.3.1 基本操作 5.3.2 比较 5.3.3 转化 5.3.4 查找 5.3.5 截取拆分 5.3.6 替换或修改 5.4 StringBuffer类操作 5.4.1 基本操作 5.4.2 字符串操作方法 5.4.3 添加append() 5.4.4 插入insert() 5.5 实例:字符串应用 5.6 本章习题 第6章 数组 6.1 一维数组 6.1.1 数组的概念 6.1.2 一维数组的声明 6.1.3 一维数组的初始化 6.1.4 一维数组的使用 6.1.5 一维数组的空间模型 6.1.6 基本数据类型数组 6.1.7 对象数组 6.1.8 数组参数 6.2 二维数组和多维数组 6.2.1 二维数组的声明 6.2.2 二维数组的初始化 6.2.3 二维数组的空间模型 6.2.4 二维数组的使用 6.3 数组操作 6.3.1 排序数组 6.3.2 查找 6.3.3 复制数组 6.3.4 填充数据 6.3.5 比较数组 6.4 实例:杨辉三角 6.5 本章习题 第7章 对象与类 7.1 向对象程序设计 7.1.1 向对象程序设计的概述 7.1.2 向对象程序设计的特点 7.1.3 对象与类的关系 7.2 定义类 7.2.1 MasterCard类的实现 7.2.2 MasterCard类的使用 7.2.3 访问控制 7.2.4 构造方法 7.2.5 方法的参数 7.2.6 封装与隐藏 7.2.7 finalize()方法 7.3 静态域与静态方法 7.3.1 静态域 7.3.2 静态方法 7.3.3 Math类 7.4 构造方法 7.4.1 默认的域初始化 7.4.2 默认构造方法 7.4.3 拷贝构造方法 7.4.4 重载构造方法 7.4.5 调用构造方法 7.4.6 初始化块 7.5 包 7.5.1 包的概念 7.5.2 类的导入 7.5.3 包名与目录 7.5.4 静态导入 7.5.5 Java包介绍 7.6 类设计技巧 7.7 实例:完善MasterCard类 7.7.1 构造方法 7.7.2 setter方法 7.7.3 getter方法 7.7.4 其他方法 7.8 main()方法 7.9 本章习题 第8章 继承 8.1 父类和子类 8.2 super构造方法调用 8.3 封装和继承 8.4 使用继承 8.4.1 Object类 8.4.2 定义equals方法 8.5 关于设计好继承的几点建议 8.6 实例:一卡通类的继承 8.6.1 构造方法 8.6.2 setter方法 8.6.3 getter方法 8.6.4 方法覆盖 8.6.5 equals方法 8.6.6 其他需要强调的地方 8.7 本章习题 第9章 多态与抽象类 9.1 多态性概念 9.2 重载 9.2.1 重载概念 9.2.2 重载注意事项 9.3 覆盖 9.3.1 覆盖概念 9.3.2 覆盖与访问权限 9.3.3 静态方法覆盖 9.3.4 覆盖与异常抛出 9.3.5 抽象方法覆盖 9.3.6 覆盖与重载 9.4 静态绑定与动态绑定 9.4.1 静态绑定 9.4.2 动态绑定 9.5 抽象类 9.5.1 抽象类概念 9.5.2 抽象类应用 9.5.3 抽象类注意事项 9.6 本章习题 第10章 接口与内部类 10.1 接口 10.1.1 接口的概念 10.1.2 接口应用 10.1.3 抽象类实现接口 10.1.4 派生接口 10.1.5 Comparable接口 10.1.6 Comparable接口应用 10.1.7 接口中定义常量 10.1.8 Cloneable接口 10.1.9 Cloneable接口应用 10.1.10 抽象类与接口区别 10.2 内部类概念 10.3 成员内部类 10.3.1 创建内部类对象 10.3.2 内部类的this引用 10.3.3 成员内部类的修饰符 10.4 方法内部类 10.5 匿名内部类 10.5.1 继承式 10.5.2 接口式 10.5.3 参数式 10.6 静态嵌套类 10.7 内部类的继承 10.8 本章习题 第11章 线程 11.1 线程基础 11.1.1 什么是线程 11.1.2 Thread创建线程 11.1.3 Thread创建线程步骤 11.1.4 Runnable接口创建线程 11.1.5 Runnable创建线程步骤 11.2 线程周期 11.2.1 线程周期概念 11.2.2 线程的创建和启动 11.2.3 线程状态转换 11.2.4 等待线程结束 11.3 线程调度 11.4 线程同步 11.4.1 同步概念 11.4.2 同步格式 11.4.3 同步应用 11.5 线程通信 11.5.1 生产者/消费者 11.5.2 共享队列 11.5.3 运行生产者/消费者 11.6 死锁 11.7 本章习题 第12章 异常处理 12.1 异常的概念 12.2 异常的基本样式 12.3 Java异常类 12.3.1 异常类层次结构 12.3.2 异常处理方法 12.4 异常捕获 12.4.1 异常捕获处理语句块 12.4.2 必须执行语句块 12.4.3 必须执行语句的意外 12.5 异常抛出 12.5.1 异常抛出概念 12.5.2 throw 12.5.3 throws 12.5.4 抛出异常 12.6 自定义异常 12.6.1 创建用户自定义异常 12.6.2 捕获运行时异常 12.7 本章习题 第13章 图形界编程 13.1 AWT简介 13.2 Swing基础 13.2.1 Swing的类层次结构 13.2.2 Swing特点 13.2.3 Swing程序结构简介 13.3 Swing组件 13.3.1 按钮(Jbutton) 13.3.2 复选框(JCheckBox) 13.3.3 单选框(JRadioButton) 13.3.4 组合框(JComboBox) 13.3.5 进程条(JprogressBar) 13.3.6 表格(JTable) 13.3.7 树(JTree) 13.3.8 文本框(JTextField)与文本区(JTextArea) 13.4 布局管理器 13.4.1 FlowLayout布局管理器 13.4.2 BorderLayout布局管理器 13.4.3 BoxLayout布局管理器 13.4.4 GridLayout布局管理器 13.5 事件处理 13.5.1 事件监听器 13.5.2 事件适配器 13.5.3 事件 13.6 举例 13.6.1 界设计 13.6.2 运算设计步骤 13.7 本章习题 第14章 Java I/O系统 14.1 I/O概述 14.2 文件操作 14.2.1 File类 14.2.2 File类应用 14.2.3 RandomAccessFile类 14.2.4 RandomAccessFile应用 14.3 字节流InputStream、OutputStream 14.3.1 字节输入、输出流 14.3.2 字节文件输入、输出流 14.3.3 字节缓冲输入、输出流 14.3.4 字节数据输入、输出流 14.3.5 字节对象输入、输出流 14.4 字符流Reader、Writer 14.4.1 字符读、写流 14.4.2 字符输入、输出流 14.4.3 文件读、写字符流 14.4.4 字符缓冲区读、写流 14.5 本章习题 第15章 集合 15.1 集合概述 15.2 容器和迭代器 15.2.1 容器(Collection) 15.2.2 迭代器(Iterator) 15.3 链表List 15.3.1 链表List接口方法 15.3.2 链表迭代器接口 15.3.3 链表和数组链表 15.3.4 链表应用 15.3.5 数组链表应用 15.4 集Set 15.4.1 排序集接口 15.4.2 哈希集和树集 15.4.3 树集应用 15.5 映射Map 15.5.1 映射接口方法 15.5.2 排序映射接口 15.5.3 哈希映射和树映射 15.5.4 哈希映射应用 15.5.5 树映射应用 15.6 本章习题 第16章 Java与数据库 16.1 SQL语句 16.1.1 SQL语句分类 16.1.2 SELECT 16.1.3 INSERT 16.1.4 UPDATE 16.1.5 DELETE 16.1.6 CREATE 16.1.7 ALTER 16.1.8 DROP 16.2 MySQL概述 16.2.1 MySQL简介 16.2.2 下载并安装MySQL 16.2.3 MySQL使用 16.3 JDBC 16.3.1 JDBC设计思想 16.3.2 JDBC常见接口和类 16.3.3 JDBC数据库连接步骤 16.3.4 加载JDBC驱动程序 16.3.5 获取Connection连接对象 16.4 Java与各种数据库连接 16.5 本章习题 第17章 Java Web应用——JSP 17.1 JSP技术概述 17.2 JSP运行环境搭建 17.2.1 Tomcat下载与安装 17.2.2 Tomcat的环境变量配置 17.3 基本语法 17.3.1 HTML注释 17.3.2 隐藏注释 17.3.3 声明 17.3.4 表达式 17.3.5 脚本集 17.4 JSP指令元素 17.4.1 Include 指令 17.4.2 Page 指令 17.4.3 Taglib 指令 17.5 JSP动作元素 17.5.1 (jsp:forward) 17.5.2 (jsp:useBean) 17.5.3 (jsp:setProperty) 17.5.4 (jsp:getProperty) 17.5.5 (jsp:include) 17.5.6 (jsp:plugin) 17.6 内置对象 17.6.1 out对象 17.6.2 request对象 17.6.3 response对象 17.6.4 session对象 17.6.5 application对象 17.6.6 pageContext对象 17.6.7 exception对象 17.6.8 config对象 17.7 计数器 17.8 本章习题 第18章 KTV管理系统 18.1 数据存储设计 18.2 管理界 18.2.1 添加歌曲界 18.2.2 歌曲查找界 18.2.3 歌曲修改界 18.2.4 删除歌曲 18.3 业务处理 18.3.1 实体类 18.3.2 数据处理 18.3.3 权限处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值