首页 > 阿里淘系新鲜Java凉经
头像
B1NNNNN
编辑于 2020-08-18 12:08
+ 关注

阿里淘系新鲜Java凉经

阿里淘系新鲜Java凉经

前话

8月4号投的淘系,8月10号笔试的。

笔试就a了30%,没想着有面试机会的。。。

简历面(视频面)8.12

8月12号晚上6点30打的电话,当时还在吃饭😂,显示是北京。

问我有时间吗,我说在吃饭,然后就约到了7点30,用的阿里会议。

7点30开始,8点45结束,一共75分钟。

整体的面试感觉还不错,老哥愿意去引导你,只要你多问几个为什么。

1.String StringBuilder StringBuffer区别,特点,场景
2.了解的集合容器说一下?
Set,Map,List都说了,HashSet,HashMap,ArrayList,LinkedList。

3.Set一定是无序的吗?
不是,TreeSet是有序的,内部是红黑树

4.说一下解决hash冲突的方法有哪些?
链地址法,开放定址都讲了

5.HashMap结构讲一下?
6.HashMap中的链表可以无限变长吗?
不可以,阈值是8,超过变红黑树。

7.创建一个对象HashMap<Integer,Integer> map=new HashMap<>
先put(10),然后get(new Long(10))结果是多少?
查不出的,get的时候会分别使用hashcode和调用equals方法,equals中会比较对象类型的。

8.Tomcat容器是如何隔离多个应用的?
这里一时半会没想到,主动问了面试官,让我从类加载器那边想。
其实就是通过使用不同的类加载器来加载来区分不同应用中的对象。

9.两个线程如何交替打印A和B?
我说了用信号量的做法,说完之后问还可以用其他方法吗?我说还可以直接加锁来控制线程的执行顺序。

10.了解哪些设计模式?
用过单例,代理,了解工厂,策略,模板。

11.用过Java中的IO吗?这个里面用到了哪些设计模式?
这个确实没了解过,之后查了是用到了装饰者模式和适配器模式(的确不知道。。。惭愧)
可参考这篇文章:https://blog.csdn.net/when_less_is_more/article/details/70194221

12.给你一个数组,100万个数,数据类型是int,给你8核CPU,8G内存,如何求数组的和?
这个题目有点坑,一开始很奇怪就100万的数据为啥还给8核?8GB?还求和?
然后直接求和了,但是中途,幸亏!我问了下!你确定是单线程求和吗?面试官有点坏!我没说过单线程呀
cao?果然,然后就想到了并发问题上去了。
一开始说直接用锁synchronzied锁代码块,然后设置两个全局变量:
takeIndex表示读取数组的索引,result表示求和结果,都是volatile修饰。
每一个线程进入到代码块中的时候就通过takeIndex读数据,然后求和,同时takeIndex++。
13.可以优化吗?
我说不一定用synchronzed,可以用cas来做更新,失败就自旋,知道成功。
14.能不用takeIndex吗?
到这里就不行了,我说想不到了。。。
(之后面完了我还问了他怎么做,他说你没有用到我给你的另外一个条件,其实可以用分治去做的,
先分任务,然后分开求和,最后相加就行)

15.看你写过RPC框架,设计一个RPC需要考虑哪些问题?
从为什么要使用RPC,然后说了通信方式,序列化机制,整个RPC过程的封装,服务注册中心都说了。

16.你了解过哪些序列化机制?
JDK自带的,protobuf,kryo,fastjson。

17.JDK自带序列化原理是什么?
直接转的二进制文件,文件的格式分三个部分,头部存序列化协议,元数据信息存类的元数据信息
还有就是对象的实列数据。

18.为什么你要用kryo?
kryo比jdk快很多,从源码中的数据压缩方面说了下。

19.Redis如何实现分布式锁?
setnx,没有数据就set一个key,代表加锁成功,有数据就返回失败;等用完了之后直接删除这个key就行。
20.直接删除有什么问题吗?
必须要加锁线程去删除(释放锁),可以直接比较value的值是否一致
先执行一个get操作,比较成功之后执行一个del。
21.这样会有什么问题吗?
整个操作不是原子性的,先get一次,然后在del之前其他线程会对Redis进行操作。
22.怎么解决?
可以使用将整个操作封装成一个lua脚本,一次连接,直接执行全部命令。

23.最后写一个题吧,我给你发一个链接,在线写。
用的阿里的伯乐系统,本来有点慌,一直对算法有阴影,一听是要在线写更加担心了。
但是看了题目就放心了,就手写一个单例模式中的懒汉式,保证线程安全,也要保证效率。
很简单,直接写了一个DCL模式的,他看了之后就结束了。

