这里有一份面经请查收(三)

2016/07/25 · 职场 · 面试

分享到:0
  • Java 分页原理与实践(下)
  • 模式的秘密---适配器模式
  • Hibernate初探之一对多映射
  • 走近大数据之Hive入门
本文作者: 伯乐在线 - 朱小厮 。未经作者许可,禁止转载!
欢迎加入伯乐在线 专栏作者。

经过前面两次的面试,这里就马上转到第三家公司了的面试了,这里简称B,工作地点和上一篇所讲述的W公司在一个城市,是面完W之后第二天去的,说出名字的话大多小伙伴都听过或者用过其服务,具体是什么要靠你们的悟性了。

一面

B公司的一面也是电面,主要是根据简历上的聊了一下,问了几个问题。挑两个比较有通用性的问题聊一下。

1. 了解Spring框架多少?

博主说SpringMVC+Spring是比较常用的,看过一点Spring的源码,主要是关于Xml解析和Bean加载的,记得大致的步骤。面试官就让博主讲一下Bean的加载过程。其实这个是蛮长的一段,主要有一下一些步骤(博主个人理解,仅供参考):xml解析之后存入一个BeanDefinition之中,然后主要是对其进行操作;先在singletionObjects(是一个ConcurrentHashMap的对象)判断有没有Bean的实例,有就处理下返回,没有就继续;检测一下循坏依赖之类的;下面要进入主题了,如果是单例(Spring Bean默认是单例)的话,就创建实例并存入singletonObjects中,如果不是则创建不保存(当然这里也有一个非常复杂的过程,这里就不论述了);实例创建完之后就开始属性注入(autowiredByType, autowiredByName);初始化Bean(激活Aware方法:BeanNameAware, BeanFactoryAware, ApplicationContextAware等;BeanPostProcessor接口;激活自定义init方法:init-method, InitializingBean接口;);这里就可以使用Bean了;使用完之后就是销毁了(destory-method, DisposableBean接口)。有关Spring的一些知识点可以参考《Spring知识点提炼》。

之后又被问了个问题:大家都知道BeanFactory是什么,那么你了不了解FactoryBean呢?这个见过,但是真记不得干嘛用的,后来翻看了下资料:一般情况下,Spring通过反射机制利用bean的class属性指定实现类来实例化Bean。在某些情况下,实例化bean过程比较复杂,如果按照传统的方式,则需要在中提供大量的配置信息,配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案,Spring为此提供了一个org.Springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化bean的逻辑。

2.ArrayList的问题。

有关ArrayList无非就是一下一些基本认知:非线程安全,初始容量为10,按照1.5倍扩容,底层采用数组elementData实现,对于随机访问get和set效率比较高,对于add和remove效率比LinkedList要低。当要扩容时采用System.arrayCopy()这个native方法实现。

但是ArrayList有两个点需要注意的。

第一个是 ArrayList 有个 trimToSize() 方法用来缩小 elementData 数组的大小,这样可以节约内存。考虑这样一种情形,当某个应用需要,一个 ArrayList 扩容到比如 size=10000,之后经过一系列 remove 操作 size=15,在后面的很长一段时间内这个 ArrayList 的 size 一直保持在 < 100 以内,那么就造成了很大的空间浪费,这时候建议显式调用一下 trimToSize() 这个方法,以优化一下内存空间。或者在一个 ArrayList 中的容量已经固定,但是由于之前每次扩容都扩充 50%,所以有一定的空间浪费,可以调用 trimToSize() 消除这些空间上的浪费。

第二个是ArrayList中有个不合理之处,就是ArrayList是implements RandomAccess这个接口的。关于RandomAccess接口JDK中有明确定义:实现了RandomAccess接口的集合框架,采用迭代器遍历比较慢,不推荐。 原文是这么说的:

It is recognized that the distinction between random and sequential access is often fuzzy. For example, some List implementations provide asymptotically linear access times if they get huge, but constant access times in practice. Such a List implementation should generally implement this interface. As a rule of thumb, a List implementation should implement this interface if, for typical instances of the class, this loop:

1
2
3
4
5
6

for (int i=0, n=list.size(); i < n; i++)
         list.get(i);
runs faster than this loop:
     for (Iterator i=list.iterator(); i.hasNext(); )
         i.next();

但是ArrayList的toString()方法是继承了AbstractCollection的,这个方法用的是迭代器的遍历方式。详细可以参《RandomAccess?!》。

