第一个投的是拉勾网,先做一份笔试题目,都是大题,编程题目为主,主要是考察编程能力、算法和数据结构以及架构设计方面,答的很不好,好多都忘了。
一.自己实现一个hashMap,这个难不倒我,jdk的源码中最熟悉的就是Collection包了,使用数组和内部类完成哈希表的数据结构,再通过hash算法和链表操作完成哈希表的插入查询等操作;
二.并发编程中的生产者消费者模式代码,没写出来,忘记了,真是不应该哦,最简单的方式就是使用wait和notify去阻塞唤醒(这么基础的东东我都能忘),当然还有很多优雅的写法,比如使用可重入锁(ReentrantLock),使用锁计数器(CountdownLatch)等,当时一种都没想到,自责中;
三.字符串的一道算法题,这类小case,就是位图法,毫无压力的写出;
四.写一个自己熟悉的架构图,于是我把我的老东家的系统架构搬了上去,简单来说就是通过hessian将前台调用逻辑与后台业务逻辑解耦,实体可以通过序列化和反序列化传递(这是hessian最擅长干的事情),最终提高后台业务逻辑接口的可重用性以及系统的可维护性。
还有两三道题目忘记是什么了。时间还是很紧的,只有一个小时时间。交卷之后开始面试,一面继续聊了聊jdk的Collection包,还有就是之前在公司所做项目的部署思想。二面就是聊聊java并发锁机制,为什么要用读写锁而不用synchronized这种同步锁,事务隔离性的理解,为什么会有脏读,可重复读,提交读等,spring的事务管理是如何实现的,编程式如何实现,aop式如何实现,动态代理的原理是什么,事务的传播性的理解。总之都是这类比较重视原理的问题,答的还可以吧,最后就是CTO直接面试,谈谈为啥离职,期望薪资什么的。问我会不会来,最后我回答我考虑一下,下周三给回复,然后就离开了。感觉公司环境很好,饮料零食什么的都是免费吃,不过最后没有选择去。
第二个去的是360,没有笔试,直接面试,一面主要问基础,String内容存放在哪儿,答运行时常量池,然后我把jvm的内存结构讲了一下,堆、栈、程序计数器、方法区等,每块区域的作用之类的,那么问题就来了,jvm的回收机制是什么,感觉问的有点大,不知道从哪儿说起,只好从分代回收算法说起了,从GC ROOTS的引用链机制到新生代的小空间复制算法再到老生代的标记清除算法,最后就是新生代和老生代之间的关系以及跃迁等,随后面试官点了点头说那你再讲讲jvm的类加载机制吧,委托双亲机制吧,正准备讲,那小哥问反射机制是如何利用类加载机制的呢,只好把反射的实现原理也balalala。。。继续发问,懂哪些设计模式,答:单例,建造者,观察者,模板方法模式,迭代器模式balala,你在项目中用到过观察者模式吗,怎么用的。答:做统一配置组件的时候使用到了zookeeper的发布订阅,创建了监听链表,完成应用系统的注册和同步,balalala,边写代码边讲细节,正讲的起劲,被打断,你写个单例模式吧,把你认为效率最高的单例实现写出来,当然是通过jvm的内部类机制实现单例了,又快又安全,看完面试官点点头,说再写一个双检查的懒汉单例模式吧,好的遵命,写完后小哥发问,为什么要用volatile关键字,答:在高并发时会出现并发模式异常,volatile可以防止指令重排,创建对象操作并不是一个原子操作,分为三个步骤,balala,讲了一通,面试官被说服,随后面试官发问,能不能讲讲线程的内存模型,哈哈,幸好以前研究线程可见性的时候研究过这个,讲完面试官很满意,感觉他已经hold不住我了(暗自自喜),谈谈你对cas的理解,答:是指乐观锁吗,还没等我说,面试官说好,你等一下,二面面试官走了进来,开始发问,假设有一个场景,系统需要某个特定时间内响应用户请求,比如说100ms内完成用户请求,但是在最高峰的时候每单位时间几百万的用户请求,也就是高并发,但我必须要实现系统响应及时,而且高可用(不宕机),假如你是架构师,你该如何架构这个系统,聊聊你的方案,当时听完脑子就蒙了,恨自己当初没去看那本《大型分布式网站架构》书,于是就开始凭感觉说,首先肯定需要做缓存集群,防止数据库雪崩,数据库如果请求量很大也需要分库分表,各种乱说,说得自己都晕乎乎的,最后面试官说有的对有的不对,而且没说到点子上,不过可以理解,你只有一年多点的工作经验。然后向我介绍了一下他们部门是做什么业务的,随后问我为什么离职等,到饭点了,我就被拉走了。第二天hr打电话给了offer,聊了聊薪资待遇,360待遇不错,吃饭还免费,挺好的。
全部评论
(4) 回帖