阿里面经一面、伯乐已过、止于二面

一面:

问:熟悉Java基础是吧,那就先不多问Java了。

计网学过是吧,聊一聊吧

1、输入www.taobao.com会发生什么?

当时只说出了七步,追问DNS解析过程,当时答不出来。

图片说明

2、HTTP常见状态码

图片说明

3、重定向和转发

图片说明

4、三次握手与四次挥手

图片说明

5、发生错误时异常

图片说明

聊聊MySQL吧

1、MySQL为什么使用B+树?

(思路:从二叉树-->AVL树-->红黑树-->B树-->B+树,分别说出前者缺点,从而引出后者优点)

简要回答:二叉查找树在极端情况会产生链表,AVL树自平衡旋转过于耗时消耗性能,红黑树较为优秀,因此被HashMap采纳,但是由于单个结点,因此引出B树(B树是MongoDB的底层存储),B树特点...,因此出现了B+树,B+树特点...。最后对比B树和B+树特点。

图片说明

2、为什么推荐主键使用自增的整型?

(思路:分为三个方面:为什么要主键?为什么要自增?为什么要整型?)

图片说明

3、最左前缀原则?(原题是abc三个列,建立了索引(a,b),(a,b,c),当select时where条件是a=XXX时会走哪个索引?)

呃,只知道where a = XXX会走索引,where b = XXX and a = XXX不会建索引,这个问题当时没答出来,因为分不清

4、锁相关,(共享锁和排他锁)

图片说明

意向锁呢?--->聊到行锁和表锁--->聊到InnoDB引擎和MyISAM的区别

图片说明

图片说明

5、MVCC?

思路:事务隔离级别(MySQL默认为RR,SqlServer、Oracle为RC)--->MySQL中没有幻读,如何解决的?--->MVCC

图片说明

图片说明

Redis学过,说说吧

我就很自觉地大概从头到尾把知道的说了一遍

1、Redis为什么是单线程的?为什么效率还那么快?

单线程不需要上下文切换,Redis将所有数据都放在内存中,所以使用单线程效率就是最高的,多线程上下文切换是耗时操作,对于内存而言,没有上下文切换效率就是最高的。

2、数据类型

图片说明

3、持久化:RDB和AOF

RDB:默认的持久化方式,生成的文件名默认为dump.rdb,

​ 主要两种保存指令,手动保存save和自动保存bgsave,默认自动保存

AOF:以独立日志方式写入(只保存对数据进行修改的数据,即get等命令不保存),开启需要在配置文件中更改生效,生成的文件名默认为appendonly.aof,

​ 写数据的三种策略:always、everysec、no,默认使用everysec。由于AOF记录的是日志会导致其文件大小较大,因此有AOF重写机制,重写规则:已超时的数据不写入、忽略无效指令、对同一数据的多条写合并为一条;重写方式也有手动重写bgsave指令和自动重写(修改配置文件生效)

4、事务:开启事务multi、执行事务exec、取消事务discard

5、锁:watch必须在unwatch之后才能使用;

​ 分布式锁:利用setnx设置一个公共锁,有值返回设置失败,无值返回设置成功,操作完毕通过del释放锁;

​ 死锁的解决:使用expire为锁设置过期时间限制

6、删除策略:过期数据并不是真正删除了,而是由删除策略决定

​ 三种删除策略:定时删除、惰性删除、定期删除,redis采用的有第2和3种

​ 逐出算法:

图片说明

7、主从复制的大体过程

8、哨兵模式及哨兵的作用

9、缓存预热、缓存雪崩、缓存击穿、缓存穿透的相关概念及解决方式

Java方面聊一下吧

1、介绍一下HashMap?

思路:默认容量,负载因子,扩容阈值,红黑树与链表转换阈值,JDK1.7与1.8的区别,为什么引入红黑树

2、HashMap的是先put还是先resize?

详细介绍resize方法,扩容达到上限时,将扩容阈值直接设置为Integer.MAX_VALUE以此来避免扩容。
详细介绍put方法,底层调用putVal方法,先进行插入(判断是否哈希冲突,是否红黑树结点,否就进行链表插入),又因为resize方法放在较尾部,所以综上所述先put再resize。

JVM也了解是吧

(因为说《深入了解JVM》看了好几遍,感觉面试官以为我飘了吧。。)

1、简单说一下堆?

逻辑上:年轻代(Eden、S0、S1)、老年代(对象阈值为15进入老年代)、方法区(落地实现在永久代)

物理上:年轻代与老年代,方法区JDK1.7在永久代,1.8被元空间替换

为什么要分代、分区?IBM的研究表明绝大多数对象都是朝生夕死的

2、String s = new String("a");创建了几个对象?分别在哪?

两个,new在堆,a在字符串常量池

追问:字符串常量池在哪?

