阅读 11578

两年后端的面试分享

从今年5月份就开始面试了,前前后后也有4个多月了吧,面试了几十家公司,其中有几十个人的小型创业公司,也有几百人的上市公司,踩了不少的坑,最后收到了宝能集团的offer,我也决定就去这家了。

看过很多别人的面试分享经验,这里我也做一些面试的分享吧。

前言

首先,提前要求自带简历的一般都不太靠谱,特别是小公司要求自带简历,一般都是hr不专业,不想提前把你的简历打印出来,或者说不想为了你浪费几张A4纸,所以这种公司可以直接pass了,除非你特别缺offer,生存都成困难了。

其次,可以提前问一下hr面试流程是什么样的,现在很多公司都取消笔试了。众所周知笔试没有人监督你,所以可以掏出手机(虽然我没做过,但是面试看见其他人这样做过),所以我觉得笔试作用其实没多少。如果有公司是明确要先笔试,笔试通过再进行面试,而你面试的不是应届生岗位,就要小心了,先考虑一下那家公司过去面试距离远不远,提前去看准网看一下相关的评价,再考虑要不要去面试的事。我之前面过两家都是需要笔试的,笔试没通过是直接没有后面的面试的(有的面试题非常脑残,下面上图),来回也比较远,浪费了我一个上午的时间。

面试准备

面试的时候99.99%的公司都会让你做一下自我介绍和最近做的一个项目,所以自我介绍和项目要提前打好草稿,特别是不太会说话的。

自我介绍

我觉得简洁一点就行了,一般面试官都会趁着你自我介绍的时候看简历,也没认真听你做自我介绍。

下面是我自己打的草稿:

面试官你好,非常荣幸参加贵公司的本次面试。下面我简单的介绍一下我的个人情况,我叫凌霄,xx年毕业于xxx学院xxx专业。目前在xxx公司工作,主要是从事xxx开发。 通过xxx招聘平台关注到贵公司岗位的招聘信息,这个职位比较符合我未来的职业发展,而且贵公司的业务对我都非常有吸引力,非常希望能够进入贵公司发展。

我对技术有浓厚的兴趣,专业知识面宽,技术也相对全面,责任心强,思路清晰,沟通能力好,熟悉JAVA体系, 对各种开发流程和主流架构模式,设计模式和UML,有较强的需求分析、架构设计、项目管理能力,并有丰富的实战经验; 出于对工程师文化的向往,我在研发团队管理期间,尝试了多种方法去建立良性的团队氛围,并有效的改善了研发效率; 技术是为产品支撑的,所以我现在也在熟悉产品设计过程,希望可以结合公司发展战略,营销策略,跟着团队打造出一个好的产品。

上面的可以适当简化一下,能说出来多少取决于你的记忆力。

项目介绍

这个是真的要提前准备好说辞,不然你面试的时候边想边说,说起来磕磕巴巴的,你给面试官的第一印象就不好了,至少说明你的表述能力不强。

介绍项目的话可以不用太紧张,面试官才拿到你的简历看多久,所以肯定是对你自己的项目是最熟悉的。需要注意的地方就是不要只讲一些业务相关的,面试官不需要知道这些,他只关心你的技术能力是否足够,通过你的描述知道你使用了什么技术,再根据相关的技术进行提问。

贴一下我的草稿:

我在xx公司做的xx系统,客户主要是xx,项目的功能主要是提供代理雨伞,代理快递,代理订餐,图书借阅等服务,后台用的是主体架构是使用Spring Cloud,微服务模块划分为xxx,我主要负责其中xxx几个模块的开发, orm用的是mybatis,数据库是用的mysql,缓存是用的redis,前台用到了vue技术。共有xx个同事参与开发,整个项目持续了xx时间。

面试官会对他感兴趣的点进行提问。

项目中遇到的难题

让我想起小学时经常写的作文:最难忘的一件事。这可真是太艹了,没想到小学学的知识现在派上了用场。

项目中遇到的难题,解决了之后其实都不是什么难题了。我列几个点可以参考一下:

  1. 跨域
  2. 任务调度幂等性
  3. 使用mq遇到的问题
  4. 分布式系统中的事务问题
  5. 内存溢出问题

