软件公司面试总结

文章目录

      • 面试1
      • 面试2
      • 面试3
      • 面试4
      • 面试5
      • 面试6

面试1

1、你先做个简单的自我介绍吧
我叫张三,2015年在重庆邮电大学毕业。我读的专业是电子信息。工作已经快5年了。
我上家公司的主营业务是在柬埔寨做移动支付钱包。
最近做的一个项目是聚合支付的项目,主要的功能是为了让柬埔寨当地的华人能使用微信、支付宝钱包做支付,就做了一个聚合码这样的功能。负责的主要的模块是一个渠道的模块(对接外部渠道),比如支付宝、微信。然后,就提供一个统一的接口给支付交易那边使用。这个项目上线后我也对它做了一些优化。
再往前的一个项目是一个出入金的项目,这个项目主要的功能是提供一些充值、提现的服务,给当地的人可以去我们公司开设的一个现金网点,用现金做充值提现,先充进钱包里面,做线上的消费,我负责的模块就是一个充值服务,主要是对整个充值流程的控制,和账户,还有订单那边做交互。

2、简单介绍下Spring Bean的注入过程

3、简单介绍下Java8有哪些新特性/strong>
1)语法上面主要就是lambda表达式,它可以用那个函数式进行函数式编程,函数式接口的意思就是它这个接口只有一个方法
2)还有一些流的操作,像Stream API,它可以使编程语义更清晰。比如:有一个filter功能就可以把不符合要求的数据过滤掉
3)它对一些数据结构进行了优化,像ConcurrentHashMap,它底层实现改成了红黑树

分析:
面试官问的是有哪些新特性,回答的是一些优化。

4、刚刚有提到过流式处理,你有了解过它的性能么如:Stream流的操作,对比像foreach或者基本的for循环,有没有在效率上进行优化/strong>

5、你能跟我讲一下synchronized和lock锁它底层实现的原理吗/strong>
synchronized是一个语义级的支持,在一个对象头里面,它有一个Mark Word的这么一个标记去记录他的锁。lock显示锁,它底层是一个AQS,它是一个双向链表的先进先出的队列,它当前持有锁的线程就是一个对头,然后它释放出来职还,就会利用一个自旋的操作,就让下一个线程作为对头。

6、synchronized和lock分别是什么层面的呢jdk层面还是jvm层面/strong>
sychronized是jvm层面的,lock是jdk层面的

7、刚刚提到synchronized,你有去了解过它锁方法,锁对象头,锁代码块分别是怎么实现的吗/strong>

8、你了解synchronized锁升级过程吗/strong>

9、刚刚提到lock,CAS你能给我简单的介绍一下吗/strong>
CAS,它的意思就是比较并交换

10、你有在开发过程中有实际的一些应用吗没有用到乐观锁/strong>
我在更新数据库的时候,如果数据库用的是一个乐观锁的话,我也用一个自旋的操作,就把它更新到成功为止

11、自旋的话,会不会效率很低如说,一直取不到这个锁的话,那可能会造成一些线程阻塞。或者说,在高并发的场景下,会影响到效率/strong>
并发高的话,不适合用自旋,这个时候更适合用悲观锁

12、关于线程池,把你知道的知识点跟我说一下
工作流程:
1)先提交进来
2)进入核心池里面
3)如果线程数大于coreSize,就会进入一个阻塞队列
4)阻塞队列满了之后,就会新建一个线程,进入最大的池里面
5)当线程数超出maxSize的时候,就会执行一个拒绝策略。jdk自带的拒绝策略有4种,一种是直接丢弃,一种是抛异常,一种是有调用者在调用者的线程执行,一种就是丢弃阻塞队列里面等待时间最长的一个线程

13、你了解JVM调优的基本步骤吗/strong>
如果生产环境上面发生oom异常,首先要判断它是在堆里面发生的,还是在元空间里面。还有一种可能就是gc效率过低,就是用了80%的时间,但是清除的垃圾都达不到2%,效率过低,主要是针对这种情况(进行调优)。如果是堆空间不够,就要考虑是不是有内存溢出的现象,可以通过拿到当时的内存快照,用工具(jmap),然后就用MAT工具来分析,是不是内存泄漏,有一些对象,它们本来是没有,应该被gc掉,但是它们还保留着,如果是内存泄漏的情况就改代码,如果不是的话,就考虑增大一下堆内存。

14、现在遇上一个线上cpu占用率100%的问题,你怎么排查这个问题/strong>
1)先用top查出是哪些进程占用的cpu最高
2)找到占用cpu最高的进程后,用命令找到里面占用率最高的线程,然后,转换为16进制的,然后再用jstack,打出它具体的堆栈,定位到具体的哪一行代码。

15、在linux上面查看进程的命令/strong>

