面试美团,完全实况30+面试真题与答案公布。不得不说细节拉满想要拿到一个大厂offer还真不容易。
叮。。。。。美团来电。这次不是外卖而是电话面试。 Java 后端开发的.
如果你问我,看了这些题就完事了?非也,这只是开始,你需要学习的还有很多,知道路子是怎么走才是重要的勒。
我自己也整理了很多家公司的面试真题(都整理成文档),有很多干货,包含netty,spring,线程,spring cloud等详细讲解,也有详细的学习规划图,面试题整理等,我感觉在面试这块讲的非常清楚:获取面试资料只需:点击这里领取!!!暗号:CSDN
开始之前,我们先看提纲,大家默默的想一想,如果是你,你将怎么去回答这个问题,然后再看我的回答也许更佳哈。
1 一面(40分钟)
自我介绍
老规矩,我叫啥,啥专业,技术栈是啥,能做啥
怎么理解分布式
其实如果没有去实习,可能很少接触分布式的内容。对于面试官而言,也没多期望你们对分布式的理解到多深的地步,只是希望你们能对其有个初步的了解即可。
不管是高登摩尔提出的摩尔定律还是Gordon Moore坚持的2版本是啥,总之如果你的系统需承载的计算量的增长速度大于摩尔定律的预测,那么在未来的某一个时间点,集中式系统将无法承载你所需的计算 量。
在整个计算机系统发展的过程中,最实际的还是经济的元素。人们发现使用更加廉价的机器,组合在一起的分布式系统,除了可以获得超过CPU发展速度的性能以外,还可以有更好的性价比,所以得出如下结论:
无论是要以低价格获得普通的性能,还是要以较高的价格获 得极高的性能,分布式系统都能够满足。并且受规模效应的影响,系统越大,性价比带来 的收益越高。
随着计算机的飞速发展,科学家们发现分布式系统相比于集中式系统的另一个很明显的优势就是:具有更高的可用性。假设使用10个能够承载10000流量相同的节点,其中的两个节点挂了,只要实际的流量不超过8000,那么系统仍然正常运转。
说这么多,分布式系统还是建立在「分治」和「冗余」的基础上,这也就是分布式系统的本质
那么分治是什么?
这和我们大脑解决问题类似,大问题分解为小问题,然后治理最后归并。
为什么要这样做?
小问题容易解决,解决了众多的子问题,大问题也就更容易解决啦
如果拆分的父子问题有依赖关系怎么办?
大问题拆分的过程中,非常重要的即不同分支的子问题不能相互依赖,需要各自独立,因为如果存在依赖关系,父子问题就失去了「归并」的意义,那么在开发中,这就是「聚合度」和「内聚度」的问题。
什么是聚合度和内聚度?
所谓聚合度即软件系统中各个模块的相互依赖程度。比如在调用A方法的时候都需要同步调用方法B,显然这样的耦合度就高
所谓内聚度即模块之间具有共同点的相似程度,所以在拆分的时候要尤其注意这两点。
什么是冗余?
这里的冗余不是代码的冗余,而是容许系统在一定范围内出现故障,但对系统的影响很小
如上图将冗余的节点部署在单独的服务器,完全是为了备用而做的冗余,如果不出现故障,那么资源是不是就浪费了,所以大多数情况会使用诸如双主多活、读写分离之类的概念提高资源利用率
写个代码热热身----栈实现队列
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
/** Initialize your data structure here. */
MyQueue() {
}
/** Push element x to the back of queue. */
void push(int x) {
stIn.push(x);
}
/** Removes the element from in front of queue and returns that element. */
int pop() {
// 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据)
if (stOut.empty()) {
// 从stIn导入数据直到stIn为空
while(!stIn.empty()) {
stOut.push(stIn.top());
stIn.pop();
}
}
int result = stOut.top();
stOut.pop();
return result;
}
/** Get the front element. */
int peek() {
int res = this->pop(); // 直接使用已有的pop函数
stOut.push(res); // 因为pop函数弹出了元素res,所以再添加回去
return res;
}
/** Returns whether the queue is empty. */
bool empty() {
return stIn.empty