当然最后还是要自己的专业技能扎实,才能获取源源不断的offer。

面试经验

接下来分享一些这段时间的面试公司

腾云亿想

腾讯云全资子公司,其实就是腾讯云的外包公司

  1. 数据库有哪几种索引
  2. springboot原理,如何实现的自动装配
  3. springboot打包成jar之后,怎么做到不重新打包修改他的properties配置文件
  4. jvm调优做过吗,有哪些参数可以调,具体怎么调

第一次面试,尴尬的是我基本上没打上来,只回答上了springboot原理,居然还叫我去hr面,要把这个岗位确定下来,我拒绝了。

垒知科技研究院

上市公司,原来叫做建研集团,做建筑相关的工程。

  1. 你用过SpringBoot的哪些注解

    1. @component,@service,@controller,@controlleradvice,@Repository
    2. @Autowired,@Inject,@Resource,@Qualifier,一般@Resource单独使用,@Qualifier会和@Autowired一起用
    3. @dependsOn
    4. @Configuration,@bean, @ComponentScan,
    5. @Aspect,@PointCut,
    6. @Scope,@PostConstruct,@PreDestory
  2. Spring的Bean默认是单例还是多例,我想改成多例的怎么办

  3. 项目中用到了rabbitmq,使用中遇到什么问题

  4. rabbitmq重复消费怎么解决,除了数据库里查记录还有其他什么方法

  5. 分布式锁怎么实现,redis实现方式死锁怎么解决

    我:数据库实现,redis实现,zookeeper实现。redis加上一个失效时间

  6. mysql索引怎么实现的,btree索引有什么特点

  7. 现在有一个联合索引(A,B) 我有一个sql语句是

    select xxx from xxx where A=xxx 会用到索引吗

    select xxx from xxx whereB=xxx 会用到索引吗 为什么会是最左匹配原则

  8. ArrayList实现了哪些接口

    说了List、Cloneable、Serializable,我觉得他应该是想问RandomAccess接口,当时没回答上这个

  9. 代码优化怎么做的

  10. nginx怎么配置负载均衡

  11. 闭锁怎么用,什么原理

  12. 二分查找法,时间复杂度

自我感觉回答得不是很好,但是第二天收到了复试邀请,还挺惊讶的。

复试先是做一套性格测试题,然后就是项目主管来面试我,问了一下毕业学校,为啥学校挺好还是科班出身,为啥毕业会进小公司。然后问了下我现在的职位级别,接下来就巴拉巴拉开始夸他们公司。

然后就是cto面试,也没问技术,就问了问家里的情况,未来职业规划,然后说他是从华为出来的,公司实行狼性文化,加班是经常的。正题来了,他说待遇是不会高于我上家公司的,但是进他们公司未来的发展肯定会很好。我就有点不太舒服,就叹气嘛,然后他说我唉声叹息比较悲观,进公司会影响其他人,他需要的是一个时刻保持乐观的人,能给团队带来活力。

我整个人都傻了。

西南凯亚

中国民航的子公司,是一家国企。

先要提前一天做一套线上笔试题,不管有没有通过,第二天都是要去面试的。

主要是项目相关的,业务上的东西问得多

代码优化

mysql优化

jvm内存模型

spring cloud用过哪些组件 讲讲熔断机制

为什么离开上家公司

不是很难但是没有offer,心态崩了。

睿沿科技

做人脸识别相关的,和我上家公司做的产品差不多。

  1. Hashmap原理

  2. ConcurrentHashMap原理,为什么多线程条件下性能这么好

    我从sync在1.6做的优化谈的,他从锁的粒度方面谈的

  3. 项目相关

  4. 代码优化

  5. mysql优化

  6. spring的aop怎么实现的

  7. 每天抓拍的数据量比较大,有做过分库分表吗

    用的shardingjdbc 还有mycat,中小公司一般用shardingjdbc,

  8. Rabbitmq实现原理

    不知道

后面两个没有回答好吧,所以没有后续了。

小海豚能源科技