16、一般怎么去优化mysql的查询/strong>
一般就用expain执行计划,看看执行的各方面的数据。如果是索引没用的的话,就建索引。

17、mysql里面,索引有几种类型/strong>
一般有两种,hash和B+树

18、我们为什么用B+树,不用其他的呢如平衡二叉树,红黑树这些。
不用平衡二叉树,是因为平衡二叉树的树高太高了。如果数据是放在内存的话,其实用
AVL也没问题,但是如果树高很高的话它就频繁访问硬盘,IO次数会多一点。

19、树高低也有B树,为什么用B+/strong>

20、能跟我说一下MyISAM和InnoDB的区别吗/strong>
1)MyISAM用的是非聚集索引,它的索引直接指向的是数据项
2)InnoDB用的是追溯索引,它的索引直接指向主键索引,主键索引查取数据项
3)InnoDB支持redo log日志
4)InnoDB支持事务
5)InnoDB支持行锁,MyISAM只支持表锁

21、开发过程种技术选型的时候,这么多缓存中间件(Memcache, MongoDB),为什么选择Redis/strong>

22、Redis为什么这么快/strong>
1)因为数据是在内存中的嘛,所以读写(IO)比较快
2)另外,Redis使用的IO模型是异步非阻塞

23、如果断电了,Redis的数据会不会丢失/strong>
Redis支持持久化,就是把数据持久化到硬盘里面。持久化有两种方式,一种是RDB,每隔一段时间会把内存快照存到硬盘里面,还有一种是AOF,就是用命令将内容序列化到文件里面去,如果断电的话,可以根据AOF写的文件来恢复数据。一般生产上就是RDB和AOF同时开启的,两者有优点缺点,AOF备份的数据会比较全一点,但是恢复起来比较慢,RDB虽然说数据少一点,但是恢复挺快的,拿上去就直接能用了,所以说一般在应急情况下都是会先用RDB的,然后再用AOF去追加那些不全的数据

24、你了解过Redis的集群么/strong>

25、你是怎么理解缓存击穿和缓存穿透的/strong>

26、Spring的优点有哪些/strong>
1)没有侵入性(AOP)
2)把对象的依赖管理起来(IOC)

27、跟我讲下dubbo的调用链路(从生产者到消费者的整个链路)

分析:
1)服务暴露的过程
2)然后调用过程中其实还有1个Monitor监视器什么的
3)在启动的时候,还有一个Containner容器,跟Spring Bean怎么融合的

28、除了单例和工厂,你了解哪些设计模式/strong>
项目中比较常用的:
1)策略模式,它的类结构是有一个Context,它是聚合的一个抽象的策略接口,然后,还有很多个具体的策略实现类来实现它。我主要是把它用在渠道这方面,比如,渠道下单,有多个渠道,要写的报文格式,还有,数据结构都是不一样的,然后就可以用不同的策略
2)还有一个是状态模式,主要是用来进行状态流转的控制,它的类结构和策略模式也有点像,很相似,也是一个Context(它持有的),它聚合的是一个抽象的状态接口,然后,下面也有很多状态的实现类,具体实现类。
比较:
这两个模式关注点不太一样,策略模式主要关注的是对一个功能的不同实现算法(方法),并且可以动态的去切换。状态模式,它主要是关注的一个状态的流转,会从A状态B状态他们之间的是什么流程

29、金融支付的场景,怎么保证幂等/strong>
1)数据库层面要做一个唯一索引
2)在访问量稍微大的情况下,可以考虑把一些需要做幂等的数据先存到缓存里面

30、存到缓存里面怎么去做的/strong>
比如:订单过来的时候,可以把那个订单号放到redis里面,下一笔订单来之后先去Redis里面检查是否存在此订单,然后就过站

31、按道理来说会出现各种场景,就是像退款、下单、支付、发货等都是一个订单号操作的,你怎么能保证是一个场景还是多个场景在这里进行操作的为它完全可能是支付成功后,商家马上就来接收到这笔订单之后马上发货什么的。
答:刚刚主要是针对新建订单的场景

32、怎么避免重复消费(重复支付)/strong>
免重复支付,目前的做法就是从数据库里面查一下订单的状态,然后用状态机的状态(刚刚说的状态模式),如果是已经完成了,它已经到了一个状态了,就不会对这边订单做修改了。如果是它还是处理中的话,那就证明它还可以流向失败还有成功的状态。

33、像这样一个场景,就是刚刚你说去查一下嘛,如果我去数据库查到了,然后返回过来的途中,其实它的状态应该还是未支付的,但其实有一笔支付的已经过来了,然后这个时候同时过来两笔,按道理来说这两笔可能都会加上去,对不对/strong>
答:如果是这种情况的话,可以加一个分布式锁

34、说一下分布式锁你是怎么实现的/strong>
分布式锁主要是控制我们平时所谓的线程的共享资源的修改,分布式锁就是控制一个进程,平时的话我们就用Redis的setnx(原子性操作)

