--Java面经--阿里电话一面面经小结(人生第一次面试!!!)

15 篇文章 0 订阅
7 篇文章 0 订阅
本文记录了一位应聘者首次接受阿里巴巴电话面试的全程,涉及软件工程专业、实习经历、项目介绍、技能掌握、数据库、JVM、排序算法等方面的问题。面试者在面试中表现出扎实的技术基础,同时也意识到自身在某些知识点上的不足,如单例模式的实现、MySQL优化等。
摘要由CSDN通过智能技术生成

最近这几天一直在投简历,不是不符合要求,就是需要毕业的或者有工作经验的,然后又快过年了,实习比较难找,想在广州找个实习锻炼一下,内推的话朋友大部分都在深圳,所以选择了海投的方式。(能内推尽量内推)
找实习的软件我用的有:BOSS,实习僧,牛客,拉钩,个人感觉BOSS的反馈比较多,然后牛客的话其实也还行,不过最近看了下大部分都是字节的,虽然也投递了,但目前还是已查看,可能没过吧。
就挺突然的,昨天下午收到北京打来的电话,以为是什么保险啊,买房,信用卡的电话,然后接到后,对话那头说是阿里巴巴的:

问我有没有找到实习,我说还没。
然后问我有时间面试吗,我说都有时间。
然后他问今晚7.可以吗,我说可以,地点在哪?
他说电话面试,我说好的,谢谢,到时是您联系我吧?
他说是的,到时7点我联系您,我说好的拜拜。

电话讲完后,突然紧张起来,有种猝不及防的感觉。
然后直奔主题,到了晚上7点左右,面试官打来了电话。
(我忘记录音了,所以只能描述出大致印象,当时太紧张忘记了,淦TT)

1、面试官先问了下我哪个是我的主专业?
因为我是双学位嘛,我说是软件工程,是今年毕业,辅修的是明年毕业。

2、有找过实习吗?
没有,今天是第一次面试,所以我有点紧张和激动,因为很多公司都是招毕业生或者有过实习经验的,然后快过年了,所以很少有公司需要我。

3、(尴尬的来了)你学校和XX大学(重本)有关系吗,是985还是211吗?
当时就尴尬了,(内心OS:我们学校冠名了XX大学,要说联系其实也不大,就是个普通的本科),然后我和面试官说,emmm关系不是很大,不是重本。害,当时我就觉得面试官的心理落差一下就大了…

4、聊一下你的项目,看你会的还挺多。
然后我就讲了下项目的主要模块,功能,流程。

5、项目都是自己做的吗?
我说我是跟着网上学的,全都是自己敲过的,主要负责后端代码,前端也有弄,也知道一些,像VUE,JQuery,ElementUI这些我都会简单用用,主要负责后端代码编写,然后后台部分的话主要是用码云上开源的项目renrenfast来自己DIY来改造。

6、都是在哪学的?
我说B站,慕课网,一些公开课这些,还有就是像CSDN博客类的这些网站,有时进坑了就会进里边看看。

7、有对项目进行过什么改进吗?
讲了下Eureka的优化(快速下线,减少心跳间隔,加快服务剔除,关闭缓存等),有点紧张,可能表述的不是很好,加上那里环境偶尔会有bus经过,面试官有时会听不到我的一些内容。

8、你觉得项目哪里比较难?
我说比如像秒杀系统,需要考虑到挺多内容,分布式锁,分布式事务,要防止超卖或少卖,还要提高响应时间等。像我之前遇到过少卖的情况,就是比如有100个人一起去秒杀10件商品,就是原先的做法是使用redis的信号量,设置了10个信号量,每有一个人抢到锁,信号量就+1,没抢到的就直接剔除,但这样就会出现少卖的情况,比如还剩2个人,2件商品,照道理应该这2个人都可以抢到,然后因为2个人同时去竞争一把锁后只有一个人能抢锁成功,另一个人就被踢掉了,导致最后一件商品卖不出去,出现少卖的情况,而解决这现象的做法就是我不剔除抢不到锁的人,而是让他们一直在那等待抢锁。然后还有个可以增加并发的做法就是将竞争的资源分段锁起来,比如要秒100件商品,我们就可以把其拆成10个10件商品对其分段加锁,有点像concurrentHashmap那样,这样就使得并发数提高了10倍。