这家应该是要找做全栈的吧,开头就问我好几个前端相关的,我直接懵了,理所当然的没有后续了

  1. 用过jquery哪些框架

  2. es6语法熟悉吗

  3. vue用过哪些组件

  4. spring用过哪些注解

  5. 使用@autowired注入的时候,如果这个接口有多个实现,怎么指定注入哪一个的实现

  6. eureka搭过集群吗

  7. mysql优化,什么时候不会用到索引

    1. select *,可能会导致不走索引

    2. where后面有函数运算,导致不走索引

    3. 索引不适用于隐式转换的情况,比如你的SELECT * FROM T WHERE Y = 5 在Y上面有一个索引,但是Y列是VARCHAR2的,那么Oracle会将上面的5进行一个隐式的转换,SELECT * FROM T WHERE TO_NUMBER(Y) = 5,这个时候也是有可能用不到索引的。

    4. like查询使用通配符开头不会用到索引

    但是这些好像不是他想要的答案,我也猜不透。。

  8. 接受长期出差吗

开通金融

做互联网金融的,公司总部在北京,我面试的时候是在成都的新网银行公司,看这个模式应该就是驻场开发了,但是公司本身不是外包。

  1. springboot和spring的不同
  2. springboot特性,自动装配怎么实现的
  3. spring用到哪些组件,具体场景
  4. spring默认是单例还是多例,全局变量会有什么问题
  5. spring事务传播行为、隔离级别
  6. aop实现方式,jdk动态代理和cglib动态代理区别
  7. jdk lambda表达式几种使用方式,取最大和最小值,list转map,list中有重复的怎么办
  8. 线程池 有哪些参数,各个参数的意义
  9. ioc容器有什么优点
  10. jvm 堆栈,区别,线程共享还是线程私有的
  11. springcloud组件、用途,负载均衡的几种算法
  12. 分布式事务怎么做的
  13. mybatis一对多,多对多怎么做
  14. jpa和mybatis区别
  15. vmstat命令干嘛的
  16. redis查看内存占用命令
  17. mysql导入大量数据怎么优化
  18. mysql有一条数据死锁了,怎么排查问题,mysql表死锁,怎么排查
  19. nginx反向代理是什么,正向代理呢

这次面试回答得挺好的,hr也打了好几次电话说面试官对我挺有意向的,就是一顿操作猛如虎,一问工资0.9。而且我当时还是在职,要求我一周到岗,我就没去。

兰亭集势

做海外电商的公司,但是进去之后是做一些小系统的开发,问的问题有点像校招一样,我是应届毕业生说不定能答出来。

  1. 看过开源框架源码吗,SpringBoot自动装配原理
  2. 写个冒泡,写个单例模式
  3. mybatis和jdbc怎么防止sql注入
  4. 单一职责原则是什么,里式替换原则是什么
  5. 3NF是什么
  6. 接口定义一个变量,这个变量的默认作用域
  7. 有没有自己搭建过微服务
  8. linux怎么看java进程,除了jps和top命令还有其他的吗
  9. 最近看什么书,我回答多线程并发相关的,他:没用,要在项目里用才有用
  10. 最近在学什么技术?docker,他:没用,很简单不需要学习
  11. 有个部门表,怎么设计他的字段,获取一个部门下的所有子部门,除了递归还有什么方法?加个code字段,通过部门前缀like查询

京东物流(自带简历)

朋友内推的,听他说是稳了,去面就能过,结果还是翻车了。

  1. java特点描述一下,继承封装多态分别是什么意思

  2. synchronized和lock区别

  3. ConcurrentHashMap线程安全怎么实现的

  4. 创建线程的几种方式,创建线程池几个参数的含义,线程饱和策略

  5. sleep和wait区别

  6. spring是单例还是多例,多线程并发会出现什么问题

  7. SpringBoot如何解决跨域,具体怎么配置

  8. 全局异常捕获怎么做的

  9. SpringSecurity的前后端分离,登录怎么做的

    我:拦截登录的url,然后获取到用户名和密码,把这个用户名和密码交给manager,manager会交给具体的provider处理,provider会调用UserDetailsService的方法完成验证。

    这里是我失误了,他说用户名和密码时通过getattribute 获取到的吗,我说是的。

  10. 怎么设计一个安全的对外接口

  11. 单线程的redis为什么这么快

  12. redis持久化方式

  13. 什么是聚簇索引,什么是非聚簇索引

  14. mysql事务隔离级别

  15. 你觉得你能承担独立开发的任务吗