35、有试过用ZK(zookeeper)吗/strong>

参考资料
[01] 利用jmap和MAT等工具查看JVM运行时堆内存
[02] HashTable和HashMap的区别详解
[03] Redis乐观锁解决高并发抢红包的问题
[04] 使用Redis和Lua的原子性实现抢红包功能
[05] 一次生产 CPU 100% 排查优化实践
[06] 一份十分完整的CPU 100%排查优化指南

小结
java程序员面试,最常见的套路永远是问:你用过多少中间件和库br> 然后又问:这些中间件和库的特性了解多少br> 再高级一点的就会问:这些中间件和库特性原理是什么br> 作为真正有能力解决问题的开发人员,考虑问题的方向不是这么样的。
1,业务上需要什么功能,某个库或中间件能提供,那么只要冲自已想要的去了解好就行,毕竟软件功能要的永远是够用就行,要考虑以后扩展就不要盲目用第三方提供的东西了,业务周期也没这么充裕的时间让你慢慢搞,堆起来功能能用时业务考虑的第一要素。所以问此中间件和库深层了解是多余的,人人都是冲它有自已想要的功能去用而已,没必要用一样就得了解得透彻。
2,既然是java开发,那么要看看想找的是什么人,搬砖工问的是使用过什么框架,什么库就行了,架构师级别问的,应该是spring,springboot,springcloud都有什么不同,有什么优点,有什么缺点,缺点怎么克服,给出方案和案例才是重点。举个简单例子,很多都知道swagger能生成文档,但对复杂数据不支持,该怎么救活呢多人会答不上,但架构师级别有做过的肯定知道,这些是开发前必须解决的事。只要工作场景用不着,很多人对java都是不认识的,nio和netty有什么用都可能不清楚,因为工作场景用不上,用得上的多数是架构级别。如果非架构级别还经常用上,只能说现在用于开发的框架设计太烂了。
3,既然是用java,多线程相关的就别问些什么了,知道hashtable和hashmap的区别就好了,知道线程并行访问资源的时序分析和注意事项就可以了,加个concurrent包装的,就别用来做什么多线程,高效率之类的东西了,用原子锁级别的能有多快呢行读互斥写的锁,在绝对读写高并发时同样死。用java老老实实用无状态线程池,共享对象什么的用个redis或memc来放就好了。java不可能像cc++那样能用cas解决任何高效并发的问题。安全生产最重要,效率稍低机器来补。java的各种多线程对象,sync关键字,都是让多线程变得比单线程流水线还慢的东西。
作为面试官,就要清楚要招的是什么人,要用什么人,别老把乱七八糟的东西扯一大堆不等用的,问倒对方还觉得高兴一样,这样对你对公司形象对面试者都没有好处。
面试重点是这人现有技能是否满足岗位要求,人是否能好好合作,最后才是这人是否学习快,灵活变通,能产生更多价值。

面试2

面试职位:Java开发(机器人后台管理系统)
面试公司:维xxx科技有限公司
面试时间:2019-09-20

面试流程:
1)填表
2)笔试(填空,选择,编程,简答)
3)技术面试(自我介绍,项目介绍,提问)

Java笔试题不难,如果好好准备的话,笔试肯定可以过的。

跟Java面试有关的学习资料如下:
[01] Java面试题全集(上)
[02] Java面试题全集(中)
[03] Java面试题全集(下)

印象比较深的题目如下:

笔试题目:依赖注入的3种方式
参考答案:
① setter方法注入 ②构造器注入 ③@Autowired注入

笔试题目:Spring框架中Bean的作用域
参考答案:
① singleton ② prototype ③ request ④ session ⑤ global-session

笔试题目:Spring MVC的原理

笔试题目:实现三角形的角度

软件公司面试总结

笔试题目:栈的实现原理

笔试题目:html5框架的Canvas有什么作用
参考答案:HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像

面试题目:你知道哪些协议/strong>
我回答的是http协议和https协议

面试题目:有没有用过socket/strong>
他们的机器人项目主要是使用socket进行通信的

面试题目:阻塞,同步与异步
参考:
https://www.jianshu.com/p/5bb812ca5f8e

面试题目:客户端跟后台是怎么交互的/strong>
分析:
1)自定义响应结构(POJO类)
2)浏览器通过ajax发送请求
3)控制器根据请求的路径分配对应handler进行处理
4)handler接收请求参数,并返回自定义的响应结构数据
5)通过视图组件将响应数据转成json格式的文本,发送给浏览器

维xxx科技有限公司面试小结
1)问的问题基本上都是很基础的
2)准备不够充分

参考资料:
[01] Spring注解依赖注入的三种方式的优缺点以及优先选择
[02] 理解Spring框架中Bean的作用域
[03] Java中计算三角形的角度
[04] socket阻塞与非阻塞,同步与异步
[05] ajax的同步和异步有怎样的区别/p>


