一、面试要点
1.1 面试需要关注的问题
- 项目信息:项目内容、工作地点、是否稳定是否出差
- 加班调休:年假、周末双休、是否加班加班补助
- 试用社保:试用期时长、试用期缴纳社保、缴纳比例
- 工资薪酬:一年几薪、其他福利提供食宿、月薪多少
1.2 简历要点
- 简历名称:全名 + 求职岗位 + 手机号码
- 简历内容:专业和工作经验只写和求职岗位相关联的,突出核心竞争力
- 简历格式:PDF
- 简历照片:用证件照
- 投递时间:工作日8:30 - 10:00是黄金时间段
- 投递邮件:标题:全名 + 求职岗位 + 是否有经验 + 手机号码,正文:简单的自我介绍 + 求职意向 + 工作经验 + 优点
1.3 求职软件要点
绝大多数的招聘软件的人才管理界面都差不多。会显示候选人的 头像,姓名,基本信息(年龄,工作时长,学历,居住地),活跃度,教育经历,工作经历。工作经历里直接显示入离职时间,工作时长,公司,职位。HR筛的时候看到硬性要求(年龄学历专业等)不合适的候选人直接就点不合适了,是不会再点进去看详细简历的。大家求职时看到的“感兴趣”,应该是这里的“合适”。HR筛硬性条件的时候会直接点“合适”“不合适”。所以“感兴趣”其实指的是硬性条件符合要求了。之后HR还会在“合适”的候选人里筛选更匹配岗位的候选人联系。
如果大家要找工作,在线简历一定要好好写!!!因为前程无忧只有候选人投递之后后台才能看到附件简历,而且如果候选人太多有时候HR会懒得下载一个个附件简历,直接看在线简历,如果在线简历写得很烂可能HR就直接pass了。
1.4 职业技能术语
- 数据库
- 熟悉Oracle、MySQL、SQL Server数据库,熟练使用SQL语句操作数据库;
- 掌握Java、Oracle、MySQL基本语法;
- 熟练掌握运用SQLServer、Oracle、MySql等数据库及操作语言;
- 熟练Oracle数据库的操作,能够编写存储过程,熟悉Mysql和SqlServer数据库;
- 前端
- 熟练使用HTML、CSS、JavaScript三大前端语言;
- 熟悉常用的前端语言框架,如jQuery;
- 掌握HTML5、JavaScript、VUE前端技术;
- 熟练使用jsp、servlet进行web应用开发;
- 能熟练使用Javascript、Ajax、CSS技术提高系统的友好性、可操作性、提升用户体验效果;
- 灵活使用Html、DHtml等网页设计语言,理解XML标记语言;
- 框架
- 掌握Spring Boot开发框架,使用该框架搭建项目;
- 掌握Spring Boot开发框架及Spring Cloud常用组件;
- 熟练使用Spring、Struts、Mybatis、Hibernate常用框架;
- 掌握Dubbo、Zookeeper服务框架;
- 精通Struts、Hibernate、Spring开源框架,并熟练运用MVC设计模式,并具有使用这些技术的丰富经验。
- 开发模式
- 熟练使用SpringMVC开发模式;
- 熟练应用Struts+Hibernate,SSH2框架和MVC三层架构开发模式;
- 编程思想
- 熟练面向对象编程思想,扎实的Java基础知识;
- 具有面向对象思想,扎实的编程功底以及良好的编码习惯;
- 性能
- 掌握Redis缓存技术、Solr索引技术;
- 掌握RocketMQ队列;
- 掌握RocketMQ队列,优化系统性能;
- web
- 熟悉servlet的生命周期,可以用servlet完成小型web项目;
- 能熟练运用servlet中的Filter和Listener;
- 熟悉servlet中的cookie和session;
- 熟练使用Jsp,HTML,JavaScript,Jquery,Ajax,Css等WEB客户端技术;
- 版本控制
- 熟练使用Git、SVN工具进行协同开发;
- 熟练使用SVN、Git进行版本控制和代码维护
- 开发工具
- 熟练使用Eclipse、Maven等开发和构建工具;
- 中间件
- 掌握Tomcat、Weblogic容器部署及使用方法;
- 熟练掌握Tomcat、Weblogic、JBoss等Web容器以及J2EE容器的配置以及部署;
- 系统
- 掌握Linux操作系统,熟练使用常用Linux命令;
- 了解Linux系统下常用开发工具的安装和操作;
- 缺陷管理
- 掌握Jira、禅道、BugFree等缺陷管理工具;
- 其他
- 了解http协议,可以通过http watch查看b/s的信息交互;
- 了解设计模式,代码重构和项目过程管理,能够编写文档;
二、历史面试题汇总
事务的隔离级别
由低到高:读未提交、读已提交、重复读、串行化。
读现象是在多个事务并发执行时,在读取数据方面可能碰到的问题。包括脏读、不可重复读、幻读。
- 脏读:读到了脏数据,即无效数据。
- 不可重复读:是指在数据库访问中,一个事务内的多次相同查询却返回了不同数据。
- 幻读:指同一个事务内多次查询返回的结果集不一样,比如增加了行记录。
备注:不可重复读对应的是修改,即update操作。幻读对应的是插入操作。幻读是不可重复读的一种特殊场景。要想解决脏读、不可重复读、幻读等读现象,那么就需要提高事务的隔离级别。但是随之带来的,隔离级别越高,并发能力越低。所以,需要根据业务去进行衡量,具体场景应该使用哪种隔离级别。
Read uncommitted(读未提交)
提供了事务间最小限度的隔离。就是一个事务可以读取另一个未提交事务的数据。
示例:小明去商店买衣服,付款的时候,小明正常付款,钱已经打到商店老板账户,但是小明发起的事务还没有提交。就在这时,商店老板查看自己账户,发现钱已到账,于是小明正常离开。小明在走出商店后,马上回滚差点提交的事务,撤销了本次交易。
结果:小明未付钱买到了衣服,商店老板实际未收到小明的付款。
分析:商店老板查看自己的资金账户,这个时候看到的是小明还没有提交事务的付款。这就是脏读。
注意:处于该隔离级别的事务A与B,如果事务A使用事务B不提交的变化作为计算的基础,然后哪些未提交的变化被事务A撤销,这就导致了大是的数据错误变化。Read committed(读已提交)
该级别的事务可以看到其他事务对数据的修改。也就是说,在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的同一SQL在其他事务执行前后返回的是不同的结果。一个事务要等另一个事务提交后才能读取数据。
示例:小明卡里有1000元,准备与几个朋友聚餐消费,消费1000元,当他买单时(事务开启),收费系统检测到他卡里有1000元。就在检测完毕的时候,小明女朋友发现小明有私房钱,全部转走并提交。当收费系统准备扣款时,再检查小明卡里的金额,发现已经没钱了,付款不成功。小明此时就会很纳闷,明明有钱的呀,钱呢?
分析:该示例中同一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。该隔离级别可以解决脏读问题。Repeatable read(重复读)
在开始读取数据(事务开启)时,不再允许修改操作
示例:还是小明有1000元,准备跟朋友聚餐消费这个场景,当他买单(事务开启)时,收费系统检测到他卡里有1000元,这个时候,他的女朋友不能转出金额。接下来,收费系统就可以扣款成功了。
分析:重复读可以解决不可重复读的问题。Serializable(序列化)
数据库事务的最高隔离级别。在此级别下,事务串行执行。可以避免脏读、不可重复读、幻读等读现象。但是效率低下耗费数据库性能,不推荐使用。
事务的特征
原子性、一致性、隔离性、持久性。
分布式事务
分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务。分布式事务的四种方案包括两阶段提交(2PC)、补偿事务(TCC)、本地消息表(异步确保)和最大努力通知。
- 两阶段提交(2PC):这是一种通过引入协调者来协调参与者行为,并最终决定这些参与者是否要真正执行事务的方案。它分为两个阶段:准备阶段和提交阶段。在准备阶段,协调者询问参与者事务是否执行成功,参与者发回事务执行结果。如果事务在每个参与者上都执行成功,协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。存在的问题包括同步阻塞、单点问题、数据不一致和太过保守。
- 补偿事务(TCC):这是一种针对每个操作注册一个与其对应的确认和补偿(撤销)操作的方案。它分为三个阶段:Try阶段主要是对业务系统做检测及资源预留;Confirm阶段主要是对业务系统做确认提交;Cancel阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放。优点是跟2PC比起来,实现以及流程相对简单了一些,但数据的一致性比2PC也要差一些。缺点是比较明显的,在2,3步中都有可能失败。
- 本地消息表(异步确保):这是一种在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息的方案。本地事务能保证这个消息一定会被写入本地消息表中。之后将本地消息表中的消息转发到Kafka等消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。优点是一种非常经典的实现,避免了分布式事务,实现了最终一致性。
- 最大努力通知:这是一种基于可靠消息服务的分布式事务解决方案,通过定期校对的方式处理任务完成后发送消息的情况。它通过最大努力通知机制来确保消息的传递和可靠性。
Spring Cloud五大组件
- Eureka:该系统下还分为Eureka服务端和Eureka客户端,Eureka服务端用作服务注册中心,支持集群部署。Eureka客户端是一个Java客户端,用来处理服务注册与发现。
- Ribbon:客户端负载均衡,提供客户端的软件负载均衡算法。
- Hystrix:断路器,它的作用是保护系统,控制故障范围。
- Zuul:提供API网关,路由,负载均衡等作用。
- Spring Cloud Config:分布式配置,提供服务端和客户端,服务器存储后端的默认实现使用Git。
Ribbon的工作方式
通过服务发现和负载均衡策略来分配请求到不同的服务提供者,原理是使用拦截器将缓存中的服务列表经过一定算法对server name进行替换。有如下几种负载均衡策略:
- 轮询(RoundRobin):对所有请求,轮流分配到各个服务器。
- 随机(Random):随机选择一个服务器来处理请求。
- 响应时间加权(ResponseTimeWeighted):服务器响应时间越长,接收的请求越少,加权策略会减少其被选择的几率。
- 区域权重(ZoneAvoidance):复杂的策略,考虑服务器所在区域的性能和服务器的可用性。
- 并发量(ClientConfigEnabled):根据配置文件中的设定,选择并发量最低的服务器。
MySQL和Oracle的特点
- Oracle是大型数据库,MySQL是中小型数据库
- MySQL是开源的,Oracle价格非常高
- Oracle支持大并发,大访问量,是OLTP最好的工具
- 安装所用的空间差别也是很大的,MySQL安装完后才152M而Oracle有3G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能。
数据库优化
- 选取最适用的字段属性,减少类型间的转换
- 将表中的字段宽度设置的尽可能小
- 使用连接来代替子查询
- 使用联合(UNION)来代替手动创建的临时表
微服务如何划分模块
- 单一责任原则(SRP):每个微服务应只负责一个特定的功能或领域,避免多职责混合。
- 松耦合:不同微服务之间应尽量减少直接依赖,通过异步通信机制如消息队列或事件总线来解耦服务之间的直接依赖。
- 基于业务功能划分:按照业务功能进行模块划分,例如投放服务、营销活动服务、呼叫服务等。这种方法有助于保持服务的独立性和可维护性。
- 基于流程架构和业务架构:从跨系统交互流程出发,分析业务交互接口点,识别关键的业务服务能力。这种方法有助于确保每个微服务都能独立完成其业务逻辑。
- 数据驱动:基于数据架构进行模块划分,确保每个微服务能够独立处理其数据。这种方法有助于提高数据处理的效率和准确性。
- 合理划分模块数量:传统的大业务系统在划分微服务模块时,建议划分到6到8个模块比较合适,随着IT成熟度的提高,可以进一步细化。
HashMap和HashTable的区别
- 两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全
- HashMap可以使用null作为key,而Hashtable则不允许null作为key
- HashMap是对Map接口的实现,HashTable实现了Map接口和Dictionary抽象类
Cookie和Session的区别
Cookie和Session是两种常见的用于存储用户数据的技术手段,它们在实现机制、安全性、存储位置等方面存在显著区别。
- 存储位置
Cookie:存储在客户端(浏览器)上。
Session:存储在服务器端。- 安全性
Cookie:相对不安全,因为数据存储在客户端,容易被篡改或窃取。
Session:更安全,因为数据存储在服务器端,并且通常会进行加密处理。- 数据类型
Cookie:只能存储字符串类型的数据,如果需要存储非ASCII字符,还需要进行编码。
Session:可以存储任何类型的数据,是一个容器,可以存储更复杂的数据结构。- 有效期
Cookie:有效期取决于浏览器的设置,可以是永久性的,也可以是有限期的。
Session:通常在会话结束或者浏览器关闭时结束,或者在一定时间内无活动后自动结束。- 依赖关系
Cookie:不一定依赖于Session,但Session可以通过Cookie来识别用户身份。
Session:依赖于Cookie来传递会话ID,以便服务器能够识别用户。
HashMap和HashTable的线程安全性
- HashMap几乎可以等价于HashTable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而HashTable则不行)。
- HashTable是线程安全的,多个线程可以共享一个HashTable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。
- 由于HashTable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过HashTable。
- HashMap不能保证随着时间的推移Map中的元素次序是不变的。
Maven查看jar包依赖结构的命令
1
mvn dependency:tree -Dincludes='*persistence*'
persistence是你想要查找的jar包的名字的一部分。
Docker和K8S的区别
- 抽象层次不同:Docker提供了一种容器化的技术,而Kubernetes提供了一个容器编排和管理的平台。Docker更关注如何构建和打包容器,而Kubernetes更关注如何在集群上管理和运行这些容器。
- 管理范围不同:Docker主要用于本地开发和单主机环境中的容器管理,而Kubernetes适用于多主机或云环境中的容器编排和调度。
- 功能不同:Docker提供了基本的容器操作,如启动、停止和删除容器。而Kubernetes提供了更高级和复杂的功能,如自动伸缩、负载均衡和服务发现。
- 应用程序生命周期管理:Kubernetes更关注整个应用程序的生命周期管理,包括部署、自动扩展、更新和回滚。而Docker更注重容器本身的构建和管理。
- 缩放能力:Kubernetes提供了自动伸缩功能,可以根据应用程序的负载情况自动调整容器的数量。Docker只能手动进行缩放操作。
- 高可用性:Kubernetes提供了高可用性的能力,可以在集群中的不同节点上运行容器,并根据需要重新启动或迁移容器。Docker只能在单个主机上运行容器。
需要注意的是,Docker和Kubernetes并不是互斥的,而是可以互补使用的。在实际应用中,通常使用Docker来构建和打包应用程序的容器镜像,然后使用Kubernetes来管理和调度这些容器。这两个工具可以一起使用,以便获得更好的容器化和应用程序管理体验。
总而言之,Kubernetes和Docker在容器化技术中发挥着不同的角色。Docker提供了容器化的基本功能,而Kubernetes提供了容器编排和管理的高级功能。它们可以一起使用,以便帮助开发人员更好地构建、部署和管理应用程序。
三、面试技巧
在面试时,经过寒暄后,一般面试官会让你介绍项目经验。最常见的问法是,说下你最近的(或最拿得出手的)一个项目。一般来说,面试官会根据介绍的项目的背景来提问题,假设面试时会问10个问题,那么至少有5个问题会根据候选人所介绍的项目背景来问。候选人如果没有说好,那么就没法很好地引导后继问题了,就相当于把提问权完全交给面试官了。
3.1 在面试前准备项目描述
要素 | 你 | 面试官 |
---|---|---|
对你以前的项目和技能 | 很了解 | 只能听你说,只能根据你说的内容做出判断 |
在面试过程中的职责 | 在很短的时间内防守成功即可 | 如果找不出漏洞,就只能算你以前做过 |
准备时间 | 充足 | 一般在面试前30分钟阅读你的简历 |
沟通过程 | 可以出错,但是别出关键性的错误 | 不会太为难你,除非你太差 |
技巧 | 可以从网上找到足够多的面试题 | 其实就问些通用的有规律的问 |
提问方式 | 目的 |
---|---|
让你描述工作经验和项目(极有可能是最近的),看看你说的是否和简历上一致 | 看你是否真的做过这些项目 |
看你简历上项目里用到的技术,比如框架、数据库,然后针对这些技术提些基本问题 | 还是验证你是否做过项目,同时看你是否了解这些技术,为进一步提问做准备 |
针对某个项目,不断深入地问一些技术上的问题,或者从不同侧面问一些技术实现,看你前后回答里面是否有矛盾 | 深入核实你的项目细节 |
针对某些技术,问些项目里一定会遇到的问题,比如候选人说做过数据库那么就会问索引方面的问题 | 通过这类问题,核实候选人是否真的有过项目经验(或者仅仅是学习经验) |
3.2 准备项目的各种细节
这些是你实际的项目经验,那么一旦让面试官感觉你都说不上来,可信度就很低了。不少人是拘泥于项目里做了什么业务,以及代码实现的细节,这就相当于把后继提问权直接交给面试官,下表列出一些不恰当的回答方式。
回答方式 | 后果 |
---|---|
我在XX软件公司做了XX门户网站项目,这个项目做到了XX功能,具体是XX和XX模块,各模块做了XX功能,客户是XX,最后这个项目挣了XX钱 | 直接打断,因为业务需求我不需要了解,我会直接问他项目里的技术 |
(需要招聘一个Java后端开发,会SpringMVC)最近一个项目我是用C#实现的,实现了……或者我最近做的不是开发,而是测试…..或者我最近的项目没有用到SpringMVC | 提问,你最近用到SSH技术的项目是什么时候,然后在评语上写:最近XX时间没有接触过SSH |
在毕业设计的时候(或者在读书的时候,在学习的时候,在XX培训学校,在XX实训课程中) | 直接打断,提问你这个是否商业项目,如果不是,你有没有其他的商业经验,如果没有商业项目经验,除非是校招,否则就直接结束面试 |
描述项目时,一些关键要素(比如公司、时间、所用技术等)和简历上的不匹配 | 我们会深究这个不一致的情况,如果时简历造假,那么可能直接中断面试,如果真的是笔误,那么就需要提供合理的解释 |
在避免上述不恰当回答的同时,大家可以按下表的要素准备项目介绍。
要素 | 样式 |
---|---|
控制在1分钟里面,讲出项目基本情况,比如项目名称,背景,给哪个客户做,完成了基本的事情,做了多久,项目规模多大,用到哪些技术,数据库用什么,然后酌情简单说一下模块,重点突出背景,技术,数据库和其他和技术有关的信息 | 我在XX公司做了XX外汇保证金交易平台,客户是XX银行,主要完成了挂盘,实盘成交,保证金杠杆成交等功能,数据库是Oracle,前台用到JS等技术,后台用到Java的SSH,几个人做了X个月,不需要详细描述各种功能模块,不需要说太多和业务有关但和技术无关的,如果面试官感兴趣,等他问 |
要主动说出你做了哪些事情,这部分的描述一定要和你的技术背景一致 | 我做了外汇实盘交易系统,挂单成交系统,XXX模块,做了X个月 |
描述你在项目里的角色 | 我主要是做了开发,但在开发前,我在项目经理的带领下参与了业务调研,数据库设计等工作,后期我参与了测试和部署工作 |
可以描述用到的技术细节,特别是你用到的技术细节,这部分尤其要注意,你说出口的,一定要知道,因为面试官后面就根据这个问的。你如果做了5个模块,宁可只说你能熟练说上口的2个 | 用到了Java里面的集合,JDBC…等技术,用到了SpringMVC等框架,用技术链接数据库 |
这部分你风险自己承担,如果可以,不露声色说出一些热门的要素,比如Linux,大数据,大访问压力等,但一旦你说了,面试官就会直接问细节 | 这个系统里,部署在Linux上,每天要处理的数据量是XX,要求是在4小时,1G内存的情况下处理完5千万条数据,平均访客是每分钟XXX |
面试前,一定要有自信,但也要避免如下的一些情况。
要避免的情况 | 正确的做法 | 原因 |
---|---|---|
回答很简单,问什么答什么,往往就用一句话回答 | 把你知道的都说出来,重点是突出你知道的思想,框架 | 问:SSH用过吗? 答:用过 问:在什么项目里用到? 答:一个保险项目 |
说的太流利 | 适当停顿,边思考边说 | 让面试官感觉你在背准备的东西,这样后面问题就很难 |
项目介绍时什么都说 | 就说些刚才让准备的一些,而且要有逻辑的说 | 会让面试官感觉你思路太乱 |
别太多介绍技术细节,就说你熟悉的技术 | 技术面点到为止,等面试官来问 | 你说到的所有技术要点,都可能会被深问,面试官一般有自己的面试节奏,如果你在介绍时就说太多技术细节,很有可能被打断,从而没法说出你准备好的亮点 |
3.3 不露痕迹地说出面试官爱听的话
在项目介绍的时候,面试官很想听一些关键点,只要你说出来,而且这些相关问题回答的比较好,这绝对是加分项。下面表格是面试官爱听的关键点和对应的说辞。
关键点 | 说辞 |
---|---|
能考虑到代码的扩展性,有参与框架设计的意识 | 我的项目XX保险项目,用到SSH技术,数据库是Oracle,开发的时候,我会先和项目经理一起设计框架,并参与了框架的构建链接数据库的时候,我们用到了DAO,这样做的理由是,把SQL语句封装到DAO层,一旦要扩展功能模块,就可以不用做太多的改动。 |
有调优意识,能通过监控发现问题点,然后解决 | 在开发阶段,我就注意到内存的性能问题和SQL运行的时间问题,在压力测试阶段 ,我会通过XX工具来监控内存和数据库,发现待提升的代码点,然后通过查资料来优化,最后等项目上线后,我们会部署监控系统,一旦发现内存和数据库问题,我们会第一时间解决。 |
3.4 一定要主动
找一切机会说出你拿得出手的,而且当前也非常热门的技术。
3.5 不要犯低级错误
下列是会导致你直接出局的错误回答。
错误类型 | 导致的后果 |
---|---|
前后矛盾,后面的回答无法证明你的项目描述,比如一开始说用到了SpringMVC,后面没法说出最基本的实现,比如不知道Spring有哪些类,或者没法说出项目的细节。 | 我会怀疑这个项目的真实性,我就会进一步问:数据库用什么,数据量多少,多少人做了多长时间,一旦再出现明显漏洞,比如一个小项目用到非常多的时间,那么就不仅仅是技术问题,而是在面试过程中企图蒙混过关的性质了。 |
项目里一定会用到的基本概念性问题都回答不上,Spring的依赖注入概念是什么,怎么用的,或者Hibernate的一对多怎么实现。 | 一旦被发现概念不知道,就会通过更多问题确认,如果被确认很弱,这就相当严重,因为技术能力差和技术没用过是两个截然不同的状况,技术没用过会导致直接出局 |
面试时说出的工作经验和简历上的不一致。 | 我会直接怀疑简历时编的,会让候选人解释,即使是说简历写错了,我也会问比较深入的问题来核实他的技能和能力。 |
简历上的技能描述和回答出来的明显不一致,比如明明是只会简单的Linux,但吹的天花乱坠。 | 我会通过一些比较深的问题核实其他技能,找出其他方面吹嘘的水分。所以建议,你可以适当的夸张,但是别太过分,比如你在项目里没搭建框架但平时学习时搭建过,你可以写XX项目的框架是你搭建的,但你不能说你是一个架构师,非常了解项目的底层。 |
让面试官感觉你不稳定,很浮躁,比如说话不庄重,或者面试时打扮非常不正规,就穿背心来。 | 即使你技术再好,这个会可能导致你直接出局。我对油嘴滑舌的候选人一般会直接写上不好的评语。 |
明说不能加班,不能出差。 | 其实虽然有这一问,但是公司里未必真的会加班出差,但听到这类回答,说明这个人不能承受大压力工作,或者责任心不强,大多数公司是不会要这种人的。 |
四、HR面
请你自我介绍一下你自己
- 企业最希望知道的是求职者能否胜任工作。
- 介绍自己最强的技能、最深入研究的知识领域、个性中最积极的部分、做过的最成功的事,主要的成就等。
- 条理要清晰,层次要分明,不宜过长。
- 企业很重视一个人的礼貌,求职者要尊重考官,在回答每个问题之后都说一句“谢谢”,企业喜欢有礼貌的求职者。
你有什么业余爱好
- 体现自己积极主动的性格、团队合作的精神、深入学习的意愿等。
你最大的优点和缺点
- 优点可以回答沉着冷静、条理清楚、立场坚定、顽强向上、乐于助人和关心他人、适应能力和幽默感、乐观和友爱等。
- 通常不希望听到直接回答的缺点是什么等,如果求职者说自己小心眼、爱忌妒人、非常懒、脾气大、工作效率低,企业肯定不会录用你。
- 绝对不要自作聪明地回答“我最大的缺点是过于追求完美”,有的人以为这样回答会显得自己比较出色,但事实上,他已经岌岌可危了。
- 企业喜欢求职者从自己的优点说起,中间加一些小缺点,最后再把问题转回到优点上,突出优点的部分,企业喜欢聪明的求职者。
为什么选择我们公司
- 面试官试图从中了解你求职的动机、愿望以及对此项工作的态度。
- 建议从行业、企业和岗位这三个角度来回答。
- 面试前一定要做好功课,可以在网上查一下该公司的主营业务、发展方向和近期重大战略调整等。
- 可以回答一些详细的原因,像“贵公司的高技术开发环境很吸引我”、“贵公司在近几年来在市场上很有竞争力”、“贵公司能够给我提供一个与众不同的发展路径”。这些都显示出你已做了一些调查,也说明你有较为具体的职业规划。
如果我录用你,你将怎样开展工作
- 如果应聘者对于应聘的职位缺乏足够的了解,最好不要直接说出自己开展工作的具体方法。
- 可以尝试采用迂回战术来回答,如“首先听取领导的指示和要求,然后就有关情况了解和熟悉,接下来制定一份近期的工作计划并报领导批准,最后根据计划开展工作”。
我们为什么录用你
- 招聘单位一般会录用这样的应聘者:基本符合条件、对这份工作感兴趣、有足够的信心。
- 如“我符合贵公司的招聘条件,凭我目前掌握的技能、高度的责任感和良好的适应能力及学习能力,完全能胜任这份工作”。
你在前一家公司的离职原因是什么
- 避免把离职原因说的太详细、太具体。
- 避免掺杂主观负面感受,如“太辛苦”、“人际关系太复杂”、“管理太混乱”、“公司不重视人才”、“公司排斥我们某某员工”等。
- 但也不能躲闪、回避,如“想换换环境”、“个人原因”等。
- 不能表现出对上一份工作的怨言,最好从自身发展来表明离职原因,比如,遭遇职业的天花板,或前份工作与自己的长期职业生涯规划不合等,也可以表明应聘的新职位对自己是很好的机会。
你对加班的看法
- 回答提示:实际上好多公司问这个问题,并不证明一定要加班,只是想测试你是否愿意为公司奉献。
- 回答样本:如果是工作需要我会义不容辞加班,我现在单身,没有任何家庭负担,可以全身心的投入工作。但同时,我也会提高工作效率,减少不必要的加班。
你对薪资的要求
- 回答提示:如果你对薪酬的要求太低,那显然贬低自己的能力;如果你对薪酬的要求太高,那又会显得你分量过重,公司受用不起。一些雇主通常都事先对求聘的职位定下开支预算,因而他们第一次提出的价钱往往是他们所能给予的最高价钱,他们问你只不过想证实一下这笔钱是否足以引起你对该工作的兴趣。
- 回答样本一:我对工资没有硬性要求,我相信贵公司在处理我的问题上会友善合理。我注重的是找对工作机会,所以只要条件公平,我则不会计较太多。
- 回答样本二:我受过系统的软件编程的训练,不需要进行大量的培训,而且我本人也对编程特别感兴趣。因此,我希望公司能 根据我的情况和市场标准的水平,给我合理的薪水。
- 回答样本三:如果你必须自己说出具体数目,请不要说一个宽泛的范围,那样你将只能得到最低限度的数字。最好给出一个具体的数字,这样表明你已经对当今的人才市场作了调查,知道像自己这样学历的雇员有什么样的价值。
你何时可以入职
- 最好回答“如果被录用的话,到职日可按公司要求的时间入职”。如果做不到,可以告知用人单位,但需要表明愿意在能力所及范围内尽快到岗。
说说你对行业、技术发展趋势的看法
- 面试前可以在网上查找该行业、该企业的相关信息、做足功课,包括公司各个部门发展情况。企业欢迎的是知己,而不是盲人。
在五年的时间内,你的职业规划
- 回答提示:这是每一个应聘者都不希望被问到的问题,但是几乎每个人都会被问到,比较多的答案是“管理者”。但是近几年来,许多公司都已经建立了专门的技术途径。这些工作地位往往被称作“顾问”、“参议技师”或“高级软件工程师”等等。当然,说出其他一些你感兴趣的职位也是可以的,比如产品销售部经理,生产部经理等一些与你的专业有相关背景的工作。要知道,考官总是喜欢有进取心的应聘者,此时如果说“不知道”,或许就会使你丧失一个好机会。最普通的回答应该是“我准备在技术领域有所作为”或“我希望能按照公司的管理思路发展”。
你朋友对你的评价
- 回答提示: 想从侧面了解一下你的性格及与人相处的问题。
- 回答样本一:我的朋友都说我是一个可以信赖的人。因为,我一旦答应别人的事情,就一定会做到。如果我做不到,我就不会轻易许诺。
- 回答样本二:我觉的我是一个比较随和的人,与不同的人都可以友好相处。在我与人相处时,我总是能站在别人的角度考虑问题。
你还有什么问题要问吗
- 回答提示:企业的这个问题看上去可有可无,其实很关键,企业不喜欢说“没问题”的人,因为其很注重员工的个性和创新能力。企业不喜欢求职者问个人福利之类的问题,如果有人这样问:贵公司对新入公司的员工有没有什么培训项目,我可以参加吗?或者说贵公司的晋升机制是什么样的?企业将很欢迎,因为体现出你对学习的热情和对公司的忠诚度以及你的上进心。
如果工作一段时间发现你不适合这个职位怎么办
- 回答提示:一段时间发现工作不适合我,有两种情况:①如果你确实热爱这个职业,那你就要不断学习,虚心向领导和同事学习业务知识和处事经验,了解这个职业的精神内涵和职业要求,力争减少差距;②你觉得这个职业可有可无,那还是趁早换个职业,去发现适合你的,你热爱的职业,那样你的发展前途也会大点,对单位和个人都有好处。
五、技术面
ArrayList和LinkedList底层
ArrayList的底层是一个Object类型的数组,初始时,数组的长度为0。当添加元素时,数组会根据需要自动扩容。当ArrayList中的元素数量超过当前数组的容量时,ArrayList会创建一个新的更大的数组,并将原数组中的元素复制到新数组中。默认情况下,ArrayList会将数组的大小扩大为当前容量的1.5倍。ArrayList通过索引来访问元素,ArrayList在随机访问元素时效率很高。当插入或删除元素时,ArrayList需要移动其他元素以保持数组的连续性,在需要频繁插入和删除元素的情况下,建议使用LinkedList。
LinkedList底层的数据结构是基于双向循环链表的,且头结点中不存放数据。由于LinkedList是基于链表的结构,访问元素时需要从头节点开始遍历链表,直到找到目标元素。因此,访问效率比ArrayList要低。在链表中插入或删除元素时,只需要修改相应节点的引用即可,不需要像数组那样移动其他元素。因此,插入和删除元素的操作比ArrayList高效。
MyBatis中#与$的区别
- #是预编译处理,$是字符串替换。
- MyBatis在处理#时,会将SQL中的#替换为?号,使用PreparedStatement的set方法来赋值;在处理$时,就是把$替换成变量的值。
- 使用#可以有效的防止SQL注入,提高系统安全性。
Callable和Runnable的区别
- Runnable没有返回值,而实现Callable接口的任务线程能返回执行结果。
- Callable接口实现类中的run方法允许异常向上抛出,可以在内部外理try catch,但是Runnable接口实现类中run方法的异常必须在内部处理,不能抛出。
重写和重载的区别
- 定义不同:重载是定义相同的方法名、参数不同,重写是子类重写父类的方法
- 范围不同:重载是在一个类中,重写是子类与父类之间的
- 多态不同:重载是编译时的多态性,重写是运行时的多态性
- 参数不同:重载的参数个数、参数类型、参数的顺序可以不同,重写父类子方法参数必须相同
- 修饰不同:重载对修饰范围没有要求,重写要求重写方法的修饰范围大于被重写方法的修饰范围
git pull和fetch
git fetch是下载远程仓库的最新更新,但不会自动合并,git pull是下载远程仓库的最新更新并自动合并。
数组和链表的区别
- 数组从栈上分配内存,链表从堆上分配内存
- 数组在内存中连续,链表在内存中不连续
- 数组的长度固定,不支持动态改变数组的大小,链表支持动态增删元素
- 数组存在越界风险,链表无越界风险
- 数组通过下标访问,访问效率高,链表从头遍历,访问效率低
- 数组的使用场景:当线性表的操作操作主要是进行查找,很少插入和删除时使用,链表的使用场景:当线性表要求频繁插入和删除时使用
Spring Boot的核心功能
Spring Boot最核心的功能就是自动配置,这一切都基于约定优于配置的原则,使用Spring Boot时我们只需引入对应的Starters,Spring Boot启动时便会自动加载相关依赖,配置相应的初始化参数,以最快捷简单的形式对第三方软件进行集成,这便是Spring Boot的自动配置功能。
extends和implements区别
extends是继承某个类,继承之后可以使用父类方法,也可以重写弗父类方法, implements是实现一个或多个接口,实现一个接口就是要实现该接口的所有方法,抽象类除外
TCP与UDP区别
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,适用于要求可靠传输的应用。UDP是一种无连接的、不可靠的、基于数据报文的传输层协议,适用于实时应用。
设计模式
- 单例模式
- 懒汉式:为了不让其他类直接访问该成员,懒汉式单例在使用时创建对象。懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。
- 饿汉式:在类加载时创建一个对象。饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。
- 工厂模式
- 简单工厂模式:对于简单工厂,用于生产同一结构中的任意产品,对于新增产品不适用。以生产“电风扇”为例,只能批量生产电风扇。
- 工厂方法模式:对于工厂方法,在简单工厂的基础上,生产同一等级结构中笃定产品,可以支持新增产品。以生产汽车为例,可以通过此工厂生产各种类型的汽车。
- 抽象工厂模式:用于生产不同种类(品牌)的相同类型(迷你,SUV),对于新增品牌可以,不支持新增类型。用于生产不同种类(品牌)的相同类型。
- 适配器模式:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。
- 装饰模式:应用场景:1.需要扩展一个类的功能;2.动态的为一个对象增加功能,而且还能动态撤销(继承不能做到这一点,继承的功能是静态的,不能动态增加)。缺点:产生过多相似的对象,不易排错。
- 代理模式:应用场景:如果已有的方法在使用的时候需要对原有的方法进行改进,采用一个代理类调用原有的方法,且对产生的结果进行控制,这种方法就是代理模式。使用代理模式,可以将功能划分的更加清晰,有助于后期维护。
- 观察者模式:多个对象间存在一对多关系,当一个对象发生改变时,会把这种改变通知给其他多个对象,从而影响其他对象的行为。
MySQL的四种搜索引擎
- InnoDB:如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
- MyISAM:如果数据表主要用来插入和查询记录,读操作明显多于写操作,存储量较大,则MyISAM引辈能提供较高的处理效率
- Memory:如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果
- Archive:如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive
使用哪一种引学需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能
Java性能调优
主要从这几个方面进行考虑
- 减少cookie的使用
- 使用Nginx静态资源缓存处理
- 文件进行压缩传输处理
- JVM进程大小设置
@RestController和@Controller的区别
- @RestController相当于@Controller和@ResponseBody合在一起的作用
- 如果使用@RestController则返回的是return里面的内容,无法返回到指定的页面
- 如果要返回到指定的页面,则需要用@Controller配合视图解析器
- 如果需要返回JSON等内容,则需要在对应的方法上加上@ResponseBody注解
http与https区别
- https协议需要到CA申请证书,需要交费
- http是明文传输,数据未加密,安全性差,https则是具有安全性的SSL加密传输协议,安全性好
- http端口是80,https端口是443
- http相应速度快,https比http更耗费服务器资源
消息队列如何防止重复消费
利用幂等性的思想
- 消息全局ID或者生成一个唯一标识(如时间戳、UUID等),作为数据库主键,每次消费消息之前根据消息ID去判断该消息是否已消费过,如果已经消费过,则不处理这条消息,否则正常消费消息,并且进行入库操作。
- 利用Redis的setnx命令,给消息分配一个全局ID,消费该消息时,先去Redis中查询有没有消费记录,无则以键值对的形式写入Redis,有则不消费该消息。
Spring Ioc和Aop
- Ioc:容器来处理创建对象、管理对象、管理之间的依赖
- Aop:对对象行为的一个监督与控制,主要是事务和日志
synchronized代码块和方法的区别
synchronized代码块比方法范围更小,更能精确地控制冲突限制访问区域,更高效。
Nginx
Nginx的特点
- 高并发、高性能、高稳定性、低资源消耗、配置简单
- 模块化架构使得它的扩展性非常好
- 异步非阻塞的事件驱动模型这点和Node.js相似
- 无需重启可不间断运行
- 热部署、平滑升级
- 完全开源,生态好
Nginx最重要的几个使用场景
- 静态资源服务
- 反向代理服务,包括缓存、负载均衡等
- API服务
Nginx的优点
- 1、作为Web服务器,Nginx处理静态文件、索引文件、自动索引的效率非常高
- 2、作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度
- 3、作为负载均衡服务器,Nginx既可以在内部直接支持Railsi和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡
- 4、在性能方面,Nginx是专门为性能优化而开发的,实现上非常注重效率。它采用内核Poll模型,可以支持更多的并发连接,最大可以支持对5万个并发连接数的响应,而且只占用很低的内存资源
- 5、在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低
- 6、在高可用方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7x24小时不间断地运行
@LoadBalanced的作用是什么
描述RestTemplate对象,用于告诉Spring框架,在使用RestTempalte进行服务调用时,这个调用过程会被一个拦截器进行拦截,然后在拦截器内部,启动负载均衡策略。
Spring Boot Actuator原生端点
原生端点分为三大类:
- 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
- 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP请求统计等。
- 操作控制类:提供了对应用的关闭等操作类功能。
Spring管理事务的方式
- 编程式事务,在代码中硬编码
- 声明式事务:在配置文件中声明
- 基于XML的声明式事务
- 基于注解的声明式事务
Spring Boot的核心注解
Spring Boot的核心注解是@SpringBootApplication,它也是启动类使用的注解,主要包含了3个注解:
- @SpringBootConfiguration:它组合了@Configuration注解,实现配置文件的功能。
- @EnableAutoConfiguration:具有打开自动配置的功能,也可以关闭某个自动配置的选项。
- @ComponentScan:用于Spring组件扫描。
Spring Boot自动配置原理是什么
@EnableAuto Configuration注解、@Configuration注解和@ConditionalOnClass注解组成了Spring Boot白动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。具体是通过Maven读取每个starter中的spring.factories文件,该文件配置了所有需要被创建在spring容器中的bean。
Spring Boot配置加载顺序
Spring Boot配置加载顺序优先级是:propertiese文件、YAML文件、系统环境变量、命令行参数。
bootstrap.properties比application.properties优先加载,而且bootstrap里面的属性不能被覆盖。
Spring Boot是否可以使用XML配置
通过@ImportResource注解加载XML配置。
Filter和Interator的区别
- Filter过滤器是在请求进入Tomcat容器之后,请求进入Servlet之前执行。Filter是Servlet规定规范的。 Interator拦截器是在Servlet和Controller控制器之间执行。Interator是SpringframeWork中规定的。
- Filter的主要作用是过滤字符编码、做一些业务逻辑判断,主要用于对用户请求进行预处理,同时也可以进行逻辑判断。Interator的主要作用是拦截用户请求,进行处理,比如判断用户登录情况、权限验证,只针对Controller请求进行处理。
SpringMVC的工作流程
- 用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)
- DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)
- DispatcherServleti调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller
- HandlerAdapter处理器适配器去执行Controller并得到ModelAndView(数据和视图),并层层返回给DispatcherServlet
- DispatcherServlet将ModelAndView?交给ViewReslover视图解析器解析,然后返回真正的视图
- DispatcherServlet将模型数据填充到视图中
- DispatcherServlet将结果响应给用户
组件说明
- DispatcherServlet:前端控制器,也称为中央控制器,它是整个请求响应的控制中心,组件的调用由它统一调度。
- HandlerMapping:处理器映射器,它根据用户访问的URL映射到对应的后端处理器Handler。也就是说它知道处理用户请求的后端处理器,但是它并不执行后端处理器,而是将处理器告诉给中央处理器。
- HandlerAdapter:处理器适配器,它调用后端处理器中的方法,返回逻辑视图ModelAndView对象。
- ViewResolver:视图解析器,将ModelAndView逻辑视图解析为具体的视图(如JSP)。
- Handler:后端处理器,对用户具体请求进行处理,也就是我们编写的Controller类。
- 数据库性能调优如何做
- 项目参与的核心设计有哪些
- HashMap及线程安全的ConcurrentHashMap,以及各自优劣势
- Java如何实现线程安全
- Synchronized和Lock哪个更好
- HashMap中的get()方法是如何实现的
- HashMap可以用在哪些场景
- JVM,垃圾回收机制,内存划分等
- SQL优化,常用的索引
- 做过哪些Java开发相关的项目
- 对哪些技术比较熟悉
- 多线程状态图,状态如何流转
- 死锁,死锁原因
- 页锁、乐观锁、悲观锁
- 乐观锁如何保证线程安全
- 用过线程池吗,对应的好处,如何用
- 两个10G的文件,里面是一些URL,内存只有1G,如何将这两个文件合并,找到相同的URL
- 1000个多并发线程,10台机器,每台机器4核的,设计线程池大小
- 代码题:两个有序数组,数组中存在重复数字,合并成一个有序数组,去除重复数字
- JVM性能调优都做了什么
- 分布式系统原理:CAP,最终一致性,幂等操作等
- 高并发情况下,我们系统是如何支撑大量的请求的
- 集群如何同步会话状态
- 常用NOSQL,有做过比较
- 什么情况会出现雪崩,以及如何应对
- 负载均衡的原理
- 数据库事务属性
- 工作中觉得哪方面欠缺
- 期望薪水
- 为什么要离开现在的公司
大数据相关名词
- 数据仓库:
- Hive(基于Hadoop的数据仓库工具)
- HBase(分布式的、面向列的开源数据库)
- 框架:Hadoop(大数据处理开源框架)
- 模块:Hadoop HDFS(分布式存储系统)
- 模块:Hadoop YARN(任务调度和集群资源管理)
- 模块:Hadoop MapReduce(基于Hadoop YARN的大型数据集并行计算处理系统)
- 其他模块:Pig(运行在Hadoop上,对大型数据集进行分析和评估的平台)
- 其他模块:Spark(Hadoop数据快速通用的计算引擎)
- 其他模块:ZooKeeper(分布式的、开源的分布式应用程序协调服务,是Hadoop、HBase的重要组件)
- 数据传输:Sqoop(Hive、HBase、Hadoop等数据仓库和数据库之间的数据传输工具)