JDK1.6时字符串常量池在方法区中;JDK1.7开始着手去永久代,将字符串常量池移到了堆中;JDK1.8替换为元空间,字符串常量池还是留在堆中,没有移回去。

伯乐系统:
图片说明
图片说明
后面省略了。。。

二面:

1、两个Integer类型如何比较,使用“==”还是equals()

==是比较基本数据类型是比较值,比较引用类型是比较地址;equals比较引用类型是比较值

int与int比较,直接使用==比较

Integer与int比较,==比较时,Integer将会发生自动拆箱(调用intValue()方法)

两个Integer比较时,当它们都在[-128,127]之间,使用"=="比较和equals比较返回的都是true;在此区间范围之外"=="比较为false,equals比较为true。原因是因为Integer中有一个内部类IntegerCache,当处于此区间的值都是相同的地址和值,因此此区间的==与equals都为true

2、一个网站的架构模型是怎样的?

(我裂开来,这说不出来啊,只能瞎编)

Nginx集群请求转发,MySQL集群存储,Redis集群做缓存,SpringCloud中的Eureka注册中心负责调度,Gateway网关以及Hystrix实现服务限流服务熔断,但是Nacos可以完全替代Eureka+Config+Bus,Sentinel代替Hystrix,以及配上Seata来实现完整的服务。

现在来看,真的是在瞎扯。嗨,败在了这个问题上。
看完Dubbo2.7版本的官网架构图大家懂的都懂了。

图片说明

图片说明

然后就没有然后了,哎,第一次,败在了还未曾入门的微服务架构演变上。
不过也是第一次而已,未来继续加油努力。

#面经##阿里巴巴##Java工程师#
全部评论
这...也能挂
4 回复
分享
发布于 2021-04-16 17:35
楼主已经很强了。。。
3 回复
分享
发布于 2021-04-16 14:58
百信银行
校招火热招聘中
官网直投
暑期实习就问这些也太深入了吧
3 回复
分享
发布于 2021-04-16 17:18
学弟很强了就是背书太明显了没有什么实战,秋招再战
3 回复
分享
发布于 2021-04-16 18:57
是实习面经?
2 回复
分享
发布于 2021-04-16 14:58
可以捞,来试试么?
2 回复
分享
发布于 2021-04-16 18:46
实习就问这么多,我回答上来的都没多少
2 回复
分享
发布于 2021-04-16 19:17
要试试字节嘛
2 回复
分享
发布于 2021-04-16 19:25
new String(“a”) 不一定是在堆中哦 对象未逃逸 占用内存不大是会在栈上分配的
2 回复
分享
发布于 2021-04-16 22:13
(原题是abc三个列,建立了索引(a,b),(a,b,c),当select时where条件是a=XXX时会走哪个索引?) 大佬现在知道这题走哪个索引了吗  萌新还是晕的 估计走(a,b)但是不太清楚怎么解释
2 回复
分享
发布于 2021-04-16 16:57
很棒了
1 回复
分享
发布于 2021-04-16 17:09
半年学这些很厉害了,我觉得你可以
1 回复
分享
发布于 2021-04-16 17:19
最长子串是不是写的有点问题。比如单个“a”,你就是0了
1 回复
分享
发布于 2021-04-16 19:12
哎 我是前端,二面之后做了伯乐,面试官夸我代码能力,三面体验就很差了
1 回复
分享
发布于 2021-04-16 19:27
想问问楼主的项目做的啥,两面居然都没被问项目唉
1 回复
分享
发布于 2021-04-16 19:54
去年我面阿里云中间件也是因为不会被dubbo被刷了
1 回复
分享
发布于 2021-04-16 19:57
我面阿里的时候八股文相关的基本没有被问到,都在问项目了,我觉得好好准备项目还是蛮重要的😂
1 回复
分享
发布于 2021-04-16 20:13
其实挺强了,工作三年这些都忘了🤔😢
1 回复
分享
发布于 2021-04-17 11:24
emmm,以上也只是我个人所了解的知识,但是由于只是学习了半年而已,很多东西可能还不是很了解。原本只是想把简单的面试经历分享出来,希望对有需要的同学有所帮助,幸得大家关注和讨论,使我也受益匪浅,十分感谢大家,一起加油。
1 回复
分享
发布于 2021-04-17 18:52
关于分布式锁的问题说setnx有点背的感觉,实际线上开发如果用setnx会发生很多问题而且不管怎么解决都会有地方处理不好,当下有很多包装好的框架比如redission可以直接拿来用,其次的话就是自己实现一个分布式锁,有点像用AQS框架来实现lock的感觉,其次因为redis事务没有原子性比较坑,直接拿watch来用也会出问题,所以一般用lua脚本语言来保证原子性。当然实现分布式还有很多选择,这么回答比较加分,希望后面的朋友看到都能学习到。
7 回复
分享
发布于 2021-04-16 23:14

相关推荐

150 1004 评论
分享
牛客网
牛客企业服务