面试3

面试职位:软件测试
面试公司:上海好xx信息技术有限公司
面试时间:2019-09-24

面试流程:
1)填表
1)技术面试(自我介绍,项目介绍,提问)

印象比较深的题目如下:

面试题目:Email系统怎么测试如:QQ邮箱
分析:
这个问题比较开放,现场没发挥好。
1)功能角度(功能运行成功和运行失败的各种情况)
测试发送邮件:邮件主题为空的情况;收件人为空的情况;收件人邮件地址不正确的情况;收件人过多的情况;邮件正文为空的情况;邮件主题过长的情况;邮件正文内容过长的情况;邮件正文包含图片的情况;输入正确的情况;邮件正文设置样式的情况;附件个数过多的情况;附件大小超出限制的情况;服务器磁盘空间不够的情况;收件人邮箱空间不够的情况;邮件主题包含特殊字符(换行、空格、引号等)的情况;数据一致性检查(对方收到的内容是否与发送的内容一致,不会出现中文乱码)
2)安全性角度
登录请求里面的密码是否做了加密处理;邮件内容是否做了加密处理;邮件正文内容包含js代码的情况;邮件正文内容包含木马链接的情况;非登录状态能否发送邮件;附件是病毒或木马文件的情况;
3)性能角度
email系统的响应速度如何;模拟大量并发的情况;
4)兼容性角度
使用不同的浏览器进行测试
5)界面角度(样式检查)
根据原型效果图进行比对(比如:邮件发送成功的界面,发送失败的界面等等)

面试官补充了两点:
1)系统的关联性(QQ聊天系统和QQ邮件系统)
2)垃圾邮件处理机制

面试题目:你知道RPC么一下RPC的原理
RPC的实现原理主要包括8个步骤,请参考[06]

参考资料:
[06] RPC的实现原理
[07] 什么是RPC


面试4

面试职位:Java开发
面试公司:上海xx金融信息服务有限公司
面试时间:2019-09-25

面试流程:
1)填表
2)笔试(逻辑题,选择题,简答题)
3)1面:技术经理面试(自我介绍,项目介绍,提问)
4)2面:公司高管面试(自我介绍,提问)
5)3面:HR面试(沟通薪资待遇)

印象比较深的题目如下:

笔试题目(逻辑):
在一张长方形的桌面上放了n个一样大小的圆形硬币。这些硬币中可能有一些不完全在桌面内,也可能有一些彼此重叠;当再多放一个硬币而它的圆心在桌面内时,新放的硬币便必定与原先某些硬币重叠。请证明整个桌面可以用4n个硬币完全覆盖。

笔试题目(逻辑):
假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。
我写上去的答案:
1)用容积为6升的水壶装满水
2)往容积为5升的水壶倒水,直至倒满(6升的水壶里面还剩1升水)
3)把容积为5升的水壶里面的水全部倒掉
4)把容积为6升的水壶里面剩余的1升水倒入容积为5升的水壶
5)用容积为6升的水壶装满水
6)往容积为5升的水壶倒水,直至倒满(6升的水壶里面还剩2升水)
7)把容积为5升的水壶里面的水全部倒掉
8)把容积为6升的水壶里面剩余的2升水倒入容积为5升的水壶
9)用容积为6升的水壶装满水
10)往容积为5升的水壶倒水,直至倒满(6升的水壶里面还剩3升水)

笔试题目(逻辑):
现在共有100匹马跟100块石头,马分3种,大型马;中型马跟小型马。其中一匹大马一次可以驮3块石头,中型马可以驮2块,而小型马2头可以驮一块石头。问需要多少匹大马,中型马跟小型马/p>

参考资料:
[08] 50道逻辑思维题目

笔试题目(Java)

笔试题目(Java):volatile关键字的作用

参考资料:
[09] volatile关键字的作用

笔试题目(Java):CMS收集器

参考资料:
[10] 并发收集器 CMS

笔试题目(Java):为什么要使用MQ消息中间件

参考资料:
[11] 为什么要使用MQ消息中间件解决了什么问题br> [12] 为什么要使用MQ和到底什么时候要使用MQ

笔试题目(算法)

二分搜索算法是利用( )实现的算法
A.分治策略 B.动态规划法 C.贪心法 D.回溯法

参考资料:
[13] 二分查找算法实现(图解)与实例

笔试题目(算法):插入排序算法的时间复杂度

参考资料:
[14] 插入排序算法、时间复杂度和稳定性

笔试题目(c语言):volatile关键字的作用个指针可以是volatile吗/strong>

参考资料:
[15] 解读关键字volatile

笔试题目(c语言)

下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗/p>

来源:勇敢的兵

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年8月23日
下一篇 2019年8月23日

相关推荐