其他问题回答得挺好的,自我感觉不错,本来以为能收到offer的,但是朋友说那个面试官觉得我不行,不能承担独立开发系统的任务,估计是第8个问题回答失误了吧,其他我觉得我回答没有问题。

教育家网络科技

面试的人比较多,所以是群面,一个面试官对应多个面试者。虽然我回答得比另外一个面试者好很多,但是没有收到offer,很迷,真的很迷。

  1. 介绍项目,然后基本上就围绕着项目的业务说
  2. 对金额的计算用什么类型,数据库中用什么类型存储
  3. SpringBoot怎么自定义注解
  4. mysql优化,like查询的时候,数据量很大,如果like查询以%开头,不会走索引,怎么优化。多表关联查询,怎么优化
  5. 代码优化怎么做的,平时重构从哪方面考虑

海康交通大数据

海康下面的一家分公司,主要做车辆交通相关大屏数据统计报表之类的,面试官和我一个学校的学长,开头就问我是哪个老师教的,吓我一跳哈哈哈哈,我以为给老师丢脸了。

  1. HashMap原理,底层结构,1.7和1.8区别,头插法还是尾插法、线程安全吗
  2. ConcurentHashMap在什么地方加的锁,1.7和1.8区别,1.7用的segment,1.8用的synchronized
  3. lock和synchronized这两个区别,1.6之后对synchronized做了什么优化
  4. 偏向锁、轻量级锁是怎么做到的,我回答的是每个对象都有对象头,对象头里做的标记,然后他问我对象头里有哪些信息
  5. list和数组区别,哪个会内存泄漏,查询的话哪个快点。我觉得查询是一样快的,因为list本来底层就是数组
  6. 线程池各个参数介绍一下,原理是什么。你常用哪种线程池,为什么?
  7. 有哪些队列,你线程池一般用哪种队列
  8. spring怎么解决循环依赖
  9. jdk动态代理和cglib区别,哪个更快,有没有看过他们生成的字节码文件
  10. cloud相关的组件用过哪些,hystrix熔断原理是什么,除了线程池还有什么。熔断有个半开状态,有什么用

过程还是挺愉快的吧,就是薪资待遇没有谈到位,比较可惜。

咻电科技(自带简历)

一家做共享充电宝的公司,面试官又是和我一个学校的学长,但是没有给我放水,很生气。

问题:

  1. spring生命周期
  2. 线程池有几种创建方式
  3. 线程生命周期
  4. eureka原理
  5. lock和sync区别
  6. 有一个表有几个亿的数据,写sql分页查询怎么优化
  7. redis内存淘汰策略有几种
  8. dubbo熟悉吗
  9. 脏读幻读不可重复读,怎么解决
  10. jquery冒泡了解吗

最后问了一些学习相关的建议,收获挺多的。

武汉佰钧成

外包公司,给平安做的一个项目,电话面试,外包都喜欢这种方式。

  1. 设计模式用过哪些
  2. 代码优化怎么做的
  3. bio和nio区别
  4. springcloud用过哪些组件
  5. mysql优化,有做过sql从几秒优化到几十毫秒的吗
  6. 项目并发量多大
  7. 里式替换原则是什么
  8. tpc/ip协议
  9. 性能优化怎么做

外包不是很好进吗,但是我没有收到offer。

成都房联云码

  1. 你怎么看单例模式,写一个双重锁检测的单例模式
  2. string、stringbuilder、stringbuffer区别
  3. arraylist、linkedlist区别
  4. hashmap1.7 、1.8底层结构区别
  5. hashmap、hashtable区别
  6. 线程的生命周期
  7. spring事务传播行为,底层实现原理
  8. 声明bean的几种方式
  9. spring默认是单例还是多例,怎么实现多例
  10. springmvc流程
  11. jvm内存模型
  12. lock和synchronized区别,最大的区别是
  13. 代码优化和sql优化
  14. 分布式,session怎么解决
  15. redis优点
  16. 对外接口怎么保证安全,光是md5签名加密不行,还有其他方法吗
  17. 有一个功能模块,你会怎么安排时间,如果有一个紧急任务完成不了怎么办
  18. 平时怎么学习的

