【深入代码系列】手牵手一起过面试
面的是人情世故,敲的是高楼建筑。
简历
很多时候,我们都寄托于简历可以给我们的面试打开一扇门。或者至少不拖后腿。
其实没有那么多的条条框框,大多数原因还是因为没得选择。扎心。总之,关系到工作机会,虽不用吹毛求疵,但也不容小觑。毕竟,多一次机会就会多一次机会。
准备
1.确定求职方向
2.确定从事工作的专业知识和技能
3.罗列自己的所有技能
组成
1.标题
名称—职位—年限
2.个人信息
姓名、性别、年龄、籍贯、学历、专业、联系方式、邮箱、现居住地
1 | 手机号可以这样写: 189-5021-9623 |
3.求职意向
期望行业、工作地点、期望职位、期望薪资
1 | 期望职位和标题的保持一致 |
4.专业技能
技术点、层级分配
1 | 技能条目一般在12条左右,不要过多或过少。 |
5.工作经历
工作时间、公司名称、任职岗位、工作描述
1 | 工作时段要和标题的3年吻合 |
6.项目经验
项目名称、开发周期、开发环境、软件架构、项目描述、责任描述、技术描述
1 | 一般3~4个项目即可 |
star法完善项目经验:
7.教育背景
学校名称、专业、教育时间
1 | 如果基本信息里有提到,这里就可有可无 |
8.自我评价
分点来写
1 | 展示优势,靠谱,不要天方夜谭 |
工作
职业发展图.png
不想成为一个架构师的程序员不是一个好的小说家 :laughing:
行业分类.png
每个行业都有需求,有业务需求就会有岗位需求。就会有你的萝卜坑。
或许我们可以先限定一个喜欢的行业。这样接触到的业务系统可能会更让你喜欢一些,做起来也更开心。
当然,只是泛泛来说。具体行业中做与行业无关的系统也有的。比如金融行业,需要个签到系统?报表系统?等等。
开发流程图.png
大体的流程,实际情况实际分析,可能更繁琐,可能更随意。
市场
一个岗位满足70%技能点就可以投递了。
很多,boss,智联,无忧等招聘网站搜索对应职业就行,或者人脉,内推,猎头等。
求职
自我介绍
1 | 定位: |
比如:面试官,你好,我叫XXX,今年xx岁,毕业xxxx大学,之前在xxx从事xxxx,后来由于个人的规划,想来到xxx学习一些xxx技术,之前在做过x个项目,x个xx,x个xx.以上就是我的个人介绍.如果面试官您还有其他问题,您可以直接问.
1 | 自我介绍+工作经历+项目经历+学历背景 |
总体的通用流程
电话->笔试->面试(技术/人事)->入职准备(一堆材料)。
关于规划
一到2年可以先沉淀技术,3-5年内可以考虑软件架构
你还有什么问题?
入职的这家公司主要在做哪些业务?【*】
感兴趣的技术这家公司是否在用? (要看是否于自身定位符合,公司挑面试人,面试者也要挑公司)
人事
面试结果
1 | 面试后一天可以向hr咨询一下情况,就算没有过,也可以问一下原因,为后续的面试做准备 |
社保
公积金
入职材料
学历复印件,离职证明,身份证复印件,流水,体检等等。
[x]身份证 - 复印件1份
[x]原单位离职证明原件(需写明上家单位的入职,离职日期及任职岗位)
[x]学历证书- 复印件1份
[x]学位证书- 复印件1份
[x]培训证书- 复印件1份
[x]职称证书- 复印件1份
[x]获奖证书- 复印件1份
[x]其他与本人相关的证书- 复印件1份
[x]1寸彩色白底免冠近照3张,同时提交电子版 – 照相/用旧的?
[x]银行卡复印件1份 – 新开户上海银行卡?
[]居住证
[]个人公积金账号 – 上海要新开账号?
1 | 问清体检报告是自己取还是他们发到邮箱 |
总的来说,面试,也有一部分是人情世故。
JavaSE
1、abstract class 和interface 有什么区别?
2、Java语言中,若需要定义一个类,可以使用哪些修饰符?
3、谈谈 final, finally, finalize 的区别?
4、是否可以从一个静态(static)的方法内部发出对非静态方法(non-static)的调用?
5、当一个对象被当做参数传递到一个方法后,此方法可以改变这个对象的属性,并可返回变化后的结果,那么这到底是值传递还是引用传递?
6、Java中的方法覆盖(Overriding)和方法重载(Overloading)的区别。
7、构造器Constructor是否可被override?
8、Java中,什么是构造方法?什么是构 造方法重载?什么是复制构造方法?
9、Java为什么不支持多继承?
10、接口是否可以继承接口?抽象类是否可以实现 implements 接口?
11、简述访问控制符public、protected、private以及默认的区别?
12、在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题的?
13、Java中实现多态的机制是什么?
14、在Java中,如何跳出循环的本次执行,如何终止当前循环?
15、Java中0.6322的数据类型是什么?
16、Math.round(11.5)等于多少? Math.round(-11.5)等于多少?
17、equals和hashcode的作用是什么?什么情况下我们需要去实现这两个接口?
18、==和equals()有何区别?
19、简述什么是自动装箱与拆箱?好处是什么?
20、String和StringBuilder、StringBuffer的区别是什么?
21、简述throw 和 throws的区别。
22、简述Error和Exception的区别。CheckedException和RuntimeException的区别?
23、简述Java异常处理机制。
24、Collection 和 Collections的区别。
25、ArrayList的初始容量是多少?扩容机制如何?
26、Vector、LinkedList和ArrayList的区别,HashMap和Hastable的区别?
27、HashTable和ConcurrentHashMap有什么区别?
28、简述HashMap、HashTable以及ConcurrentHashMap的实现原理。
29、请简述你熟悉的一种设计模式,并举例说明使用场景。
30、手写单例模式(懒汉式、饿汉式)。
31、手写冒泡排序。
32、在什么情况下需要使用到线程?线程有几种创建方式?线程有几种状态?
33、如何停止一个线程?
34、synchronized如何使用?
35、synchronized和Lock的区别?
36、多线程如何进行信息交互?
37、简述sleep和wait的区别?
38、Thread的start方法和Runnable的run方法有什么区别?
39、java.lang.ThreadLocal类有什么用处?
40、如何才能产生死锁?
41、如何预防死锁?
42、Java并发包下提供了哪些并发工具类?
43、简述Java中的NIO,BIO,AIO分别是什么?
44、IO和NIO区别?
45、Java流被分为字节流、字符流两大流类,二者有什么区别?
46、Java 有几种文件拷贝方式?哪一种最高效?
47、BufferedReader属于哪种流,它的主要作用是什么?它有哪些经典的方法?
48、请问什么是Java序列化?以及如何实现Java序列化?
49、请说明一下Java中反射的实现过程和作用分别是什么?
50、谈谈 Java 动态代理是基于什么原理
51、java内存模型和优化有做过哪些
52、java的synchronized加在静态方法和动态方法的区别
JavaWeb
1、Jsp内置对象有哪些?作用分别是什么?
2、简述Jsp运行原理。
3、Jsp常用指令有哪些?
4、Jsp乱码如何解决?
5、你的项目中使用过哪些JSTL标签?
6、页面间对象传递的方法有哪些?
7、简述Jsp和Servlet的区别是什么?
8、简述Servlet生命周期。
9、Servlet是线程安全的吗?
10、Servlet是多例还是单例?
11、Servlet执行时一般实现哪几种方法,每个方法的作用是什么?
12、简述Request对象的主要方法有哪些。
13、request.getParameter()和request.getAttribute()的区别?
14、forward与redirect区别,redirect的状态码是多少?
15、get和post的区别?
16、简述四种会话跟踪技术。
17、简述自动登录功能的编码实现。
18、cookie和session的作用、区别、应用范围。
19、HTTP协议是无状态的,那么应用服务器是如何维护session的?
20、保存session id 有几种方式?
21、如何防止表单重复提交?
22、JAVA应用服务器有那些?
23、Tomcat根目录下有哪些文件?
24、Tomcat的缺省端口是多少,怎么修改?
25、日常应用中单台Tomcat能支持最大的并发数是多少以及如何优化?
26、Tomcat容器是如何创建Servlet类实例?用到了什么原理?
27、Tomcat如何开启Js压缩?以及开启压缩的好处是什么?
28、一次完整的HTTP请求过程是怎样的?
29、简述TCP/IP五层结构及其相应的功能
30、HTTP状态码类型有哪些,及其作用
31、HTTP响应的结构是怎么样的?
32、解释一下什么是同源策略?
33、简述TCP协议和HTTP协议的关系和区别。
34、什么是 URL 编码和 URL 解码?
35、简述拦截器和过滤器的区别。
36、简述过滤器的用法以及过滤器有哪些作用?
37、介绍下什么是Ajax以及Ajax的执行流程。
38、jQuery基本选择器有哪些?
39、JavaScript中 =
和==
与===
三者之间的区别是什么?
40、你在项目中用到了XML技术的哪些方面?如何实现的?
41、写一个判断是否是网络地址的正则表达式。
42、怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
43、在HTML中什么是绝对路径?什么是相对路径?
44、请说出你常用的Linux命令有哪些,并且它们的作用是什么?
45、Linux中怎么查看当前进程?怎么执行退出?怎么查看当前路径?
46、Linux中目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?
47、Linux中查看文件内容有哪些命令可以使用?
48、Linux中移动文件用哪个命令?改名用哪个命令?复制文件用哪个命令?
49、Linux中终止进程用什么命令? 带什么参数?
50、Linux中搜索文件用什么命令? 格式是怎么样的?
高级问题
1、电商项目中有没有用到多线程,哪些地方要用多线程?
2、日志文件的管理,你们是怎么做的?
3、你觉得分布式开发的缺点是什么?
4、支付接口是怎么做的?
5、solr和数据库怎么交互的?
6、solr怎么设置搜索结果排名靠前(得分)?
7、activeMQ在项目中如何应用的?
8、activeMQ如果数据提交不成功怎么办?
9、单点登录系统是怎么做的?
10、dubbo服务开发流程,运行流程?
11、solr跟数据库的区别,你清楚么?
12、广告数据是怎么用redis缓存的?
13、项目中权限是怎么做的?
14、如何处理activeMQ消息丢失的问题?
15、token校验的过程?
1 | token其实就是服务器验证身份的一个临时令牌。用户不要每次都输入用户名和密码进行身份验证。所以给一个标识证明用户的身份。这就是token。 |
16、redis为什么可以做缓存?
1 | 缓存的话,我们用map可以做本地缓存,但是声明周期随着jvm的销毁而结束,多例的情况下,每个实例都保存一份缓存,不具有一致性。 |
17、redis缓存与数据库同步,怎么做的?
参考:https://www.cnblogs.com/lanbo203/p/7494587.html
1 | 看情况 |
18、fastDFS的执行流程,你清楚么?
1 | # 执行流程 |
19、zookeeper集群,全部都挂了,怎么办?
20、如何解决购物车内存大小的问题?
有意思的题目
1、为什么要用redis,相比于如memcached,mongodb有什么优势
2、mybatis,activemq。springmvc有什么好处,为什么要用它
3、springmvc和struts区别(都不会)…用过什么数据库,有没有做过数据库优化
4、什么情况下要用到索引,好处是什么,哪些字段适合建立索引,mysql索引底层数据结构了解吗,索引什么情况下会失效, 联合索引abc只用了a字段,索引是否会生效。
5、什么情况下要用到多线程,为什么要用,好处。 启动多个线程,如何知道他们都运行完毕了。
6、string为什么是不可变的,重写重载,object类有哪些方法,sleep和wait区别,实现线程的方式,run,start区别,线程有几种状态,synchronize实现原理(这个问题可以说的很多,建议大家往深了看,往深了说,以震慑面试官, 与lock区别,还知道哪些锁,说说自旋锁。线程池,线程池等待队列,拒绝策略,死锁产生原因。
6、为什么java可以一次编译,到处运行。事务特性,索引失效,mysql有哪些函数。http和https区别,get和post区别,springbean是单例吗,spring源码看过吗,其中的单例bean是怎么实现的。redis有支持哪些数据结构。servlet怎么取前端参数。
7、servlet和jsp区别,如果没有servlet,jsp怎么跟后端交互(大概是这个意思,没听太懂,一脸懵逼)。springmvc怎么取前端数据,springmvc模式下,如果没有注解怎么取前端参数(答:servlet,requset.getParameter。他问,具体在哪怎么用,也没听太懂,懵逼)。搭建springmvc项目步骤。spirngmvc controller中定义全局hashmap,它是否是线程安全的,为什么。
8、Io nio区别,nio原理。netty用的多吗。答,不多。
9、项目中用哪种方式解析xml的 答:jaxb,dom4j,digester。问:jaxp是什么。 答:是jaxb,巴拉巴拉… 问:哦哦,挺好用的
10、servlet生命周期。tomcat在初始化中做了什么事(答:启动socket服务端…问:没了吗?答:… 很明显该回答的还有很多,想了解的应该是我对tomcat的理解程度,以及是否看过tomcat源码)。是否用过Nginx。过滤器和拦截器的区别。
11、项目中有用到缓存吗,redis有提供了哪些存储数据结构,redis持久化。
12、说说java内存模型,新生代老年代算法,你说的新生代老年代属于堆还是栈,还知道哪些gc算法,创建大对象也是在新生代分配吗,(答:直接晋升进入老年代,问:具体多大对象,答:超过eden区大小,问:你是否确定,顿时虚了,后来回去查阅过,我回答的不对,jvm这里的看点很多,涉及到优化)。新生代的算法,说说minor gc,minor gc触发条件。老年代用了什么算法,说说标记整理算法,full gc是否真正回收了废弃对象。有哪些gc策略。你觉得你的项目中如果需要jvm调优你会注重哪个分带的调优,或者说更注重哪种gc调优,为什么,具体怎么做(懵逼,随便吹了下。问:你确定吗? 顿时又虚了)。
13、线上系统每天会收到20万级的数据,一个月会有百万条,并且还会递增。你如何设计数据库
(答:分库分表,建立索引,问:分库分表对的,还有哪些点,分库分表按什么规则分)。
如果查询字段不是分库分表的规则字段,怎么办(他说没事,想到什么说什么,也许你的思路会比我们的更好,你说说看)。
沉默许久,不会,没接触过。(后来查了该问题:分库分表多维度查询)
问:oracle分页的sql关键字是什么 答:limit
问:不对吧,那是mysql的 答:啊?好吧
问:也许是limit,我也记不清了,可能你说的是对的,回去我得看看。(面试官还算和蔼,其实是rownum)
JVM专题
运行时数据区
美团
1、请简述JVM运行时数据区的组成结构及各部分作用
2、说说程序计数器的作用?
3、代码异常后如何执行?
4、为什么finally总会被执行?
字节
5、java内存区域?局部变量在哪?
总览
java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,不同的区域存储不同的数据,Java 引以为豪的就是它的自动内存管理机制,相比于 C++的手动内存管理、复杂难以理解的指针等,Java 程序写起来就方便的多。所以要深入理解 JVM 必须理解JVM虚拟内存的结构划分。
如下图:
分线程共享和线程私有两类,或者你也曾见过如下图,大致都是一样的
这样的划分只是JVM的一种规范,至于具体的实现是不是完全按照规范来?
这些区域是否都存在?这些区域具体在哪儿?不同的虚拟机不同的版本在实现上略有不同
虚拟机栈
虚拟机栈顾名思义首先是一个栈结构,线程每执行一个方法时都会有一个栈帧入栈,方法执行结束后栈帧出栈,栈帧中存储的是方法所需的数据,指令、返回地址等信息,虚拟机栈的结构如下:
1、虚拟机栈是基于线程的:哪怕你只有一个 main() 方法,也是以线程的方式运行的。在线程的生命周期中,参与执行的方法栈帧会频繁地入栈和出栈,虚拟机栈的生命周期是和线程一样的。
2、栈大小:每个虚拟机栈的大小缺省为 1M,
3、堆栈溢出:栈帧深度压栈但并不出栈,导致栈空间不足,抛出java.lang.StackOverflowError ,典型的就是递归调用,
4、栈帧的组成:栈帧大体都包含四个区域:(局部变量表、操作数栈、动态连接、返回地址),如下图所示:
1、局部变量表:存放我们的局部变量的(方法内的变量)。首先它是一个32 位的长度,主要存放我们的 Java 的八大基础数据类型,一般 32 位就可以存放下,如果是 64 位的就使用高低位占用两个也可以存放下,如果是局部变量是一个对象,存放它的一个引用地址即可。
2、操作数栈:存放 java 方法执行的操作数的,它也是一个栈,操作的的元素可以是任意的 java 数据类型,一个方法刚刚开始的时候操作数栈为空,操作数栈本质上是JVM执行引擎的一个工作区,方法在执行,才会对操作数栈进行操作。
3、动态链接:Java 语言特性多态
4、完成出口:正常返回(调用程序计数器中的地址作为返回)、异常的话(通过异常处理器表<非栈帧中的>来确定)
本地方法栈
本地方法栈和虚拟机栈类似,具备线程隔离的特性,不同的是,本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法,虚拟机规范里对这块所用的语言、数据结构、没有强制规定,虚拟机可以自由实现它,hotspot把它和虚拟机栈合并成了1个。
程序计数器
较小的内存空间,存储当前线程执行的字节码的偏移量;各线程之间独立存储,互不影响。
方法区
方法区(Method Area)是可供各线程共享的运行时内存区域,主要用来存储已被虚拟机加载的类信息、常量、静态变量、JIT编译器编译后的代码缓存等等,它有个别名叫做:非堆(non-heap),主要是为了和堆区分开。
方法区中存储的信息大致可分以下两类:
1、类信息:主要指类相关的版本、字段、方法、接口描述、引用等
2、运行时常量池:编译阶段生成的常量与符号引用、运行时加入的动态变量
运行时常量池
在jvm规范中,方法区除了存储类信息之外,还包含了运行时常量池。这里首先要来讲一下常量池的分类
常量池可分两类:
1、Class常量池(静态常量池)
2、运行时常量池
3、字符串常量池(没有明确的官方定义,其目的是为了更好的使用String ,真实的存储位置在堆)
堆
1、堆被划分为新生代和老年代( Tenured ),
2、新生代与老年代的比例的值为 1:2 ,该值可以通过参数 –XX:NewRatio来指定 。
对象
字节码
类加载
GC
MQ专题
NoSQL专题
Redis
1.redis挂了,锁还没有同步到从节点,然后又会加锁,怎么处理?
多线程专题
分布式专题
分布式文件系统
fastdfs、oss,好处,架构等
高并发
1、对于高并发场景,如何保证数据库的一致性(乐观锁)
zookeeper
1、zookeeper的高可用原理和选举算法
数据库专题
数据库相关
1、必会面试题之数据库
2、简述事务的四大特性
3、请简述什么是事务,事务都有哪些属性?
4、简述事务的隔离级别
5、MySQL的两种存储引擎区别(事务、锁级别等等),各自的适用场景
6、MySQL都支持那些索引?
7、列举数据库索引的优点和缺点,并说明创建索引需要注意的哪些事项
8、索引类型有哪些?
9、什么样的字段适合建索引?
10、使用索引查询一定能提高查询的性能吗?为什么?
11、有哪些操作会导致索引失效?
12、简要解释主键、外键、视图、索引、存储过程、触发器、同义词,并说明他们的用处?
13、主键和外键的区别?
14、Mysql中字段类型char、varchar和varchar2有什么区别?
15、SQL中表达完整性约束的规则主要有哪几种?
16、SQL语法中,左联接、右联接、等值联接的区别是?
17、SQL语法中where和having的区别?
18、TimeStamp和date的区别是什么?
19、Char varchar和varchar2有什么区别?
20、悲观锁和乐观锁有什么区别,表锁和行锁有什么区别?分别如何实现?
21、简述什么是数据库的并发控制,并发控制的主要方法是什么?
22、触发器的作用是什么?
23、什么是存储过程? 用什么来调用?
24、存储过程和存储函数的区别?
25、你所熟知的数据库语句优化的方案有哪些?
26、MySQL的如何实现分页?
27、MySQL中经常使用到的函数有哪些?
28、如何数据库中的amount字段,保存了0.0000001数据,请问对应的Java对象需要用什么去接收?
算法专题
网络编程专题
设计模式
- https://www.cnblogs.com/zailushang1996/p/8601808.html
- https://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html
如何自己设计一个类似 Dubbo 的 RPC 框架?
面试题
如何自己设计一个类似 Dubbo 的 RPC 框架?
面试官心理分析
说实话,就这问题,其实就跟问你如何自己设计一个 MQ 一样的道理,就考两个:
- 你有没有对某个 rpc 框架原理有非常深入的理解。
- 你能不能从整体上来思考一下,如何设计一个 rpc 框架,考考你的系统设计能力。
面试题剖析
遇到这类问题,起码从你了解的类似框架的原理入手,自己说说参照 dubbo 的原理,你来设计一下
举个栗子,我给大家说个最简单的回答思路:
- 上来你的服务就得去注册中心注册吧,你是不是得有个注册中心,保留各个服务的信息,可以用 zookeeper 来做,对吧。
- 然后你的消费者需要去注册中心拿对应的服务信息吧,对吧,而且每个服务可能会存在于多台机器上。
- 接着你就该发起一次请求了,咋发起?当然是基于动态代理了,你面向接口获取到一个动态代理,这个动态代理就是接口在本地的一个代理,然后这个代理会找到服务对应的机器地址。
- 然后找哪个机器发送请求?那肯定得有个负载均衡算法了,比如最简单的可以随机轮询是不是。
- 接着找到一台机器,就可以跟它发送请求了,第一个问题咋发送?你可以说用 netty 了,nio 方式;第二个问题发送啥格式数据?你可以说用 hessian 序列化协议了,或者是别的,对吧。然后请求过去了。
- 服务器那边一样的,需要针对你自己的服务生成一个动态代理,监听某个网络端口了,然后代理你本地的服务代码。接收到请求的时候,就调用对应的服务代码,对吧。
这就是一个最最基本的 rpc 框架的思路,先不说你有多牛逼的技术功底,哪怕这个最简单的思路你先给出来行不行?
该面试思路引申问题:
- RPC
- MQ
- Zookeeper
- netty
- nio
- hessian
- 负载均衡算法
- 轮询
- 动态代理