9、讲一下你用redis怎么实现分布式锁的?
有两种方法,emmm不是,三种方法吧。第一种就是在设置锁时,顺便设置上它的时间戳,时间戳是用来保证当前是否可以上锁,并且还要通过getSet方法二次判断设置上当前时间,避免解了别人的锁,这两点是需要注意的,需要保证它的原子性。第二种就是使用lua脚本,lua脚本原本就具有原子性,可以很方便的进行操作。第三种就是比较简单的使用redisson框架,里边的方法已经帮我们封装好了相关锁的操作,并且可以自动帮我们续期TTL,在过了30%TTL时自动帮我们续期。

10、讲一下分布式事务 。
分布式事务我有了解到6种,有2PC,3PC,LCN,TCC,Seata,RocketMQ事务消息。

11、说一下RocketMQ的事务消息。
首先是发送方向MQ发送半消息询问是否ok,然后MQ回复ok或no,ok的话就执行本地事务,本地事务执行成功就发送commit给MQ,接着消费端即可消费MQ中的消息,若本地事务执行失败或超时,MQ会触发其回查方法,查询当前事务执行状态,若查到的状态为UNKNOW或ROLLBACK则进行消息重发,进而提高消息的可靠性。

12、说一下你对AOP的理解。
AOP的话就是面向切面编程,可以减低系统的复杂度,方便解耦,降低代码冗余,常见的代理有静态代理和动态代理,静态代理的代表就是aspectj,动态代理的代表有JDK自带的Proxy类,还有就是CGlib。AOP的使用就在类上添加@Aspect注解,定义好pointcut,advice,使用@Before,@Around,@After,@AfterReturnning,@AfterThrowing,这样可以使得会在被代理的方法执行前,执行后以及返回前或发生异常时执行切面的相关操作。

13、说一下你所知道的spring注解。
(我当时懵了,从没想过会问到找个,突然大脑一片空白)就讲了,首先是spring启动的@springbootapplication,@Aspect,@Before,@Around,@After,@Transcation,还有些框架的像@EnableDiscoveryClient,然后面试官就问其它问题了TT。靠,@Autowried,@Component,@Service…都没说,紧张到忘记了,或者说太常用了没想出来…

14、在使用注解的时候有遇到过什么坑吗?
emmm,像如果没有加像@Component这注解让Spring来管理该类的话,就会无法注入该类而使用该类,像@Service,@Controller这些,主要靠Spring的IOC来实现控制反转,将其控制权限交给Spring来管理,不让高层依赖底层就是IOC的核心。

15、你刚刚讲了IOC,说一下什么是IOC,优点有什么?
IOC就是控制反转,不让高层被低层所控制,就是像比如你造车不应该依赖轮胎,不应该再依赖底盘,车门,怎么说呢,就是高层模块不应该受到低层模块的约束,而IOC将对象的创建交给Spring来管理,从而实现系统解耦,降低了代码冗余,减少了内存的消耗。

16、噢?为什么减少了内存的消耗?
emmm,就是不用每次都new对象了,就是在每次创建对象时不用再new了,注入直接使用就行了。

17、为什么new会消耗内存?
emmm,因为每次new都会在堆中生成对象,从而消耗内存。(这时脑海里一闪而过单例模式)

18、单例模式有了解过吗?
我说有有有,我刚刚想到,我之前也有写过博客,有五种创建单例的方式,单例就是不管创建几次之后生成一次对象。

19、spring用的是哪种单例模式?
我说了饿汉式和懒加载。

20、说一下懒加载。
懒加载就是类中的构造函数是私有的,对外提供一个可以公共访问的方法,就比如是getInstance(),然后方法中先判断instance是否为null,为null的话再调用内部的构造函数完成对象的创建,但找个getInstance方法需要注意一下得使用synchronized锁住,不然在多线程下还是会生成多个实例。

21、噢?多线程下懒加载除了加synchronized还有什么方法?
(害,这里没答好,没有想到doubleCheck和innerClass也是懒加载的一种),我想了一会说可以使用JUC下的ReentrantLock可重入锁来实现。

22、还有吗?除了加锁还有什么方法吗?
啊啊啊啊啊!想不出了TT,后面查资料才发现可以用静态内部类,也是懒加载的一种,害。当时我说想不到了。害,明明那五种我都会的,还写了博客,可惜了。

