这是我毕业以来第一次面试,是一家初创公司,也是一个做saas的公司,起初在BOSS上聊了几句,职位是java主力开发(大概就是那种使劲干活不要命那种),然后就电聊了45分钟,接下来就约定第二天面试。
刚到公司,说实话公司环境比较拥挤(可能是因为现在的公司太大了哈哈哈),然后就从人群中站出来三个人,后来才知道一个前端架构师,一个后端架构师,一个经理,这阵容我也是慌了一下,第一个问题wait和sleep的区别,可能是还没缓过神来,从前特别清楚的问题一瞬间不知道怎么表达-_-,估计还是不够扎实,然后就看架构师翻着手机的面试题,一个一个问,从以下几个部分来整理这些问题吧,也算是给大家一个方向:
java基础部分(从java基础、面向对象,到GC、jvm,这些知识还算清晰,也可能是进入了状态hhh)
Long l1=124L;Long l2=124L; l1==l2?
这个lz没有思考就说了true,并且说如果大于127就是false,他也没继续问原因,我也就没继续说下去。说一下String,StringBuffer,StringBuilder,为什么String加法运算费性能
StringBuffer线程安全,StringBuilder不是线程安全的,String 内部包含final的char[] ,所以每次操作都会生成个新的数组,但是在java8以后String加法操作进行了重载,底层StringBuilder实现,比原来省性能。刚刚你说到java8,java8有哪些新特性?
我常用的是stream,balabala(说了些函数式编程),还有Optional类,balala(其实还有很多新特性,只不过平时没用过没底气说)重写重载区别(这个太基础),那你说返回值类型不同算不算重载
当然不算,因为我们并不是所有时候都去关心返回值,所以当执行a()你也不知道是要int的返回值还是void的,所以也不能作为依据来确定用哪个方法。重写中子类和父类的异常关系是这么个约束
子类中可以不抛出异常,或抛出更详细的异常说一下GC过程
首先,需要判断对象的存活性,主要有两种方式,第一是引用计数,但是会造成abba问题,第二个方法是可达性分析算法,当创建对象时候就像根节点或某个子节点挂载,当某个对象到根节点无可达路径则判定对象死亡,HotSpot用的是这种算法,当对象被标记两次才有可能被回收,回收算法有有很多,标记清除,标记整理,复制算法(说了下不同算法的优点和适用场景),不同的GC使用的算法不同,一般来说会根据不同的代来进行不同的回收机制,java8中默认是G1回收器。(回答这部分问题的时候面试官在中间会时不时的冒出问题···)jvm问的就比较少了,还是我自己主动提的,比如在java8中永久代被元空间取代,内存模型啊,对象创建过程,分配内存的CAS算法等等等,但面试官好像不是很感兴趣···
框架(Spring,SpringMVC,SpringBoot)
你用过Boot吧,说说你了解哪些?
(黑人脸,我不知道从哪说起啊,太多可说的了)我就从IOC AOP 动态代理两种实现方式(后来想想,其实回答的不对,这都不是Boot的优点,常挂在嘴边的习惯大于配置竟然没说···)刚刚你提到动态代理,你说一下动态代理的默认机制
spring4中优先是动态代理,若代理的对象无接口,则用CGlib的方式来进行动态字节码的代理。Mybatis接触过么
我们持久层用的hibernate,但是我写过一些demo,相比于hibernate的全自动,mybatis的半自动化更灵活和轻快吧,sql基础好学这个应该不难,之前解决过其他项目组的bug(balala叙事)了解Dubbo么
我们服务发现治理用的是Eureka,一直也没什么机会接触,但好像阿里最近推崇的是HSF(面试官表情很耐人琢磨)开启定时任务怎么开启
需要加@EnableSchduling注解框架的事基本就聊到了这
数据库
说说事务的隔离级别
串行、重复读、已提交、未提交(balalalalala)幻读和脏读区别是啥
幻读:一个事务修改了全部列,这时另一个事务插入了一行,这时候就好像之前的修改没生效,发生了幻觉
脏读:就是一个事务修改某个数据未提交,另一个事务读取这个数据造成脏读mysql存储引擎知道哪些?有啥特点?
我只知道Innodb,这个问题过了(说到这我已经口干舌燥不想说话了····也不给杯水),这部分在我学习计划靠后的地方,毕竟我才转型java不到一年,还有很多要学。查询如何优化
一般建立索引就可以,再有就是对null 尽量设置初始值(balala这个问题网上一大堆只记得这些了)事物有什么意义
保证了一些操作的“原子性”,保证数据的准确(举转账例子balala)分布式事务怎么解决
这部分我只是了解一点JTA,它是通过分段提交保证了事务ACID。阿里有个GTS好像对分布式事务有较优的实现,但是做成了产品没开源。ACID你知道都是啥么
(我自己提的hhhh)原子性,一致性,隔离性,持久性(看来又不想继续深问···)我看你用过redis?redis有哪些数据类型
我用过codis,是go实现的redis的集群化(这样形容并不准确)(数据类型我没回答,我知道有字符串、哈希表、List、Set、有序列表),我只是负责搭建这样个环境,修改原有的脚本,适用于实际的开发环境。redis存json有什么弊端?
我犹豫了一下,我本想说转对象时费性能,但是我觉得问的是redis本身的弊端,然后也pass了,现在想想好像就是性能问题···
设计模式
谈谈你知道的设计模式
设计模式太多了,我们也不会说用其中一种,在使用的时候这些模式经常需要变种,模式本身就是给开发者提供一个开发思路,主要思想就是抽离不变的,封装变化的,多用组合少用继承,针对接口编程,不针对实现,然后遵守下开闭原则。(balalala)观察者模式知道么?项目中有哪些场景?
(说实话我对记名字真的是····)发布通知?项目中···难以具体举例啊,现在想想其实reactor就是一个较为合适的例子,异步通知····那你举一个生活中的场景吧
报纸?天气预报?(都不恰当)
前端
看你以前做过web架构,说说负责哪部分?你对前端架构有什么理解
balabala叙事,架构就是骨架,抽离出脱离业务不变的部分,进行一个业务的统一默认实现,前端的架构还包括一些插件的整合。估计因为我是面试java开发,所以web基本没问太多 ,angularjs的指令双向绑定 vue的钩子函数,生命周期这些都没问(失望脸装逼失败)
shell
- shell基本没问什么实际问题,我就是说我自学写过几个脚本,公司一直在用,三剑客(awk、grep、sed)都没问,但估计其他的公司还是会问的。
其他
谈谈你对rest的理解,和rpc的区别
rest我个人理解就是一种风格规范,对于前后端分离这种,我实际感受到的最大的好处就是定义规约就容易形成“默契”,根据接口就能判断他的业务含义,然后前端独立开发的时候如果遵守这样的规则,那联调的时候基本不需要太大的改动(balala乱扯),rpc适合服务器间通讯,以方法名来作为驱动(后面还说什么了记不住了)nginx你会配么,怎么设置https
会啊,首先要获取证书,然后在配置项里配置证书位置就好了,具体的配置项的key叫什么记不清了,我们项目目前都是httphttp?那怎么保证网络安全?
我们项目特殊,都是政府项目,访问都在内网,相对安全点···http你了解么?和http2有什么区别
它处于应用层(然后就是tcp/ip那一套握手挥手),http2快吧(其实应该答多路复用),支持长连接吧(其实应该说支持推送···)协议和计算机原理一直是lz的薄弱项,因为很少接触,不过最近准备开始系统学习了。。。
剩下的就是项目的问题了,然后担任的角色,看哪些书,用哪些搜索引擎,看哪些国外网站(这个很尴尬,lz从来不记名字···,用手语比划回想起来还是很尴尬的,拿个笔我能给stackoverflow画出来)
然后公司介绍了一下自己的情况,问我有什么问题,其实这是每个面试者都应该提前准备好的,当时一是没面试经验,二是没有面试准备,就随便聊了聊考勤问题、公司战略、架构师的经历(这个很尴尬,仿佛一副“你们凭什么降伏老子”的既视感···,其实我只是好奇架构师的成长之路),这一问题还是要去公司前提前准备好,针对于不同的公司有不同的问题。
一些较为开放的问题一定要捋清思路,语言描述一定要有逻辑结构,毕竟程序员逻辑思维很重要。
然后就让我等通知(好莱坞原则)
总结
这篇文章写给像我一样的面试小白,不要紧张,真实面对,也不要想蒙混过关,技术这东西编不出来的。唯有脚踏实地的去学习和思考,与君共勉。
文章纯手打,如有不对或不准确请指出更正 谢谢!
对齐填充。