面完问了一下期望薪资,然后约了二面,二面就简单问了一下项目相关的,平时怎么学习的。三面就是hr面,给我发了offer。

翻车面试

如果各位以后有机会面试别人的话,希望对面试者多一些尊重吧。

  1. 根据简历提前准备好,针对不同的level提不同的问题
  2. 不要问一些偏门的怪题
  3. 问题都是和面试职位相关的

以下是一些翻车面试,有些公司真的把我心态搞崩了,导致后面的面试都没有发挥好。

协能共创(自带简历)

公司很小,面试官架子不小,面试全程非常不愉快,经常在我说到一半打断我,挺会嘲讽人的。面试的时候没有空间了,然后在外面靠近电梯的走廊面试的。

  1. 因为我的项目是做人脸识别相机相关的,然后他问我图片处理到算法识别经历了什么过程,我是直接调算法,最多把jpg格式的图片转成bgr格式,或者图片有旋转的,通过exif修正旋转。但是我的回答好像不是他要的,然后就直接打断我,说我不知道就直接说不知道

  2. rabbitmq用了哪些设计模式。发布订阅模式,还有其他的吗,我不知道,有知道的朋友可以告诉我一下

  3. tcp/ip协议

  4. 让你设计eureka,你怎么设计

  5. 乐观锁,悲观锁介绍一下

    我:乐观锁实际上没有加锁

    然后他就直接打断我了,发出一声嘲笑,问我:那你觉得什么是锁。

  6. jvm参数调优怎么做的

    我回答的是用的微服务部署,有的微服务访问很频繁的,就多给他设置一些内存,比如网关,一些不怎么用到的,可以设置稍微小一点。然后他说:你们这就是全凭感觉瞎设置呗

哎,面完之后心情低落了很多,难受了一下午,开始质疑我自己。

芯软科技(自带简历)

Boos直聘上标榜的上市公司,我去面试的时候顶多就看见5个人在公司,办公区域很空旷很安静。

  1. 项目介绍

  2. 挑出你在项目里做的一个模块,谈谈这个模块的整个设计

    这个我真不知道怎么回答,你说整个项目怎么设计的我还能画个架构图啥的给你瞅瞅,但是你这说到具体的模块设计,我不知道怎么说,最多给你说说数据库怎么设计的

  3. 项目并发情况

    你这公司规模还问我这个,不合适吧

  4. 听你说对linux比较熟,环境搭建过吗(tomcat之类的),有没有遇到什么问题

    搭环境都成为一个技术点来问了嘛,反正我现在用docker了。

  5. nginx你们一般做什么,正向代理一般用来干啥

  6. 你会前端啊,说说vue用history打包之后,部署到服务器,nginx需要配置什么

  7. 说说你的优点

  8. 假如你最近加班很累(你已经很累了,要猝死了),但是项目比较急,你想请假怎么跟领导沟通。

广东世纪网通信设备股份有限公司(自带简历)

第一次见到这样问问题的兄弟,挺有新鲜感的,其他公司翻来覆去的就是那几个问题。就是浪费了我的简历,打印一次一块钱,你还在我的简历上涂涂改改,我都不好意思要回简历了。

  1. java的序列化和反序列化什么含义 生成的serialVersionUID有什么用

  2. yml文件里有一些属性,怎么获取这些属性

  3. 有一个枚举类,有很多value和code,然后yml中的一个属性对应这个code的值,怎么通过code的值获取到这个对应value

    我想说循环判断,但是觉得没这么简单,所以沉默了半天。。。。

    然后他说枚举类里面有一个方法valueOf

    啊这,是他没表达清楚还是我理解错了?

  4. final干嘛的,如果有一个final Stirng a = "123",后面还可以改变吗

  5. 一般io操作会捕获异常,然后在catch中释放资源,有更简单的办法吗。

  6. 有一个list,给它按照类里的一个属性排序

  7. 有个string数组,里面有些空的值,我想去除空的,怎么做

  8. 线上有个接口速度慢,但是本地测试环境和线上环境是一样的,数据量也是一样,接口速度却很快。怎么排查

    不知道

