程序员人生 网站导航

这里有一份面筋请查收(一)

栏目:综合技术时间:2016-07-08 15:49:38

博主毕业快满3年了,由于种种缘由想换1份工作。学了7年计算机技术,在目前的行业用到的技术不多,还是想去寻觅1份互联网行业的工作,这样更能学以致用发挥自己的特长。从上次更新博客到现在已3周左右了,这3周博客基本断更了,现在找工作也基本扫尾了,来聊1聊我所遇到的1些面试经历,希望给各位寻求新机会的小火伴1个参考。总共面完8家收了7个offer,应当算是比较成功的吧。博文中主要还是聊1下技术相干的,博文中所触及的公司均以代号标志,不便流露细节。

第1家面试的公司是1家互联网创业公司,这里简称D,博主对这家公司的印象还是不错的,共面试了5轮,笔试1轮,技术面3轮,最后1轮是HR面。虽然公司总共员工只有小几百人,但是做事比较专业,很多大型的成熟公司也未必做得更好。

首先说说笔试,很多1些小的公司,就是从网上题库中拉点选择题让你做做,以后的面试和笔试题无关,这里我遇到的笔试题是和第1轮技术面相干的,有点小套路。

笔试题

据博主的回想,共有这么些题(都是简答题):
1. 写出java中synchronized的使用方式。
可以参考:Java多线程知识小抄集(1)
2. Java中设置最大堆和最小堆内存的参数是甚么?
-Xmx -Xms
3. volatile的作用?
两点:内存可见性;避免指令重排序;
4. 写1个2分查找算法
5. 写1个你熟习的设计模式,画出UML图,说出此模式的作用和写出此模式的主要方法。
6. 1道设计题。(略)
7. BeanFactory和ApplicationContext的区分。(Sping的容器可以分为两种类型 :1. BeanFactory:(org.springframework.beans.factory.BeanFactory接口定义)是最简答的容器,提供了基本的DI支持。最经常使用的BeanFactory实现就是XmlBeanFactory类,它根据XML文件中的定义加载beans,该容器从XML文件读取配置元数据并用它去创建1个完全配置的系统或利用。 2. ApplicationContext利用上下文:org.springframework.context.ApplicationContext)基于BeanFactory之上构建,并提供面向利用的服务。)

(第4,5题在下面会解释)

第1轮技术面

主要根据简历和笔试题进行论述。
先将笔试题,首先是写出1个熟习的设计模式,那固然写个单例咯,这个最简单嘛,主要是UML图也特别好画。详细可以参考设计模式:单例模式(Singleton)。博主写的是内部类的写法:

public class LazyInitHolderSingleton { private LazyInitHolderSingleton() { } private static class SingletonHolder { private static final LazyInitHolderSingleton INSTANCE = new LazyInitHolderSingleton(); } public static LazyInitHolderSingleton getInstance() { return SingletonHolder.INSTANCE; } }

这类写法是懒汉式线程安全的写法。
面试官问到1个问题:为何这类写法是线程安全的?
那末这里就设计到1个JVM加载的知识:JVM内部机制可以保证在履行类构造器<clinit>()方法的时候是线程安全的,详细可以参考博文: Java虚拟机类加载机制。

这里博主还特地说了虚拟机规范严格规定了有且只有5种情况(JDK7)必须对类进行初始化(履行类构造器<clinit>()方法):

  1. 遇到new,getstatic,putstatic,invokestatic这失调字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这4条指令的最多见的Java代码场景是:使用new关键字实例化对象的时候、读取或设置1个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)的时候,和调用1个类的静态方法的时候。
  2. 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
  3. 当初始化1个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
  4. 当虚拟机启动时,用户需要指定1个要履行的主类(包括main()方法的那个类),虚拟机会先初始化这个主类。
  5. 当使用jdk1.7动态语言支持时,如果1个java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先出触发其初始化。

特别是第5点,是个特别偏冷的知识点,当你记住这个的时候,可以给面试官留下1个很好的印象。在后面的博文中会常常触及这类冷知识,可让你的面试进程添加几处亮点。

下面就是要说明1下的2分查找法(首先确保被排序的数组有序),这里有两种写法:递归和非递归的写法。博主憋了1个递归的算法,不过最好还是用非递归的写法。2分查找法还是很容易的,关键这里引伸出了变种算法,比方:给你1个key,找出这个数组中最左侧的key,或最右侧的key。固然还有其他变种算法,有兴趣的朋友可以自行查找相干资料。

接下去就根据简历聊1聊项目和Java基础了。下面略微罗列1些问题:
1. Memcached和Redis的区分?参考:Redis和Memcached的区分
2. ActiveMQ的集群配置方式有哪些?(基于同享文件,基于数据库,基于Zookeeper等)
3. Mybatis的1些知识点。(略)
4. 虚拟机的类加载机制。(加载-验证-准备-解析-初始化,详细可以参考 Java虚拟机类加载机制)
5. 内部类相干知识点。
6. 面向对象的设计原则?参考:面向对象的设计原则
7. Spring Aop的原理?动态代理。
8. Spring经常使用的注解?
9. NIO的相干。参考:攻破JAVA NIO技术壁垒
10. 数据库优化相干。(博主基本不直接接触数据库,so遇到此类问题直接say: I don’t know. 有兴趣的小火伴可以自行查阅1些资料,比方数据访问优化漏斗法则。)
11. linux下查看文件有哪些方式?cat tac head tail more less nl vim vi gvim

技术面2面

约好的10:00电面,11:30也没来,后来咨询了HR才说面试官出差去了。。。好吧,毕竟公司还在创业早期,管理上有忽视可以理解。第2次约的2面一样是10:00,这次是10:27来的电话。额。。。这此的面试官好像是CTO,面的也比较深1些:

