这里有一份面经

来源:互联网 发布:mac网游团队竞技游戏 编辑:程序博客网 时间:2024/04/27 23:12

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


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


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


笔试题


据博主的回忆,共有这么些题(都是简答题):


1. 写出 java 中 synchronized 的使用方式。

可以参考:Java 多线程知识小抄集 (一)


2. Java 中设置最大堆和最小堆内存的参数是什么?

-Xmx -Xms


3. volatile 的作用?

两点:内存可见性;防止指令重排序;


4. 写一个二分查找算法


5. 写一个你熟悉的设计模式,画出 UML 图,说出此模式的作用以及写出此模式的主要方法。


6. 一道设计题。(略)


7. BeanFactory 和 ApplicationContext 的区别。(Sping 的容器可以分为两种类型 :1. BeanFactory:(org.springframework.beans.factory.BeanFactory 接口定义)是最简答的容器,提供了基本的 DI 支持。最常用的 BeanFactory 实现就是 XmlBeanFactory 类,它根据 XML 文件中的定义加载 beans,该容器从 XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用。 2. ApplicationContext 应用上下文:org.springframework.context.ApplicationContext)基于 BeanFactory 之上构建,并提供面向应用的服务。)


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


第一轮技术面


主要根据简历以及笔试题进行论述。


先将笔试题,首先是写出一个熟悉的设计模式,那当然写个单例咯,这个最简单嘛,主要是 UML 图也特别好画。详细可以参考设计模式:单例模式(Singleton)。博主写的是内部类的写法:


publicclass LazyInitHolderSingleton{  

    privateLazyInitHolderSingleton(){  

    }  

 

    privatestatic classSingletonHolder {  

            privatestatic finalLazyInitHolderSingleton INSTANCE =new LazyInitHolderSingleton();  

    }  

 

    publicstatic LazyInitHolderSingleton getInstance(){  

            returnSingletonHolder.INSTANCE;  

    }  

}  


这种写法是懒汉式线程安全的写法。


面试官问到一个问题:为什么这种写法是线程安全的?