中铁西南研究院

面了这么多家,他家是第一次把我问的说不上话的,是电话面试。

  1. java的继承和多态讲讲,继承在项目里面是怎么使用的

    在项目里怎么用我不知道怎么回答

  2. 说一下泛型

    泛型提供了编译时类型安全检测机制,该机制可以在编译时期就检测到非法的类型,避免了运行时的类型转换异常。可能不是他想要的答案?我不知道他想问什么,他说算了下一个问题。

  3. 设计模式,说说简单工厂模式和抽象工厂模式怎么实现的,区别

    我不知道怎么描述他的实现,不知道各位能不能口述出来。我语言表达能力真不行

  4. java8新特性,讲讲用过stream里的哪些东西吧

  5. mysql优化

    说了一堆,然后说sql操作尽量使用预编译语句的时候,

    他说:不是mybatis已经解决了嘛。。。哎

  6. redis项目里怎么用

    作用是支撑高性能高并发,然后在项目里具体怎么用的说了下。

    他:一句话的事儿:不就是做缓存的嘛

通甲优博(自带简历)

坐车坐了两个小时,然后去面试先hr面,了解了基本的情况,然后没了。

我还是请假坐车2个小时过去的,hr没有提前了解我的基本信息就给我发面试邀请了吧,然后过来面试才觉得我不合适,所以直接就没有技术面试了。

返空汇

就是最开头说的那家,招聘网站上常年挂着招聘岗位,起码挂了快一年。过去先是做了一套笔试题,满分100,60分及格,没及格就没后续。

慧友云商科技

同样是做了一套笔试题没有后续了。因为我发现有一个题有问题,然后留空白。

国信杰云科技

前一天电话面试,自我介绍之后,问了一些技术问题,然后就让第二天到现场面试。

现场的话,整个公司人员不超过10个人,本来想走了的,想着来都来了,进去坐坐也无妨嘛。结果这是我做的最后悔的一个决定。

整个面试体验非常差,面试官线是让我自我介绍,我前一天已经在电话里做过自我介绍了,不知道这是什么意思,面试中途还接了几个电话。然后就问登录怎么设计的,前端密码怎么传输过去的,明文还是加密,我说前端加密没有必要也没意义,最多加上https,他说加上https没用,就是要加密传,我就在思考怎么回答他的时候,他说这是面试,请你尊重这次面试(说话语气带了点怒火,感觉要骂人了),我也不能忍啊,直接起身就走了。

常问问题

jvm调优

我觉得这不是一个中级开发工程师甚至高级开发工程师能做的出来的,但是面试就是要问。死记硬背考记忆力呗,只要记住其中几个常用的配置就行了。

堆大小设置

  1. -Xms:初始堆大小
  2. -Xmx:最大堆大小
  3. -XX:NewSize=n:设置年轻代大小
  4. -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
  5. -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

收集器设置

  1. -XX:+UseSerialGC:设置串行收集器
  2. -XX:+UseParallelGC:设置并行收集器
  3. -XX:+UseParalledlOldGC:设置并行年老代收集器
  4. -XX:+UseConcMarkSweepGC:设置并发收集器

调优总结

年轻代选择

响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。 吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。

年老代选择

响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。

代码优化

分为三个维度来谈,可以稍微拓展一下:

  1. 整体框架的优化,根据模块(类)的职责做一些划分,尽量做到每个模块的接口清晰。然后就是善用六大设计原则和24种设计模式。
  2. 功能逻辑的优化,把内聚的逻辑独立成一个个函数,函数依赖的数据都通过参数传递,这样做到函数可重用,当上层结构做出改变的时候,修改的代码量不会太多。
  3. 性能优化,如果性能不敏感,代码也不是那么糟糕,那这个优化可以不用关注。