而且如果采用Java中的foreach语法糖进行遍历ArrayList的话,Javac在解语法糖时是解释成迭代器的遍历方式而没有解释成普通for()循环list.get(i)的方式,详细可以参考《Java语法糖之foreach》。

3.流控怎么处理?

直接丢弃;本机内存暂存一些请求,比如用Semaphore实现;消息队列。最后面试官提示了一个令牌算法。

4.Linux的常用命令?

这个在第一篇中也陈述过了:

1
2
3
4
5
6
7
8

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

二面

二面本来是两个面试官,一个面试官(是一面的面试官)在纸上画了个数就接个电话出去了,剩下的是另一个面试官。整个过程持续1个半小时左右,过程是边面边在纸上写。这种方式有点“虐”,不过还好问的比较全面,也不是特别的深。面试官人不错,面试过程也很和谐。题目还蛮多的,博主尽量回忆一下。

1.根据纸上画的树(多叉树,并不是二叉树)写出一个树的实现,用Java。然后写出树的遍历方式,递归和非递归方式都要写。然后是写出树的前序,中序,后序遍历的结果。

1
2
3
4
5

class TreeNode{
    String treeInfo;
    TreeNode father;
    List sons;
}

递归的遍历比较简单,非递归的方式是采用栈进行操作。至于前序,中序,后序遍历只要懂点数据结构和算法的人都能知道,在此不赘述了。

2. JVM调优。

主要是讲讲自己实际遇到的情况。比如调节一下参数,类似:-Xmx, -Xms等;又比如采用JConsole或者JVisualVm进行操作;又比如用jps, jmap, jstack等命令工具。

接着再讲讲遇到OOM的时候是怎么处理的。

3.刚刚讲述了OOM也就是内存吃不住的时候怎么处理,如果某个线程CPU占用率100%怎么查看。

这个博主直说出了用资源管理工具查看,或者linux的top命令查看一个进程的CPU占用率,至于某个线程的占用率怎么查看还真不知道。
后面面试官说可以这么使用,先jstack查出线程堆的信息,在用top H -p [pid]的方式查看某个线程占用率(pid 通过jps命令获取),中间进过16进制转换下就对应起来了。回家试了下,还真是。还有一种方法也可以,在linux下:ps -H -eo pid,ppid,tid,%cpu –sort=%cpu | grep [pid]也有同样的效果。

4.写一个单例

先写了一个内部类的,后来说了一个enum的,又说一个synchronized的,面试官接着问还有呢?我说:你指的是双检锁的那种方式吧,然后又写了一个双检锁的单例。后面被问了为什么双检锁中要进行两次null的判断?博主DCL的没有用过,这个问题也没有全答对。。详细可以参考《设计模式:单例模式(Singleton)》。

5.聊了聊多线程。CAS等

多线程一般聊了聊ThreadPoolExecutor相关的,或者ConcurrentHashMap, 或者BlockingQueue系列的。CAS就写了一个CAS的实现方式,Java中的CAS的底层实现只有三个:sun.misc.Unsafe.CompareAndSwapInt, CompareAndSwapLong, CompareAndSwapObject.

6.画出volatile的内存模型。

这个题目比较吓人,如果看过的人很容易就画出来了。volatile就两点:内存可见性;原子性。

7.画出TCP三次握手,四次挥手。(略)

8.动态代理。

写一个动态代理,博主写了一个JDK的实现,写完补了一句这个还有CGLib的实现方式,然后就被要求写一个CGLib的实现方式,博主只记得用Enhancer干嘛干嘛的,剩下的不记得了。嘴贱打脸。后来又被问了JDK和CGLib的区别,开始没答出来,后来提示了一下,JDK是通过接口实现的,CGLib是通过继承实现的,如果所要代理的对象没有接口实现那只能采用CGLib进行动态代理了。详细可以参考《设计模式:代理模式(Proxy)》

后续

说实话,这家公司挺好的,也在稳步上升阶段。上班可以从10点开始,面试官人不错,感觉秒秒钟就能做好朋友的那种。只是博主这次出来转一转是有目的性的,需要找一家有点名气的互联网公司,有一个必须点是必须要有足够的流量接入。B公司的互联网产品主要面对商户,所以流量上并没有那么的大。薪资其实给的也不错,如果B公司与博主同城,博主肯定就选择了。只是要换个城市,这份offer的诱惑力就没有那么大了,最终还是没有选择。最后在这里感谢下背后运作的猎头Theresa, 虽然我也知道你不会看我博客,你真的比其他的猎人负责任多了,抱歉没能给你赚一单业绩~

