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

2024-09-02 11:18
文章标签 一份 查收 面筋

本文主要是介绍这里有一份面筋请查收(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


欢迎跳转到本文的原文链接:https://honeypps.com/talk/interview-3/

经过前面两次的面试,这里就马上转到第三家公司了的面试了,这里简称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过程比较复杂,如果按照传统的方式,则需要在<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: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的常用命令?
这个在第一篇中也陈述过了:

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。然后写出树的遍历方式,递归和非递归方式都要写。然后是写出树的前序,中序,后序遍历的结果。

class TreeNode{String treeInfo;TreeNode father;List<TreeNode> 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的内存模型。
这个题目比较吓人,如果看过的人很容易就画出来了。
7.画出TCP三次握手,四次挥手。(略)
8.动态代理。
写一个动态代理,博主写了一个JDK的实现,写完补了一句这个还有CGLib的实现方式,然后就被要求写一个CGLib的实现方式,博主只记得用Enhancer干嘛干嘛的,剩下的不记得了。嘴贱打脸。后来又被问了JDK和CGLib的区别,开始没答出来,后来提示了一下,JDK是通过接口实现的,CGLib是通过继承实现的,如果所要代理的对象没有接口实现那只能采用CGLib进行动态代理了。详细可以参考《设计模式:代理模式(Proxy)》

###后续
说实话,这家公司挺好的,也在稳步上升阶段。上班可以从10点开始,面试官人不错,感觉秒秒钟就能做好朋友的那种。只是博主这次出来转一转是有目的性的,需要找一家有点名气的互联网公司,有一个必须点是必须要有足够的流量接入。B公司的互联网产品主要面对商户,所以流量上并没有那么的大。薪资其实给的也不错,如果B公司与博主同城,博主肯定就选择了。只是要换个城市,这份offer的诱惑力就没有那么大了,最终还是没有选择。


更多链接请关注:
这里有一份面筋请查收(一)
这里有一份面筋请查收(二)
这里有一份面筋请查收(三)
这里有一份面筋请查收(四)
这里有一份面筋请查收(五)
这里有一份面筋请查收(六)
这里有一份面筋请查收(七)
这里有一份面筋请查收(八)

参考资料:

  1. Spring知识点提炼
  2. RandomAccess?!
  3. Java语法糖之foreach
  4. 设计模式:单例模式(Singleton)
  5. 设计模式:代理模式(Proxy)

欢迎跳转到本文的原文链接:https://honeypps.com/talk/interview-3/

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


这篇关于这里有一份面筋请查收(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129802

相关文章

10篇校招/社招面经请你查收~

点击上方蓝色字体,选择“设为星标” 回复”面试“获取更多惊喜 目前各大公司的校招已经启动,相信很多小伙伴有和我当年一样的困扰。国内高校开辟大数据相关专业正好一个毕业季过去了,那么作为一个科班出身的学生,该怎么准备校招呢? 本文是在和读者交流的过程中,在网络上搜集到的一些面试资源,只要自己掌握方法并且准备充分,其实很容易在面试中脱颖而出。 其实当时的我也非常发愁,觉得自己什么都不会,又不知道该准

网工必知的《网络端口号大全》,看这一份足够了

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 咱作为网工,了解和掌握常用的网络端口知识可以说是必不可少的技能。 熟悉各类网络服务和应用程序所使用的端口,可以帮助我们在工作里更高效地配置网络设备、优化网络性能、诊断网络故障等。 在遇到无法访问某个网络服务的问题时,检查相关端口的状态往往是排查问题的第一步。 今天就来说说端口这

如何制作一份可以快速拿下国外客户的报价表(附报价单模板)

做外贸报价技巧是每个外贸业务员必须学会的一个东西,外贸报价也是有很多技巧何需要注意的地方,今天就来给大家分享一下,如何制作一个让国外客户快速下单的报价表。这个是外贸小白变销冠的第六篇--报价篇,建议收藏,文末有报价单模板。 往期回顾:如何从外贸小白如何变成外贸销冠 往期回顾:外贸干货:如何写出一封高回复率的开发信 往期回顾:如何高效回复国外客户,让客户快速下单 往期回顾:做外贸如何判断国外

迎接开学第一天!请查收这份2024开学必备好物清单!

新的学期正悄然来临,开学第一天校园里即将迎来一张张充满朝气的面孔。无论是重返课堂的老生还是满怀期待的新生,开学季总是充满了新的希望与挑战。为了帮助学生们更好地适应即将到来的学习生活,我们精心准备了这份2024开学必备好物清单。从提高学习效率的智能设备到保护视力的健康科技产品,再到提升日常便利性的实用小物,请查收这份2024开学必备好物清单!接下来,让我们一起探索那些能够让学习变得更加轻松愉快的好物

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

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。 欢迎跳转到本文的原文链接:https://honeypps.com/talk/interview-5/ 这里讲述的是一家公司,简称I,当天上午面完公司B之后,打车到火车站坐高铁赶来面试,午饭也没吃,这次面试的比较久,从下午15:30到19:30,主

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

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。 欢迎跳转到本文的原文链接:https://honeypps.com/talk/interview-4/ 这里我连续介绍三家公司的面试,一家是只有一面,还有两家是面完一面就没去了,没去主要是当时一周面了6家而且是在不同的城市,就选择性的挑了这两家没去

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

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。 欢迎跳转到本文的原文链接:https://honeypps.com/talk/interview-1/ 博主毕业快满三年了,由于种种原因想换一份工作。学了7年计算机技术,在目前的行业用到的技术不多,还是想去寻找一份互联网行业的工作,这样更能学以致用

开放一份自己实现的Android版智能拨号器

1、 显示联系人列表(点击列表,快速拨号)   2、 不同的搜索方式(汉字模糊匹配,按姓氏分组,中文拼音缩写查询如张三,ws,全拼查询 zhangsan)   3、 语音拨号(支持命令:拨打电话,打给xxx,打电话给xxx,发送短信)   4、 短信发送,可以根据不同节日发送预定义短息,可以自定义短信   5、 发送短信时,可以对接收短信的联系人添加、删除   6、 短信发送记录   7、左

一份土豆丝的自白

ABOUT ME   Hei,what’up ,我叫土豆丝,有着各种各样的做法,是大家餐桌上的家常菜,出镜率很高哦,操作简单,如果实在不知道吃什么了,那就来一盘土豆丝吧! Preparation 土豆:削皮、洗净后将我切成丝,小心千万别切到手,这里有一点要注意:一定要用清水多给我洗几次澡,洗掉身上的淀粉,这样吃到嘴里就是脆脆的,而不是黏黏的。 大蒜:请将我的兄弟大蒜切成

2024 MongoDB中国用户大会倒计时2天!请查收专属参会指南

距离2024 MongoDB中国用户大会即将开幕仅剩2天,我们非常期待与您共同探讨和分享最新的数据库技术与应用经验。为了确保您能够顺利参与本次会议,请查阅属于您的专属温馨提示! 活动时间 8月31日09:00-17:30 签到开始:08:00 现场参会者请携带您的注册确认邮件或短信二维码,以便快速签到。 现场备有英文同声传译设备,如需租赁,请携带身份证。 在活动正式开始前,我们也为与会的