24.大概一天之内就会给结果,你还有什么想问的吗?
当然是问了之前没答出来的那几个问题。
然后还问了评价,说基础不错。

一面 8.17

唉,本来简历面老哥说一天给消息的,我这边足足等了5 6天。。。

但是还好,8.17号晚上7点30来电话了。但是这边我又在吃饭。。。约了半个小时之后面。

但是老哥鸽了我一个多小时,21点才打电话给我,说时间比较紧迫,面其他人去了。

总体面了30分钟左右,自我感觉不太好。

这位老哥应该是做C++开发的,问我最擅长的语言是什么,我说Java。

但是全程没有问我简历上的任何东西,随意问的那种。感觉被刷KPI了。。。

基本上都会问到操作系统底层去了,唉,太菜了呀。这块是真的不会。。。

等着收感谢信吧。

1.自我介绍
2.Java和C++的区别?
Java中由JVM自动管理内存的创建和销毁,C++要自己手动管理
Java和C++都是OOP,但是Java只支持单继承,C++支持多继承。

3.单继承和多继承的优点和缺点是什么?
只说了单继承,多继承说自己没用过C++,不会。

4.Java中是如何创建一个对象的?
5.Java中一个对象是如何执行另外一个对象中的方法的?从操作系统底层说起
我只说了先去栈中拿调用对象的引用地址,然后根据引用地址去堆内存中找到目标对象存储的地址空间,
找到具体的代码行,讲指令依次入栈进行操作。
6.如果是带参数的调用呢?
有点懵,我说了参数可以也可以放在一个变量表中,需要用的时候去拿就行。

7.学过操作系统吗,你给我讲一讲操作系统打开一个Word文档的整个过程?
直接懵了,wocao这块我是真忘记了。。。直接说的不会。。。

8.项目难点?
9.Redis实现MQ具体怎么做的?
用的Redis中的一个list结构,双向链表可以进行FIFO操作 。
写一个生产者调用list中的lpush方法,将消息入队列。
这边开启一个异步线程作为消费者不断的轮询list中是否有消息的到来。
不但轮询的过程中使用的不是直接用的rpop方法,而是用的brpop方法,如果某一个时刻没有数据的到来那么线程阻塞。不会不断的轮询了。
10.brpop如何实现阻塞的?
woc,真就直接问brpop源码呀?那我哪看过,
直接说应该是设置一个超时时间,如果在规定时间内没有数据的产生,那么就会发送一个阻塞信号给客户端,
这边客户端收到时候线程就会挂起直接有数据的到来,服务端会通知客户端去拿数据。

11.最后出了一个题目,场景题:
给你很多个不重复的数,假设用的数组来装,我希望你实现一个方法,每次调用这个方法给我随机返回100个不重复,记住是随机的。
我一开始没有读懂题目(这位老哥有点广东口音)就直接说了可以设置一个全局的takeIndex作为读的索引,从0开始。
每次调用方法时候,就从takeIndex到数组的长度之间进行遍历,从前往后读数据存数组,读满100个返回就行。
之后问了老哥说不行,然后又说了一遍题意,确实这种做法没有做到随机。
因为假设调用多次之后,takeIndex就会绕过数组,重新置为0。
从头开始的话那么返回的数据就和之前的某组数据是一样的。没有达到的随机的目的。
之后又想了一会儿,说可以直接用Random类,每次都返回一个0到数组长度之间的int值作为索引,将读到的值在存数组。
但是这样不太好,效率很低,读100次,就要调用100次Random函数。
然后让我优化,我说可以依旧采用第一种方法,设置takeIndex,但是每次读完100个数据之后就进行一次洗牌。
将数据中的数据进行随机打乱。那么每次读的100个数据就不一样。
12.怎么实现随机打乱?时间复杂度是多少?
我说可以一次遍历目标数组,然后从头开始获取一个从当前索引到数组长度的随机数,
然后将这个随机数上的值和当前下标的值进行交换。
时间复杂度:O(n)
13.还有其他方法吗?
我想了1分钟,憋出一个:没有了。。。

14.你还有什么要问我的吗?
一开始没听清楚这个问题,我迟疑了一下以为是问了其他的啥问题。。。
我说我对最后那个问题很感兴趣能不能告诉我还能怎么做?
他说没时间了,就不讨论了。。。
我接着问:你觉得我哪方面还需要进行补强?
他说这边不方便评价,因为面试时间太短了,无法给出一个确定的答案?一脸懵逼?
我还问了一个问题:你对我们应届生在学习方面有哪些建议吗?
他说:就多关注下社区就行。我说:哦。尴尬。。。
凉凉!

部分答案可能不正确,自行判断。
或者感兴趣的我们可以讨论下。

更多模拟面试

全部评论

(11) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