更多链接请关注:
这里有一份面经请查收(一) 
这里有一份面经请查收(二)

这里有一份面经请查收(三)相关推荐

  1. 这份操作系统词典请查收!

    作者 | cxuan 责编 | 郭芮 头图 | CSDN 下载自东方 IC 1. 操作系统(Operating System,OS):是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基 ...

  2. 2021美食林全球餐厅精选榜公布,这里有一份美食地图请查收!

    澳门2021年6月25日/美通社/ -- 汇聚4亿走遍全球用户的携程集团(9961.HK)旗下美食林现携手澳门金沙度假区,发布「2021美食林全球餐厅精选榜」. 美食林榜单创建于2016年,六年来则旨 ...

  3. 叮!您有一份工作汇报请查收

    致每一位 LeanCloud 伙伴: 春节假期的结束意味着新一年的正式开始.我想总结一下 LeanCloud 过去一年的进展,以及对 2018 的计划和展望. 2017 年是 LeanCloud 成立 ...

  4. 叮咚! 你有一份节日祝福请查收~

    点击上方"Hulu" 可以订阅哦! 叮咚~ 在这个平凡又特殊的星期三 有一份来自Hulu官方的节日祝福~ 1024 1024 对于程序员来说 是个十分熟悉又有缘分的数字 在日复一日 ...

  5. 剑网三修复选择服务器,老玩家回坑剑网三去哪个区服,要注意啥?这有一份终极宝典请查收...

    常常有人问,三四年没玩剑网三了,想回坑要选哪个区,哪个门派,要注意些什么比较好? 所以今天咱们就从最基础的建号开始讲讲新人入坑.老人回坑有哪些需要注意的,帮助想要开始游戏的玩家们解答一些疑惑. 关于服 ...

  6. python这个软件学会能做什么工作-学会Python真的有高收入?盯,请查收这份入坑指南...

    学会Python真的有高收入?盯,请查收这份入坑指南 2018-10-10 20:51:00 567点赞 6312收藏 186评论 小编注:想获得更多专属福利吗?金币加成.尊享众测.专属勋章.达人福利 ...

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

    这里我连续介绍三家公司的面试,一家是只有一面,还有两家是面完一面就没去了,没去主要是当时一周面了6家而且是在不同的城市,就选择性的挑了这两家没去,是在是太累了,6月17日那天嗓子都面哑了. 第一家(2 ...

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

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

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

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

最新文章

  1. ios项目文件结构 目录的整理
  2. 「它将改变一切」,AI「诺奖级」里程碑!DeepMind 破解蛋白质分子折叠问题
  3. CTFshow 命令执行 web45
  4. 除了 MySQL 数据库,你还要了解的一些数据库
  5. 【源码】java中图片和Base64互相转换源码
  6. GBin1专题之Web热点秀#15
  7. java lambda if_使用Java8的Lambda实现Monda -解道Jdon
  8. 5-Dockerfile文件
  9. matlab中asix off_matlab中 hold on 与hold off的用法
  10. 华为研发项目管理方法(HRDPM)核心五法则
  11. matlab2018a安装激活教程
  12. matlab推挽用的变压器,推挽逆变+全桥整流~~~~逆变器变压器设计
  13. 只利用热点事件就能吸粉引流?白日做梦!
  14. 伽罗华域(Galois Field,GF,有限域)乘法运算
  15. 004_Makefile的编译
  16. 一鲸落万物生,公链还需看Hoo Smart Chain,六十余家项目报名万物生长计划
  17. LeetCode 643 题解
  18. 咬文嚼字的有趣例子_十个你可能没听过的成语,藏着十个有趣的故事
  19. python入门爬取表情包
  20. MAT之NSL:SOFM神经网络实现预测哪个样本与哪个样本处在同一层,从而科学规避我国煤矿突水灾难

热门文章

  1. Java智能合约工具包|Java调用智能合约|Java调用ERC20、ERC721、ERC1155合约
  2. A. Omkar and Bad Story
  3. Spring IOC(控制反转)的理解
  4. 离散数学 (II) 习题 8
  5. SM2 生成公钥私钥 签名 加解密 亲测可用
  6. 字符串与16进制的转换
  7. Python练习题(五)
  8. pbf文件转换为osm
  9. Revit数据导入SuperMap iDesktop方法详解
  10. 软件测试必看的5本书