个人JAVA面试经验(3年左右工做经验)

前言-

   致那些迷茫的JAVA面试者(特别是南京的1-4年经验),致那些奋发的年轻人,致本身。写这篇博文主要也是对个人成长道路的记录,面试受挫后的反思,及对本身的勉励。前端

本人介绍3年多经验的程序员,坐标南京。java

背景因水平有限,及对部分面试问题记忆及理解有限,可能有些问题并不能表达准确。掌握技术有限,学习主动性通常(虽遇到问题善于思考钻研,但若是没有遇到问题比较放纵本身...被自由,轻松,安逸迷失心智),以及原公司项目背景因素,基本不须要太多新的技术框架支持,更没有涉及消息中间件,高并发分布式等等相关较主流技术,技术体系相对较老。综上致使我对不少新技术并非太了解。mysql

面试经验背景:基本公司都是按简历掌握技术来问(固然也有超纲不按套路出牌的),若是你简历掌握技术什么都不写,也有可能接到面试邀请,那么面试官问题可能就比较广了,对面试者不利。掌握技术我写了java基础:多线程,io/niojvm,集合底层,tcp/ip协议,socket,websocket。springspringmvcxml,设计模式eclipse plugin开发,数据库,前端(基本没有什么人问,面的后端开发,也许熟悉前端也是加分项)了解nettymybatisredis(实际就是看了一点点).jquery

项目经验背景linux

1.原公司我所在的部门作的是一款大型工具,web项目。项目周期很长很长,至今还在作,具体不细说,技术上就用了上述我写的部分技术(未涉及redisnettymybatisspringmvc),做为项目经历,该项目竞争力不强。程序员

2.朋友找我作的私活项目,只接触了一个星期左右,朋友就跟接活人闹崩了,而后不了了之。可是我仍是把项目写进项目经验了(投递的时候写,自带的纸质简历就把它去掉,以防面试官问到我一脸懵逼...机智如我,固然也有公司不须要你的自带简历,那就没办法,他问到的话我就忽悠,坦白)。实际就是个特别小的项目,用到的技术springmvcmybatisredisactivemq,阿里云对象存储等等。这个项目我只稍微了解了一点点springmvcmybatisredis最最基本的用法,能够说没啥用。web

面试经历(具体录用薪资我就不说明了,只说我对薪资+公司福利满意度。面试

      面试中项目介绍一定要说的,以及项目中的细节问题,这些不细说了。只说技术问题)redis

 按时间前后排序(时间越远遗忘的问题可能越多。不少重复的,将就看吧)算法

1.小公司

  名字忘了。时间久远,只记得有多线程,线程池拒绝策略,jvm调优,tomcat调优,消息中间件,分布式,集群,zookeeper,微服务。sql左链接右链接区别,存储过程。linux。基本全程懵逼,(由于第一次面试,简历技术什么都没写,这货敞开了问)。最后居然通知我面试经过。

难度-

公司环境-不满意

薪资福利-不满意

工做内容-不满意(忽悠我刚开始写逻辑代码,之后可能会作微服务,大数据,基本不加班,我是不信的)。

2.软通动力(华为外包)

  stringbufferstringbuild区别,stringbuild线程不安全体如今哪,你对线程安不安全怎么理解(这个问题发挥空间很大,关键词:全局变量、JVM运行时数据区、可见性、原子性、锁、甚至能够说到多核cpu硬件层面(我是不会的)),arraylistlinkedlist区别,spring iocaop做用,原理。springmvc执行流程(这种问题最扯淡),hashmap原理(问的很浅,底层结构,答数组+链表/红黑树。他就没问了),hashmap,hashtable,concurrentHashMap(大体基本说下,他就不问了),hashmap遍历。对大数据有关技术了解多少(答:了解一点,听过hadoop)。其它忘了,整体难度不大。写代码:字符串分割排序(split+冒泡))。

难度-简单

薪资福利通常

工做内容-不满意(外包你懂的。有关大数据方面的(这点还能够),更多的是数据清洗)

3.鸿信集团(电信子公司)

  一个年纪比较大的面试官,像管理层人员,感受技术水平有限。基本就问了项目,spring的理解,activemq,没了。笔试,扯淡的笔试题,写了一点走人了。公司总体给人的感受比较自由松散,适合养老。感受技术上没有发展空间。

面试建议-别去

4.苏宁

  我先后面了4(由于住的地方就靠着苏宁,没事就顺便去面试打发时间,4个部门,经过了3)。写一块儿。