1.谈谈你对HashMap的理解,怎样样去保证线程安全?
博主对HashMap巴拉巴拉的1阵,可以参考:Java集合框架:HashMap. 然后有3种方法可以保证hashMap的线程安全:换成HashTable;用synchronizedMap包装1下HashMap;换成ConcurrentHashMap。然后补了1句ConcurrentHashMap是比较推重的,然后就被问了另外一个问题:说1下ConcurrentHashMap的实现原理。然后解释了1下,最后问了个问题:用HashMap怎样去实现ConcurrentHashMap?当时想了1个,觉得不okay,想说第2个方案就被制止了。现在想一想:把HashMap用Collections.synchronizedMap()包装1下替换屌Segment便可。(如果不知所云,请浏览1下ConcurrentHashMap的源码先~~)
补充:这里还问了平经常使用了那些线程安全的队列,包括:ConcurrentLinkedQueue, ConcurrentLinkedDeque和BlockingQueue系列。

2.Java集合中有哪些经常使用的类?ArrayList的上级(父类或接口)是甚么,HashMap的上级又是甚么?
经常使用的类:Map系(HashMap,LinkedHashMap,TreeMap, WeakHashMap, EnumMap等);List系(ArrayList, LinkedList, Vector, Stack等);Set系(HashSet, LinkedHashSet, TreeSet); 工具类(Collections,Arrays)。这里如果说出来了,就必须对其10分了解,比如博主在另外一家互联网公司W的面试进程中就被问到:你对java集合了解有多少?博主说:我看过所有集合的源码。然后就被问到:Collections.sort()里面的实现是甚么排序算法?这个问题确切够冷门的!幸亏看过,不然就被打脸了。。(TimSort, 加强型归并排序)
ArrayList extends AbstractList implements List, RandomAccess, Cloneable, Serializable. 然后AbstractList又继承了AbstractCollection. 然后List和AbstractCollection又都implements了Collection.
HashMap extends AbstractMap implements Map, Cloneable, Serializable.

3.css导入方式?
这个只要2周不没看过就会忘记。。博主当时就忘记了。。超简单的题,但是又是最不起眼的题,细节做的不够好。

<link rel="stylesheet" type="text/css" href="css/head.css" />

4.js中的ajax操作的方式?这个写的太多了,所以答起来很easy
5.1句话概括NIO。博主说了1通,包括Reactor模式神马的。但是面试官说:你说的也很对,但是否是我想要的结果。斯巴达。。。
6.设计数据库的1道题,比较简单,不赘述。
7.经常使用的linux命令?(这个被用了好屡次了)

cat tac head tail more less nl vim vi gvim date cal man shutdown poweroff reboot echo uname -r; mount; unmount; exit cd ls pwd mkdir cp scp rm mv touch file which whereis locate find tar unzip grep df top free kill killall ifconfig ping netstat telnet ftp passwd umask chrown chmod chgrp sudo ps who

8.Spring IOC的原理?答案:基于反射
9.数据库事务隔离级别?
Uncommit Read; Commit Read; Repeated Read; Serializable.
10.memcached与Redis的区分?

技术3面

之前说过博主对数据库相干的知识,除会写SQL以外,其他的基本白痴。这次面试将近40mins,差不多被问了30mins的数据库的知识。比如:数据库优化;访问多少条数据,数据库的反应延迟是多少;表和视图的区分。
固然还有1些其他的,比方Spring中的注解在xml文件中怎样配置?

<context:annotation-config>

面试进程中有两种问题比较难答:第1种,冷门知识,比如Colletions.sort()用到甚么排序算法?第2种就是上面的这类特别简单,用过的都知道,但是像这类在Spring配置文件中配置完以后就基本不动了,所以特别容易遗忘。
还有类似的比如:Spring中的自动装配怎样配置?

<context:componenet-scan>

HR面

最后是HR面,这个最简单,只要言语不过激都是okay的,主要谈谈在原来公司主要做甚么,为何要换份新工作,期望薪资神马的。(ps: 谈薪资是门艺术,一样两个人,面试打分也是1样的,但是薪资会谈和不会谈之间可能相差很多,这门艺术博主还在研究中,虽然有所收获,但是还是不敢出来卖弄,等博主把人事6大块之1的薪酬领悟以后再来探讨探讨。)

总结

博主总结几个心得,仅供参考:
面试第1要素:不要紧张,如果你真是技术族,而且对技术有所痴迷,1聊起技术来根本不会紧张。
面试第2要素:要对简历上的内容了如指掌,包括原理源码,如果略懂或根本就是用了几天就再也没用过的技术就从简历上删掉吧,否则被面试官捉住不放就糟了。
面试第3要素:学会引导面试,掌握主动权。这门技艺需要多去混点面筋,然后自我优化以后,1般都可以掌握。
面试第4要素:做人要低调。面试你这个职位的人的技术肯定比这个职位高好几个level, 不要觉得你回答了你非常熟习的问题就高调起来,面试官随时可以挖出1堆坑来让你往里面跳。
面试第5要素:要自信。有些面试官会对某些你回答完问题以后会补1句:你肯定?这时候候就要看你自己了,有可能面试官再提示你,也有可能再炸你。归根结柢还是要技术掌握的够硬,底气就足1些。

参考资料:
1. Java多线程知识小抄集(1)
2. 设计模式:单例模式(Singleton)
3. Java虚拟机类加载机制
4. Redis和Memcached的区分
5. 面向对象的设计原则
6. 攻破JAVA NIO技术壁垒
7. Java集合框架:HashMap

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