最后
即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!
我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:
Dubbo面试专题
JVM面试专题
Java并发面试专题
Kafka面试专题
MongDB面试专题
MyBatis面试专题
MySQL面试专题
Netty面试专题
RabbitMQ面试专题
Redis面试专题
Spring Cloud面试专题
SpringBoot面试专题
zookeeper面试专题
常见面试算法题汇总专题
计算机网络基础专题
设计模式专题
/**
- State entered when a valid quit message is handled.
*/
private class QuittingState extends State {
@Override
public boolean processMessage(Message msg) {
// 所有消息都不作处理
return NOT_HANDLED;
}
}
HaltingState
/**
- State entered when transitionToHaltingState is called.
*/
private class HaltingState extends State {
@Override
public boolean processMessage(Message msg) {
// 和quitting的不同在于,可以处理消息,所有的消息都调用haltedProcessMessage
mSm.haltedProcessMessage(msg);
return true;
}
}
StateMachine#start
public void start() {
// mSmHandler有可能为空,如果调用了quit,会被置空。如果调用了quit,statemachine的很多资源会被释放,调用start无法再次开启
if (mSmHandler == null) return;
// 初始化一些参数
mSmHandler.completeConstruction();
}
private final void completeConstruction() {
// 获取整个状态表的深度
int maxDepth = 0;
for (StateInfo si : mStateInfo.values()) {
int depth = 0;
for (StateInfo i = si; i != null; depth++) {
i = i.parentStateInfo;
}
if (maxDepth < depth) {
maxDepth = depth;
}
}
// 根据深度来初始化StateStack和TempStateStack
mStateStack = new StateInfo[maxDepth];
mTempStateStack = new StateInfo[maxDepth];
setupInitialStateStack();
// 发送SM_INIT_CMD message,异步调用enter方法
sendMessageAtFrontOfQueue(obtainMessage(SM_INIT_CMD, mSmHandlerObj));
}
SmHandler#setupInitialStateStack
// 收到SM_INIT_CMD消息后,转移到初始状态
private final void setupInitialStateStack() {
StateInfo curStateInfo = mStateInfo.get(mInitialState);
// 将初始状态及其所有父状态加入tempStack
for (mTempStateStackCount = 0; curStateInfo != null; mTempStateStackCount++) {
mTempStateStack[mTempStateStackCount] = curStateInfo;
curStateInfo = curStateInfo.parentStateInfo;
}
// 清空StateStack
mStateStackTopIndex = -1;
// 将tempStateStack移动到StateStack
moveTempStateStackToStateStack();
}
SmHandler#addState
private final StateInfo addState(State state, State parent) {
StateInfo parentStateInfo = null;
if (parent != null) {
parentStateInfo = mStateInfo.get(parent);
if (parentStateInfo == null) {
// 如果parent未添加,手动添加
parentStateInfo = addState(parent, null);
}
}
StateInfo stateInfo = mStateInfo.get(state);
if (stateInfo == null) {
// 创建StateInfo,添加到map中
stateInfo = new StateInfo();
mStateInfo.put(state, stateInfo);
}
// 重复指定不一样的parent,抛异常
if ((stateInfo.parentStateInfo != null) &&
(stateInfo.parentStateInfo != parentStateInfo)) {
throw new RuntimeException(“state already added”);
}
// stateInfo保存了当前状态、父状态、是否active
stateInfo.state = state;
stateInfo.parentStateInfo = parentStateInfo;
// 调用enter后,active为true,exit后,active为false
stateInfo.active = false;
return stateInfo;
}
SmHandler#handleMessage
@Override
public final void handleMessage(Message msg) {
mMsg = msg;
if (mIsConstructionCompleted) {
// 已经初始化完之后的常规路径
processMsg(msg);
} else if (!mIsConstructionCompleted &&
(mMsg.what == SM_INIT_CMD) && (mMsg.obj == mSmHandlerObj)) {
// 未初始化完的路径,调用enter
mIsConstructionCompleted = true;
invokeEnterMethods(0);
} else {
throw new RuntimeException("StateMachine.handleMessage: " +
"The start method not called, received msg: " + msg);
}
// 执行transitions
performTransitions();
}
SmHandler#processMsg
private final void processMsg(Message msg) {
StateInfo curStateInfo = mStateStack[mStateStackTopIndex];
if (isQuit(msg)) {
// 如果是退出msg,转移到退出状态
transitionTo(mQuittingState);
} else {
// 循环遍历父状态,看是否能处理
while (!curStateInfo.state.processMessage(msg)) {
curStateInfo = curStateInfo.parentStateInfo;
if (curStateInfo == null) {
// 如果没有状态可以处理,调用此处
mSm.unhandledMessage(msg);
break;
}
}
}
}
SmHandler#transitionTo
private final void transitionTo(IState destState) {
// 只改变mDestState,具体的执行在performTransitions中
mDestState = (State) destState;
}
SmHandler#performTransitions
private void performTransitions() {
State destState = null;
while (mDestState != null) {
destState = mDestState;
mDestState = null;
// 找到目标状态非active的父状态,将链路中父状态放入tempStack中。返回目标状态与当前状态的公共祖先
StateInfo commonStateInfo = setupTempStateStackWithStatesToEnter(destState);
// 将stateStack中,公共祖先之前的状态出栈并调用exit
invokeExitMethods(commonStateInfo);
// 将tempStack中的状态入栈到StateStack
int stateStackEnteringIndex = moveTempStateStackToStateStack();
// 调用新入栈的state的enter回调
invokeEnterMethods(stateStackEnteringIndex);
// 将defer message移动到消息队列最前面
// defer message的意思是,将消息保存在列表中,状态转移后将消息放置到队列最前面,优先被处理
moveDeferredMessageAtFrontOfQueue();
}
// 处理quiting和Haling状态
if (destState != null) {
if (destState == mQuittingState) {
mSm.onQuitting();
cleanupAfterQuitting();
} else if (destState == mHaltingState) {
haltedProcessMessage(msg);
mSm.onHalting();
}
}
}
StateMachine#quit
protected final void quit() {
// mSmHandler can be null if the state machine is already stopped.
if (mSmHandler == null) return;
mSmHandler.quit();
}
private final void quit() {
// 会继续处理队列中的message
sendMessage(obtainMessage(SM_QUIT_CMD, mSmHandlerObj));
}
总结:心得体会
既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。
学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。
面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。
最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。
大厂Java架构核心笔记(适合中高级程序员阅读):
效学习。
大厂Java架构核心笔记(适合中高级程序员阅读):
[外链图片转存中…(img-aKzMKM92-1715227244542)]