苏宁金服:问的项目业务,公司业务模块(无从下口),为何要用redis,相比于如memcached,mongodb有什么优点,mybatisactivemq。springmvc有什么好处,为何要用它,springmvcstruts区别(都不会)...用过什么数据库,有没有作过数据库优化,什么状况下要用到索引,好处是什么,哪些字段适合创建索引,mysql索引底层数据结构了解吗,索引什么状况下会失效,联合索引abc只用了a字段,索引是否会生效。什么状况下要用到多线程,为何要用,好处。启动多个线程,如何知道他们都运行完毕了。jquery要想取某个节点中的第几个元素怎么写,具体哪一个方法((我看你是闲着蛋疼)答:元素选择器,find,eq)。 整体回答的很很差,感受他就盯着我写的了解程度的技术问,有为难我下降我薪资要求的意思。最后通知面试经过(也许是真的缺人,也许是我吹牛比较6,画了项目流程图给他)

难度-对于我来讲难(其实通常,主要是我实在不太会他问的框架技术)

薪资福利通常(面的不太好的地方我是不太好意思去的,感受进去有种抬不起头的感受)

苏宁易购网站购物车消费者业务线:string为何是不可变的,重写重载,object类有哪些方法,sleepwait区别,实现线程的方式,runstart区别,线程有几种状态,synchronize实现原理(这个问题能够说的不少,建议你们往深了看,往深了说,以震慑面试官),与lock区别,还知道哪些锁,说说自旋锁。线程池,线程池等待队列,拒绝策略,死锁产生缘由。为何java能够一次编译,处处运行。事务特性,索引失效,mysql有哪些函数。httphttps区别,get和post区别,springbean是单例吗,spring源码看过吗,其中的单例bean是怎么实现的。redis有支持哪些数据结构。servlet怎么取前端参数。(两个面试官,感受面试官水平有限,一直在想问什么问题,越问越没难度)设计个洗牌算法。线上购物车须要有个标志惟一id,有什么方法实现这个iduuid,参考jdk中random实现原理,取随机种子)

难度-通常

薪资福利通常

大数据部门:抽象类接口区别,接口中能够定义成员变量吗,默认是什么类型的变量(public static final),接口中方法权限能够是private吗,接口是否能够写具体实现(答:jdk8开始能够)重写重载区别,线程的实现方式(我已经感受到这个部门有多缺人了)。sql交并集,事务隔离级别。能调用另外一个类的私有方法吗,怎么作。若是线程池执行shutdownshutdownNow,线程池中线程会中断吗,会出现什么异常,catch处理中该写些什么。用过哪些concurrent包下的类,说说原子类,cas操做可能会存在什么问题。jdk中有哪些设计模式的运用,项目中用了哪些设计模式,treemapcompartor用了什么设计模式,有哪些单例模式的实现方式,springbean是单例吗。若是想要在某些本身指定的某些方法先后打印日志怎么实现(答:自定义注解,问:具体怎么作,答:spring aop的实现思路...),注解实现原理。

面试难度-通常

薪资福利较满意

苏宁物流部:苏宁最难的一次面试经历,也许是晚上面试,时间充分,安静,面试官比较好发挥,我全程半懵逼,面试官是中年人,看气势最起码经理级别。

servletjsp区别,若是没有servletjsp怎么跟后端交互(大概是这个意思,没听太懂,一脸懵逼)。springmvc怎么取前端数据,springmvc模式下,若是没有注解怎么取前端参数(答:servletrequset.getParameter。他问,具体在哪怎么用,也没听太懂,懵逼)。搭建springmvc项目步骤。spirngmvc controller中定义全局hashmap,它是不是线程安全的,为何。

Io nio区别,nio原理。netty用的多吗。答,很少。

项目中用哪一种方式解析xml的 答:jaxb,dom4j,digester。问:jaxp是什么。 答:是jaxb,巴拉巴拉... 问:哦哦,挺好用的

servlet生命周期。tomcat在初始化中作了什么事(答:启动socket服务端...问:没了吗?答:... 很明显该回答的还有不少,想了解的应该是我对tomcat的理解程度,以及是否看过tomcat源码)。是否用过Nginx。过滤器和拦截器的区别。

项目中有用到缓存吗,redis有提供了哪些存储数据结构,redis持久化。

说说java内存模型,新生代老年代算法,你说的新生代老年代属于堆仍是栈,还知道哪些gc算法,建立大对象也是在新生代分配吗,(答:直接晋升进入老年代,问:具体多大对象,答:超过eden区大小,问:你是否肯定,顿时虚了,后来回去查阅过,我回答的不对,jvm这里的看点不少,涉及到优化)。新生代的算法,说说minor gc,minor gc触发条件。老年代用了什么算法,说说标记整理算法,full gc是否真正回收了废弃对象。有哪些gc策略。你以为你的项目中若是须要jvm调优你会注重哪一个分带的调优,或者说更注重哪一种gc调优,为何,具体怎么作(懵逼,随便吹了下。问:你肯定吗?  顿时又虚了)。