23、说一下jvm类的加载。
我有看过深入理解java虚拟机,记得是有5步,记得不是很清楚了,但还是能讲一点,就是加载,验证,准备,解析,初始化,使用吧好像,就是验证就是检查是否有危害虚拟机的字段或语句什么的,然后准备就是将变量读取过来,然后解析就是将变量赋初始值,如果变量没被final修饰的话初始值一般是null或0,然后被final修饰的话就用它赋予的值,初始化就是真正给变量赋值。(感觉回答的也不够好…因为记得不是很清楚了)

24、问你一下mysql相关的吧。如果我要分页查询,有几万的数据,如何保证每查一页的时间不会太慢?
首先我脱口而出加索引,他说好,还有吗?emmm部分返回,就是只返回部分,不用一次全部查完。他说还有吗?害,当时好难想,就开始放飞自我了,说,有个您可能不太满意的答案,就是使用缓存,就是每次查了一次都放入缓存,下次查就会快些了,或者把些比较热点的数据,比如首页的数据先放入缓存中,这样可以减少一些性能的消耗。然后他问还有吗?TT好难想,然后就说,其实数据库也有些可以处理很大并发量的,也有很厉害的数据库,不过就是要花钱。然后他问还有吗?TT,然后说,可以使用MyIsam引擎,MyIsam引擎查询删除比较快。

25、为什么要换MyIsam引擎?
我说它是非聚集索引,数据和索引分开,查询和删除比Innodb引擎快,innodb引擎新增修改比较快。

26、面试官又问还有吗?
然后我绞尽脑汁也想不出来了,没了。

27、好,你比较熟悉的排序算法有哪些?
选择排序,插入排序,冒泡排序,快速排序,归并排序,还有希尔排序,不过不是很了解,前面五种比较了解。

28、好,说一下前面五种你觉得哪种比较好。
对我来说我认为归并排序是最好的,就是它时间复杂度为O(logn),并且是稳定的排序;而快速排序虽然时间复杂度也是O(logn),但它是不稳定的;其次就是插入排序和冒泡排序,它们的时间复杂度都为O(n²),但它们是稳定的;而选择排序时间复杂度也为O(n²),但它是不稳定的。

29、说一下什么是稳定性。
就是两个相同的数,在排完序后它们的顺序不会改变,就比如5535在进行选择排序后,第一个五就会跑到第二个五的后面,就是这两个五的顺序变了,就不稳定了。

30、你简历还写了你会solr和elasticsearch?
噢是,不过solr现在很少用,因为比较复杂用起来,又要改它的xml配置文件,又要添加分词器,然后它语句编写的也很麻烦,要用xml的方式来写,虽然可以导入数据库,格式支持多一点,但还是太麻烦了。而ES虽然只支持json的方式,但它的可视化界面就是Kibana,用起来就比较舒服。

31、好,你最近有遇到或学习到什么好玩或有趣的吗?
emmm,我最近在玩Kali,就是用arp攻击舍友的电脑,让他上不了网,然后通过端口转发后他又能上网了,然后再通过driftnet嗅探可以将他上网浏览过的图片抓下来,有点类似抓包这样。

32、你最近就玩这个吗?
emmm,之后如果java学的差不多了就可能转去学学go或者学学Hadoop或Spark大数据相关的框架吧。

33、好,今天就差不多这样了,你有什么想问我的吗?
emmm,您觉得我今天怎么样,如果今天过了的话需要准备什么?(我内心已经觉得我应该是过不了了,从开头学历那块我就觉得我不在他的目标之中了,害)。

34、面试官说:这个说不准,需要进行水平对比,看看和其它面试生对比一下,然后面试的话可能只后还有三轮或四轮,笔试有一轮。还有什么问题吗?
emmm就是你前面问的mysql分页那个我实在想不到了。

35、没事,问题都是给你们发散的,多去想就行了,也没有固定标准的答案,还有什么问题要问吗?
暂时没了,谢谢。

结束了。对线了40分钟,前面十分紧张,后面缓过来了,害,感觉从开头问我和XX大学有没有关系,我就觉得我应该没机会了,不过没有关系, 这通电话也给我加了很大的自信心,说明我的简历还是可以的,接下来就要再接再厉,多多投递,期待春招,加油冲冲冲!

总结

电话面试的时候最好找些信号好,安静点的地方,由于我当时要回学校,偶尔会有bus经过,然后就是简历上的内容都要好好准备,不要太紧张,紧张的话就多去面试积累经验,虽然这是我第一次面试,但我觉得我还是勉强hold住了,相信自己,你也可以❤!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值