那么这里就设计到一个 JVM 加载的知识:JVM 内部机制可以保证在执行类构造器 () 方法的时候是线程安全的,详细可以参考博文: Java 虚拟机类加载机制。


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


  1. 遇到 new,getstatic,putstatic,invokestatic 这失调字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这 4 条指令的最常见的 Java 代码场景是:使用 new 关键字实例化对象的时候、读取或设置一个类的静态字段(被 final 修饰、已在编译器把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。

  2. 使用 java.lang.reflect 包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。

  3. 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。

  4. 当虚拟机启动时,用户需要指定一个要执行的主类(包含 main() 方法的那个类),虚拟机会先初始化这个主类。

  5. 当使用 jdk1.7 动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果 REF_getstatic,REF_putstatic,REF_invokeStatic 的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先出触发其初始化。


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


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


接下去就根据简历聊一聊项目和 Java 基础了。下面稍微列举一些问题:


  1. Memcached 和 Redis 的区别? 参考:Redis 和 Memcached 的区别


  2. ActiveMQ 的集群配置方式有哪些?(基于共享文件,基于数据库,基于 Zookeeper 等)


  3. Mybatis 的一些知识点。(略)


  4. 虚拟机的类加载机制。(加载 - 验证 - 准备 - 解析 - 初始化,详细可以参考 Java 虚拟机类加载机制)


  5. 内部类相关知识点。


  6. 面向对象的设计原则?参考:面向对象的设计原则


  7. Spring Aop 的原理?动态代理。


  8. Spring 常用的注解?


  9. NIO 的相关。参考:攻破 JAVA NIO 技术壁垒


  10. 数据库优化相关。(博主基本不直接接触数据库,so 遇到此类问题直接 say: I don’t know. 有兴趣的小伙伴可以自行查阅一些资料,譬如数据访问优化漏斗法则。)


  11. linux 下查看文件有哪些方式?cat tac head tail more less nl vim vi gvim


技术面二面


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


1. 谈谈你对 HashMap 的理解,怎么样去保证线程安全?


博主对 HashMap 巴拉巴拉的一阵,可以参考:Java 集合框架:HashMap. 然后有三种方法可以保证 hashMap 的线程安全:换成 HashTable;用 synchronizedMap 包装一下 HashMap; 换成 ConcurrentHashMap。然后补了一句 ConcurrentHashMap 是比较推崇的,然后就被问了另一个问题:说一下 ConcurrentHashMap 的实现原理。然后解释了一下,最后问了个问题:用 HashMap 怎么去实现 ConcurrentHashMap?当时想了一个,觉得不 okay,想说第二个方案就被制止了。现在想想:把 HashMap 用 Collections.synchronizedMap() 包装一下替换屌 Segment 即可。(如果不知所云,请阅读一下 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)。这里如果说出来了,就必须对其十分了解,比如博主在另一家互联网公司 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 周不没看过就会忘记。。博主当时就忘记了。。超简单的题,但是又是最不起眼的题,细节做的不够好。


"stylesheet"type="text/css"href="css/head.css" />



4.js 中的 ajax 操作的方式?这个写的太多了,所以答起来很 easy


5. 一句话概括 NIO。博主说了一通,包括 Reactor 模式神马的。但是面试官说:你说的也很对,但是不是我想要的结果。斯巴达。。。


6. 设计数据库的一道题,比较简单,不赘述。


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 pswho


8.Spring IOC 的原理?答案:基于反射


9. 数据库事务隔离级别?

Uncommit Read; Commit Read; Repeated Read; Serializable.


10.memcached 与 Redis 的区别?


技术三面


之前说过博主对数据库相关的知识,除了会写 SQL 之外,其他的基本白痴。这次面试将近 40mins,差不多被问了 30mins 的数据库的知识。比如:数据库优化;访问多少条数据,数据库的反应延迟是多少;表和视图的区别。


当然还有一些其他的,譬如 Spring 中的注解在 xml 文件中怎么配置?


context:annotation-config>



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


还有类似的比如:Spring 中的自动装配怎么配置?


context:componenet-scan>



HR 面


最后是 HR 面,这个最简单,只要言语不过激都是 okay 的,主要谈谈在原来公司主要做什么,为什么要换份新工作,期望薪资神马的。


(ps: 谈薪资是门艺术,同样两个人,面试打分也是一样的,但是薪资会谈和不会谈之间可能相差很多,这门艺术博主还在研究中,虽然有所收获,但是还是不敢出来卖弄,等博主把人事六大块之一的薪酬领悟之后再来探讨探讨。)


总结


博主总结几个心得,仅供参考:


面试第一要素:不要紧张,如果你真是技术族,而且对技术有所痴迷,一聊起技术来根本不会紧张。


面试第二要素:要对简历上的内容了如指掌,包括原理源码,如果略懂或者根本就是用了几天就再也没用过的技术就从简历上删掉吧,否则被面试官抓住不放就糟糕了。


面试第三要素:学会引导面试,掌握主动权。这门技艺需要多去混点面筋,然后自我优化之后,一般都可以掌握。


面试第四要素:做人要低调。面试你这个职位的人的技术肯定比这个职位高好几个 level, 不要觉得你回答了你非常熟悉的问题就高调起来,面试官随时可以挖出一堆坑来让你往里面跳。


面试第五要素:要自信。有些面试官会对某些你回答完问题之后会补一句:你确定?这时候就要看你自己了,有可能面试官再提醒你,也有可能再诈你。归根结底还是要技术掌握的够硬,底气就足一些。


参考资料:

1. Java 多线程知识小抄集 (一)

2. 设计模式:单例模式(Singleton)

3. Java 虚拟机类加载机制

4. Redis 和 Memcached 的区别

5. 面向对象的设计原则

6. 攻破 JAVA NIO 技术壁垒

7. Java 集合框架:HashMap

==================================================================================


这里讲述下第二家公司的面试,这是一家大型互联网公司,简称W,一般像博主这样的传统行业去跳到这种公司简直是要跪舔的节奏,所以从一开始就带着一份敬仰之情去面试。由于和博主不在一个城市,所以一面选择电面,二三面技术面去了公司face to face, 最后一面是HR面。这里HR面就略过,只讲述技术类相关的问题。


一面


一面约好14:00,果然14:00就来电话了,这点可以看出管理上还是很厉害的。


1.linux下怎么查看文件内容?

如果看过前面一篇的小伙伴是不是已经知道答案了:cat tac more less head tail nl vi vim gvim


2.消息队列用什么作用?

博主只知道解耦,或者可以当数据冗余只用。后来查阅了一下,原来消息队列有这么多功效:解耦、容易、扩展性(增大消息入队和处理的频率是很容易的)、灵活性和峰值处理能力、排序、缓冲、送达保证(消息队列提供的冗余机制保证了消息能够被实际的处理,只要一个进程读取了该队列即可);异步通讯。


3.设计模式:说说一些常用的设计模式。

设计模式23种,分为创建型、组合型、行为型。

说了一些常用的:单例,适配器,工厂,装饰等。然后被问了一个问题:Java中的IO包含了那些设计模式?博主记不清是不是这家公司的面试题,姑且就算作是吧。拒博主所知,Java中的IO用了两种设计模式,装饰模式和适配器模式,装饰模式比如BufferedInputStream, DataInputStream; 适配器的有InputStreamReader, OutputStreamWriter。


4.SpringMVC的分发过程?

具体指DispatcherServlet怎么运作的原理图,可以参考《Spring知识点提炼》,包括二面也让我画了一个这个图。


5.Spring AOP和IOC的实现原理?

分别是动态代理和反射


6.多线程的应用场景。

这个就仁者见仁,智者见智随意聊咯。


7.对着简历问一下项目相关的知识点。在此就不表了。


二面和三面


二面和三面是face2face的。二面问了写Java基础。


1.线程池

就是ThreadPoolExecuotr,里面的各个参数解释一遍,包括什么饱和策略。然后工具类Executors中有哪些方法,包括:newFixedThreadPool, newSingleThreadExecutor, new CachedThreadPool以及Scheduled系列。


2.简述下JVM。

这个是个开放性的问题,考验你对JVM整体的理解。从Javac讲述到GC:

首先通过IDE编写完java程序之后,就要javac来编译成class文件,分为:词法分析,语法分析,语义分析,代码生成是个阶段,在语义分析阶段又可以分为:填充符号表、标注检查、数据流分析和控制流分析。标注检查比如定义int a=1+2,在这个阶段就会被解析成int a=3; 又比如在控制流分析阶段又去除语法糖的动作,类似foreach的解语法糖等。


其次,编译生成class文件之后,就需要JVM加载。加载涉及到一个双亲委派模型,需要对双亲委派模型进行一下论述,以及为什么需要双亲委派模型(为了安全加载)。


类在加载之后就需要涉及验证-准备-解析-初始化的操作。

验证:目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。比如是否以魔数0xCAFEBABE开头。

准备:正式为类变量分配内存并设置类变量初始值的阶段。譬如public static int value=123;这时候赋值value为0.

解析:虚拟机将常量池内的符号引用转换为直接引用的过程。


初始化:这个阶段在上一篇讲过了,一定要突出这个知识点:虚拟机规范严格规定了有且只有5种情况(JDK7)必须对类进行初始化(执行类构造器()方法):


遇到new,getstatic,putstatic,invokestatic这失调字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这4条指令的最常见的Java代码场景是:使用new关键字实例化对象的时候、读取或设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。


使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。


当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。


当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。


当使用jdk1.7动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getstatic,REF_putstatic,REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,则需要先出触发其初始化。

初始化之后就可以使用了,加载的类信息存入了运行时数据区的方法区,也就是俗称的永久代。运行时数据区分为:java堆,java栈,本地方法栈,方法区,pc寄存器。然后简单叙述下这些概念。


new一个对象需要在java堆中开辟内存,使用完之后就需要垃圾回收操作了,接下去要将GC了。


以Hot spot为例,java堆分为年轻代和老年代。通过GC Roots标记不可达内存对象进行回收处理。GC算法有:Mark-Sweep, Copying, Mark-Compact, 分代。接下去就论述垃圾收集器了。年轻代有Serial, ParNew, Parallel Scavenge等都是采用复制算法。


老年代有Serial-Old, Parallel-Old, CMS。还有一个G1收集器。一般互联网公司喜欢采用CMS,然后就论述了一下CMS,CMS分为5个部分:初始标记,并发标记,重新标记,并发清除和并发重置,其中初始标记和重新标记是需要Stop the World的。CMS还有一个概念就是Concurrent Mode Failure,发生之后需要来一记Serial-Old的干活。


这个过程其实蛮长的,大概论述了将近20mins左右。


3.写出策略模式的UML图。

可以参考《设计模式:适配器模式(Adapter)》


4.你对Java集合了解的怎么样?

博主说Java集合的源码都看过,意思是随便问,然后被问了一个特别冷门的问题,这个问题在上一篇提及过,是Collections.sort()中使用了什么排序算法。幸亏博主看过,不要就要被活生生的打脸了。答案是:加强型归并排序,ComparableTimSort.(这里不只是有归并,还有其他算法,详细需要慢慢琢磨源码~)

这里还是强调一下冷知识的重要性,一般特别偏的知识都知道的话,其他的知识其实是默认掌握了的。博主这里在讲几个冷知识:


ThreadLocal什么情况下会发生内存泄露?(一个朋友也是在这家公司被问过这个问题)(线程池)


WeakHashMap会发生内存泄露嚒?(key==null)


Doug Lea在写JUC的时候为什么喜欢使用for(;;)表示死循环而不是用while(true)?(情怀)


JDK中除了IO使用了装饰模式,其他什么地方还使用了装饰模式?(Collections.synchonizedMap, unchecked系列以及unmodifiable系列)


for(;;)和while(true)的区别大致有以下几种论述(仅供参考,博主更偏向于的说法是“情怀”)


1. 大多数时候开启优化两者之间性能没有什么区别。

2. while(true)比for(;;)编译后的指令多。

3. while(true)每次编译器都要判断一下true

4. for(;;)比while(true)敲的字符数更少

5.三面是部门领导,问了点项目相关的技术。这个具有特殊性所以就不表了。


总结


这份工作是猎头找我的,我看到W公司的名字欣然say: I wanna have a try. 但是后来一面完了之后,我也不知道我面的岗位是哪个。后来三面了才知道是做BI的,其是对这个工作不排斥也不喜欢。后来拿到offer也拒了,除了薪资低于预期之外,还有一个博主觉得很重要的一个东西,博主站在W公司门口,包括在W公司边上转了一圈,I feel a bit homeless, 毕竟在这个城市认识的人可以用一只手数的过来,而且都在城市的另一边。


感觉如果进了这家公司,每天只能像machine一样活着。毕竟这家公司出了名的996机制。W公司是博主面完的第一家公司,但是博主当时一共投了8家(有2家一面面完就不想去了。。。)一面都过了,让我去面试,所以在自信心上有所增强,觉得自己没有必要去跪舔了,有实力去find a better job,所以在收到offer之时就拒了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机用久了变慢了怎么办 免税店买的皮带太短了怎么办 小米手机自拍照片是反的怎么办 华为p20旅行助手被删了怎么办 假如手机点击一个链接是病毒怎么办 华为手机自带铃声没了怎么办 华为手机升级后铃声没了怎么办 华为平板电脑激活锁忘记了怎么办 华为手机不小心删了系统应用怎么办 华为畅想6s开机键坏了怎么办 浏览网页是进入有病毒的网页怎么办 华为荣耀7清理加速那么慢怎么办 华为手机自带天气卸载了怎么办 手机被病毒感染了开不了机了怎么办 小米手机系统桌面已停止运行怎么办 三星手机应用锁密码忘了怎么办 手机管家应用加密密码忘记了怎么办 下载东西呗安全管家制止了该怎么办 手机百度时不小心中毒扣话费怎么办 手机扫二维码中了木马病毒要怎么办 电脑管家微信扫描语音打不开怎么办 遇到花心老公又爱玩没有担当怎么办 软件全闪退返回键不管用了怎么办 为什么下载了我的世界打不开怎么办 问道手游安全锁忘记了怎么办 电脑显示网络电缆没有插好怎么办 手机扣扣的密码忘记了怎么办 扣扣忘记密码和密保怎么办 以前用的扣扣密码忘记了怎么办 我忘记扣扣支付密码了怎么办 百度云盘下载后怎么打不开怎么办 节奏大师领钻石卡丢了怎么办? 节奏大师体力赠送关了打不开怎么办 微信钱包转账转错账号怎么办 激活微信账号电话号码输错了怎么办 爱思助手加强版下载不了软件怎么办 苹果手机用爱思助手游戏闪退怎么办 新买的手机号支付宝被注册了怎么办 王者荣耀以前领的东西忘记换怎么办 科目三停车时把油门踩成刹车怎么办 澳邮奶粉快递过程中破了怎么办