线上系统天天会收到20万级的数据,一个月会有百万条,而且还会递增。你如何设计数据库(答:分库分表,创建索引,问:分库分表对的,还有哪些点,分库分表按什么规则分)。若是查询字段不是分库分表的规则字段,怎么办(他说没事,想到什么说什么,也许你的思路会比咱们的更好,你说说看)。沉默许久,不会,没接触过。(后来查了该问题:分库分表多维度查询)问:oracle分页的sql关键字是什么 答:limit 问:不对吧,那是mysql的 答:啊?好吧 问:也许是limit,我也记不清了,可能你说的是对的,回去我得看看。(面试官还算和善,实际上是rownum

面试难度

苏宁结束,总结:苏宁大部分部门都很是缺程序员,招人要求相比于其它大点公司要低一些,都会问的一样的问题:可否接受苏宁的加班(部门加班状况不一,按我面试部门了解(加班从多到少:金服->物流/购物车->大数据部门),整体加班不少) ,苏宁的软件电商工做在外的名声整体不太好,加班严重,福利通常,晋升难,据说不是太注重员工培养。

5.烽火科技

    写笔试题,笔试题一看就是用心出的(基础题偏多,也有问答题:线上系统出现故障,怎么排查。以及一些编程题:用jdk自带包实现抓取指定网页元素/内容(不会,后来查了,代码以下:

static void doGet() {
    try {
        String urlStr = "https://bbs.csdn.net";
        URL url = new URL(urlStr);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestMethod("GET");
        connection.setUseCaches(false);
        connection.setInstanceFollowRedirects(false);
        connection.connect();

        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String ss ,total="";

        while ((ss = reader.readLine()) != null) {
            total += ss;
            total+="\n";
        }
        System.out.println("total=" + total);
        reader.close();
        connection.disconnect();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

),两个线程间隔输出字符,文件夹中查询指定类型文件)。

     面试开始:1面。3个技术人员依次提问,jdbc链接步骤,statement和prepareStatement区别,项目中数据库事务控制大家是怎么作的。TreeMap,TreeSet,HashSet实现原理(以前只看了hashmap(别人都问hashmap,恰恰他就不问,这公司有套路的)其它回答的很差。此次面试经验很重要-全部集合实现都得认真看一遍),dom4j怎么取节点。为何重写equals方法最好也得重写hashcode。treeMap中元素怎么排序,若是没实现comparator接口会怎么样。序列化做用。

            中途hr跟我聊了聊公司福利,公司制度。

            2面,也是3我的,项目经理(从言谈中看得出来技术沉淀很不错)+HR+不知道什么人(女,基本没说话)。都是项目经理问。自我介绍,项目介绍,项目细节(问的很细致)。项目中有用到多线程,线程池吗,怎么用的。说说你对hash的理解。hashSet是怎么去重的。你知道哪些map,set,说说他们实现原理。红黑树,二叉树。sql优化。linux。socket长链接短链接,链接出现异常你是怎么处理的。定时器。若是cpu有8个核心,那么程序启动多少个线程相对合适(懵逼)。最后仍是经过了。

    难度-稍难(其实还好,是我准备不充分)

    薪资福利 - 不满意

6.擎天科技

    最扯淡的一次面试。浪费我时间

    面试建议-别去

7.亚信科技(亚信安全)

     写面试题(难度通常,sql,springmvc,编程)。Integer缓存-128-127对象相不相等问题,其它都是上面提到的问题,不细说了(感受面试官水平有限),问题基本都完整的回答出来了。跟面试官也谈了好久,问了他们如今具体作什么,用了什么技术,这家公司所用技术挺老(估计还没我原公司用到的技术多),貌似也是在作工具,非线上系统。还夸赞了我在原公司的作的项目(全部面试中惟一夸赞的)。

     由于此次面试很成功,并且此公司环境和技术方面没有吸引个人地方,并且面试官还说他们可能就12-13薪 。综上最终我提了个很高的薪资要求,xx最低。

    面试难度-简单

 薪资福利- 通常(没达到我提的要求)

8.中地控股(付融宝),云问科技。这两家问题合并放一块儿(由于问的不少问题对于我来讲算是超纲了,更多的偏向了线上系统大流量状况下的处理方案)。

  treeMap元素排序。项目中是否作过jvm优化,sql优化。gc算法。是否用过webservice。mybatis分页,redis有关问题。BIO,NIO,AIO区别。高并发状况下怎么下降服务器压力(暂不从增长服务器和硬件提高层面考虑),方案解决问题:

   1.假如servlet处理一个请求须要0.4秒,那么处理100请求大概须要多久,为何。同时处理1000个请求致使服务器压力过大崩溃怎么解决

      2.线上系统形成服务器cpu占用率太高问题(网上有解决方案) 

      3.秒杀系统少卖超卖问题怎么处理(网上有解决方案)

      4.有个业务场景,经过第三方工具收集到大概百万条手机号,存储到文本中,文本中每行一个号码。咱们的数据库中会存每一个号码对应的会员等级信息(也有可能这个号码在数据库中不存在,那么他就是新用户)。按会员等级给号码发送不一样内容的信息,新号码发送邀请信息。设计一个方案,怎么作效率最高(数据库数据量很大)。

      难度-很难  

9.焦点科技

    两位面试官。项目介绍,细节提问。

    项目中用到缓存了吗,答:曾经打算用用ehcache,后来发现种种缘由(细说)并不须要用到

    eclipse插件开发,它的初始化方法是什么(答:2年前作的了,实在是忘了...)

    如下问题问的很细,我用红色标注面试官的提问。

    ArrayList和LinkedList区别,ArrayList有初始容量吗,你看的是jdk几版本 ,容量不够怎么办 ,扩容为多大 ,若是Arraylist当前容量是10,且有9个数据,那么是添加第10个数据时扩容仍是第11个,扩容怎么实现的,为何采用复制数组的方式而不是日后直接添加数据  。(回答的很差,我回答的是jdk1.8初始化容量10,扩容回答的是2倍,都错了...ArrayList没细看,觉得很简单,大概看看就好了,而后看完就忘了,实际上可看的点仍是不少的。回去以后研究了下,JDK6-8ArrayList实现都有变化:体如今初始容量不一样,1.7以前初始化容量为10,1.7及以后只会初始化空{},添加数据时才会开始给定初始化容量,若是初始化时自定义容量,那么状况又不同,扩容规则

int newCapacity = oldCapacity + (oldCapacity >> 1);

以及其它一些细节,这里就不细说了)而后我说ArrayList看的不太仔细,面试官问:你比较熟悉哪一个集合,答:hashmap。

      说说hashmap数据结构(数组+链表,链表长度超过8此链表转为红黑树(其实不许确,后来又看了1.8源码

     

final void treeifyBin(Node<K,V>[] tab, int hash) {
    int n, index; Node<K,V> e;
    if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
        resize();
    else if ((e = tab[index = (n - 1) & hash]) != null) {
        TreeNode<K,V> hd = null, tl = null;
        do {
            TreeNode<K,V> p = replacementTreeNode(e, null);
            if (tl == null)
                hd = p;
            else {
                p.prev = tl;
                tl.next = p;
            }
            tl = p;
        } while ((e = e.next) != null);
        if ((tab[index] = hd) != null)
            hd.treeify(tab);
    }

数组长度少于MIN_TREEIFY_CAPACITY  是不优先转红黑树的,而是优先进行扩容))。

        说说红黑树,它是基于什么数据结构实现的(红黑树了解不深,只是大体说了下思想-旋转、平衡、大小比较。(我感受很难,有空得静下心来好好研究))。红黑树可能会再转为链表吗(答:长度低于8会转回链表 问:你肯定是8而不是6 答:好像是6... (hashmap的看点真的不少,回去看了源码真的是6,并且扩容时红黑树变化很复杂,暂时看不懂))。说下hashmap put的过程(答:key的hashcode高16位与低16位异或运算获得新的hash,为了让数据(特别是在当前容量不大的状况下)散列更均匀,而后把异或计算出的新hash与此时的hashmap容量-1作&运算,获得插入下标。问:为何要作&运算,还有什么方式。答:二进制运算速度快,还能够取模。以后若是下标位数组无数据则直接插入,若是有数据则链表往下逐个进行hash比较,若是产生hash碰撞再进行==或者equals比较key是否同样,同样则覆盖原数据,不然添加到链表后面。问:发生hash冲突怎么办 答:刚刚说了(重复) 问:你肯定是添加到链表后面吗 答:肯定(我怀疑他jdk8的hashmap没看全(jdk7是新元素插入至链表头部的)还问了产生hash冲突后为何还会比较原来key的hashcode,表示没听懂,看了源码也没发现有再次比较的过程,并且以后也重复问rehash后的元素具体去向问题(1.7和1.8元素rehash后元素去向是不一样的),还有扩容问题,感受他对jdk8的hashmap和1.7的有点混淆(还好我没怎么看jdk7,不过若是jdk7也看明白了,再说明与1.8的区别以后估计会大大加分吧,有点遗憾))。继续,当hashmap中数据量超过当前容量*扩容因子(默认0.75)则扩容为原来的2倍,问:还有什么要求 答:好像没了 问:当前插入的位置上没有元素就不扩容吧 答:哦哦。(其实否则,他说的是jdk7的状况,jdk8没有这个要求。当时要是知道7和8的区别,指出这点,那就是亮点了,再次遗憾))。为何是2次幂扩容。(答:我以为有3点因素。2进制运算快;hash与当前容量-1作&运算很快且很巧妙地得到元素下标;扩容后能巧妙地从新分配元素位置)说下扩容的rehash,扩容后的部分节点数据会从新定位,具体规则是hash&原容量,获得无非两个结果:0和1,若是是0则该元素所在下标位置不动,若是是1则将该元素放置原位置扩容后的对应位置(假如原先容量为16,元素位置在数组下标14的位置,则扩容后容量为32,该元素移动到数组下标30的位置(即原索引+原容量位置)。当时没这点解释的不够准确,有瑕疵)。为何看hashmap源码,你以为看了后对你有什么好处(答:比较喜欢探究(实际上是近期面试才认真看的...)。知道了计算机位运算速度会比其它数学运算快;学习了它的思想对我思考问题方式有提高(能吹多少尽可能吹多少);扩容是一个费性能的事,若是知道集合中大体会存多少元素最好给它一个初始容量),若是你知道里面会存100个左右数据,你会给它多大初始容量 (答:128) 它是线程安全的吗(答:不是,jdk1.8多线程状况下可能会形成数据丢失,1.8以前更可能形成死循环),线程安全的map有什么(答:hashtable,concurrentHashMap,前者已经被后者替代了,效率更高),说说concurrentHashMap,默认容量多少(答:16。只是了解,太复杂了,没细看,只知道jdk1.8以前采用分段锁方式处理,1.8以后采用cas乐观锁的方式来操做)。其它集合类了解吗(hashSet,treeSet,treeMap,都解释的相对明白,篇幅过长,不细说了),它们是否容许插入空值(treeSet,treeMap不能够)使用treeMap有什么须要注意的 (其中的元素要实现comparator接口)

      有关synchronize的问题(忘了怎么问的了,只记得回答的挺多(做用,原理及jdk6以后的优化(锁升级:偏向锁->轻量级锁->重量级锁)))。Lock接口有哪些实现类,说说读写锁。

      java内存模型,新生代老年代算法,简述新生代老年代gc过程,算法(复制回收(这里没说太明白,有点模糊),标记清除,标记整理(也说的不漂亮))。为何新生代和老年代采用gc算法不一样。jvm调优。

      线程池有哪些参数,各表明什么意思。线程池中提供哪些队列种类。假如线程池核心池5,总池大小10,有界队列长度10,如今有13个线程要用线程池运行,说下核心池和队列中的线程状况。jdk中提供了哪几种线程池的实现。项目中用到线程池吗。

      JDK中有哪些设计模式的体现,io中用了什么设计模式,说说观察者模式,项目中用了哪些设计模式。jdk8有哪些新增功能(答:那个箭头的那个叫什么来着  面试官:(笑)lambda表达式 答:对,可让一些操做更直白简单,也有效率上的提升 问:说说它的闭包体如今哪 答:(随便说说,也不知道对不对) 还有哪些其它功能 答:还能够参数传入方法 问:它有什么好处 (随便说了点,也不知道对不对))。     

    redis有哪些数据结构。spring bean的生命周期,spring的BeanFactory和FactoryBean有什么区别。

    以后问工做中,代码上的一些注意细节,总共面试时间将近2小时,最长时间一次面试。给个人感受面试氛围很好,有位面试官全程都是笑着的,另外一位稍微严肃,都挺好。

面试难度稍难

薪资福利-薪资稍低,福利很好

-------------------------------------------

总结:大型互联网通信公司相对于外包、小型公司更注重面试者对基础的掌握程度。

面试及学习建议:(基础->spring/springmvc/mybatis/数据库、缓存->消息中间件(activemq、kafka...)->(后面的仅表明我的见解,未知领域...)springboot、微服务、docker/分布式zookeeper、rpc/大数据相关

共勉 -2018.5.16