六大设计原则

  • 单一职责原则

    接口的单一职责,一个职责一个接口,我们对外公布的是接口,而不是实现类,所以不需要过度关心实现类是否遵循单一职责,生搬硬套单一职责会引起类的剧增,给维护带来非常多的麻烦

  • 里式替换原则

    只要父类能出现的地方我子类就可以出现,而且调用子类还不产生任何的错误或异常,调用者可能根本就不需要知道是父类还是子类。但是反过来就不成了,有子类出现的地方,父类未必就能适应。里式替换原则包含了四层意思:

    1. 子类必须完全的实现父类的方法。我们经常写service会定义一个接口或者抽象类,然后编写实现,调用类则直接传入接口或抽象类,其实这里已经使用了里氏替换法则。
    2. 子类可以有自己的个性。子类当然可以有自己的行为和外观了,也就是方法和属性,在子类出现的地方,父类未必就可以胜任。父类向下转型可能会出现类型转换异常
    3. 覆盖或实现父类的方法时输入参数可以被放大。
    4. 覆盖或实现父类的方法是输出结果可以被缩小。
  • 依赖倒置原则

    依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合。我们在项目中使用这个原则要遵循下面的规则:

    每个类尽量都有接口或者抽象类,或者抽象类和接口两都具备

    变量的表面类型尽量是接口或者抽象类

    任何类都不应该从具体类派生

    尽量不要覆写基类的方法

  • 接口隔离原则

    客户端不应该依赖它不需要的接口,客户端需要什么接口就提供什么接口,把不需要的接口剔除掉,对接口进行细化,保证其纯洁性。通俗的讲就是:建立单一接口,不要建立臃肿庞大的接口。

  • 迪米特法则

    一个对象应该对其他对象有最少的了解,通俗的讲,一个类对自己需要耦合/调用的类应该知道的最少,这个类内部是怎么复杂、怎么纠缠不清都和我没关系。尽量不要对外公布太多public方法和非静态的public变量,尽量内敛,多使用private、package-private、protected等访问权限

  • 开闭原则

    类、方法对于扩展是开放的,对于修改是关闭的,在程序需要进行拓展的时候,不能去修改原来的代码。

24种设计模式

单例模式

工厂模式

建造者模式

观察者模式

有观察者和被观察者,被观察者接口:增加观察者、删除观察者,通知观察者更新 观察者:被观察者发送消息了,我自己也要做些什么

责任链模式

适配器模式

mysql的优化

十家公司有九家会问,这个必须要记住。基本上只要记住我写的这些,面试基本上稳了:

  1. 数据库表设计优化
    1. 所有表必须使用Innodb存储引擎
    2. 字符集统一使用utf-8
    3. 字段加注释
    4. 控制单表数据量的大小,建议控制在500w内
    5. 冷热数据分离,减小表宽度
    6. 禁止存储图片,文件等二进制数据
    7. 三大范式
  2. 数据库字段设计优化
    1. 优先选择符合存储条件最小的数据类型,能用tinyint的就不用int,能用varchar的不用text
    2. 避免使用text,blob数据类型
    3. 尽可能把所有列定义为not null
  3. 索引设计优化
    1. 限制每张表的索引数量,单张表不超过5个
    2. 禁止给每一列都建立单独索引
    3. 每个表必须有一个主键
    4. 频繁查询的字段建立索引
  4. 编写sql优化
    1. 建议预编译语句进行数据库操作
    2. 避免数据类型的隐式转换
    3. 充分利用表上已经存在的索引
    4. 不要使用select * 查询,要使用select <字段列表> 查询
    5. 避免使用子查询,把子查询优化成join操作
    6. 避免使用join关联太多得表
    7. 对同一列进行or判断时,使用in代替or
    8. where从句中禁止对列进行函数转换和计算
    9. 在明显不会有重复值时使用union all而不是union
    10. 拆分复杂的大SQL为多个小SQL
    11. 使用 group by 分组查询是,默认分组后,还会排序,可能会降低速度,在 group by 后面增加 order by null 就可以防止排序.

jvm内存模型

必考题,抽时间看看深入理解jvm虚拟机吧。

总结

面试和工作是两回事,面试没通过的人,工作能力不一定比你弱,面试通过的人,工作能力不一定比你强。所以面试没通过也不要灰心,回去好好总结复盘,不要因为失败就丧失斗志,加油!