总结
无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。
package com.zwx.design.pattern.interpreter;
/**
- 非终结表达式-抽象表达式
*/
public abstract class AbstractNonTerminalExpression implements IExpression{
protected IExpression leftExpression;
protected IExpression rightExpression;
public AbstractNonTerminalExpression(IExpression leftExpression, IExpression rightExpression) {
this.leftExpression = leftExpression;
this.rightExpression = rightExpression;
}
}
3、因为本次示例中只列举加法和减法,所以我们还需要一个加法类和一个减法类:
package com.zwx.design.pattern.interpreter;
/**
- 非终结表达式-具体表达式-加法表达式
*/
public class AddExpression extends AbstractNonTerminalExpression {
public AddExpression(IExpression leftExpression, IExpression rightExpression) {
super(leftExpression, rightExpression);
}
@Override
public int interpret() {
return this.leftExpression.interpret() + this.rightExpression.interpret();
}
}
package com.zwx.design.pattern.interpreter;
/**
- 非终结表达式-具体表达式-减法表达式
*/
public class SubExpression extends AbstractNonTerminalExpression {
public SubExpression(IExpression leftExpression, IExpression rightExpression) {
super(leftExpression, rightExpression);
}
@Override
public int interpret() {
return this.leftExpression.interpret() - this.rightExpression.interpret();
}
}
4、再建立一个终结表达式(如加减法运算中的数值):
package com.zwx.design.pattern.interpreter;
/**
- 终结表达式-数值表达式
*/
public class NumberExpression implements IExpression{
private int value;
public NumberExpression(String value) {
this.value = Integer.valueOf(value);
}
@Override
public int interpret() {
return this.value;
}
}
5、最后我们还需要一个上下文信息来存储我们的运算结果:
package com.zwx.design.pattern.interpreter;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class ExpressionContext {
private Integer currValue;//记录当前运算结果,空表示暂未运算
private Stack stack = new Stack<>();
public ExpressionContext(String expression) {
this.parse(expression);
}
private void parse(String expression) {
String[] elementArr = expression.split(" ");
for (int i=0;i<elementArr.length;i++){
String element = elementArr[i];
if (element.equals(“+”)){
IExpression leftExpression = stack.pop();//栈内元素出栈
IExpression rightExpression = new NumberExpression(elementArr[++i]);//取出+号后的下一个元素
IExpression addExpression = new AddExpression(leftExpression,rightExpression);
stack.push(new NumberExpression(addExpression.interpret() + “”));//将计算结果入栈
}else if (element.equals(“-”)){
IExpression leftExpression = stack.pop();//栈内元素出栈
IExpression rightExpression = new NumberExpression(elementArr[++i]);//取出-号后的下一个元素
IExpression subExpression = new SubExpression(leftExpression,rightExpression);
stack.push(new NumberExpression(subExpression.interpret() + “”));//将计算结果入栈
}else{
stack.push(new NumberExpression(element));//如果是数字则直接入栈
}
}
}
public int calcuate(){
return stack.pop().interpret();//经过前面解析,到这里stack内只会剩下唯一一个数字,即运算结果
}
}
6、最后新建一个测试类来测试一下:
package com.zwx.design.pattern.interpreter;
public class TestInterpreter {
public static void main(String[] args) {
ExpressionContext context = new ExpressionContext(“666 + 888 - 777”);
System.out.println(context.calcuate());
context = new ExpressionContext(“123 - 456 + 11”);
System.out.println(context.calcuate());
}
}
运行结果为:
777
-322
====================================================================
从上面示例中,我们可以得出解释器模式主要有4个角色:
-
抽象表达式(Expression):一般会定义一个解释方法,具体如何解析会交由子类进行实现(如示例中的IExpression)。
-
终结符表达式(Terminal Expression):实现文法中与终结符有关的解释操作(如示例中的AddExpression,SubExpression)。
-
非终符结表达式(Nonterminal Expression):实现文法中与非终结符有关的解释操作(如示例中的NumberExpression)。
-
上下文环境(Context):包含解释器之外的全局信息。一般用来存放文法中各个终结符所对应的具体值。
==================================================================================
最后
[外链图片转存中…(img-cel9wutA-1715488775152)]
[外链图片转存中…(img-9vSX59uO-1715488775152)]
[外链图片转存中…(img-qhJhoHCZ-1715488775153)]