Java 采访主题:这个代码会出什么问题?
在web应用程序中作为SpringBean连接的简单计算器类:Java 采访主题:这个代码会出什么问题?,java,spring,Java,Spring,在web应用程序中作为SpringBean连接的简单计算器类: public class Calculator { int result; public int addTwoNumbers(int first, int second) { result = first + second; return result; } } 这可能会出什么问题 多线程问题。默认情况下,SpringBean是单例的。整数溢出是另一个问题,如
public class Calculator {
int result;
public int addTwoNumbers(int first, int second) {
result = first + second;
return result;
}
}
这可能会出什么问题 多线程问题。默认情况下,SpringBean是单例的。整数溢出是另一个问题,如果这样算的话 要解决此问题,您可以返回
long
:
long result;
public long addTwoNumbers(int first, int second)
{
result = (long)first + second;
return result;
}
注意只说result=first+second
,因为将添加两个int
,从而产生int
(可能会溢出),然后才会转换为long
result=(长)第一+第二
相当于结果=((长)第一)+第二
(不是result=(long)(first+second);
),这意味着我们首先将int
中的一个转换为long
,因此它将是long+int
,这将给出long,假设这是一个Spring单例bean,那么这个类是线程安全的。如果两个线程调用addTwoNumber,那么第一个线程有可能得到第二个线程的计算结果,因此我们可能得到2+2=5。若结果字段不应在其他任何地方使用,则应将其删除
public class Calculator {
public int addTwoNumbers(int first, int second) {
return first + second;
}
}
公共类计算器{public int addTwoNumbers(int first,int second){int result=first+second;返回结果;}}它将在我的回答范围内修复该类。将结果作为字段有好处,这就是计算器的工作方式。正确的修复方法是同步access.public类计算器{public long addtworumbers(int-first,int-second){long result=first+second;return result;}}这将有相同的问题-将两个int相加,得到一个int(可能溢出),然后才转换为long。太好了!我喜欢这个+这个问题很牵强。如果我想要一个长计算器呢?在采访中,这个问题是关于线程安全的。@Noofiz这并不牵强(如果有的话,可能的算术溢出问题没有得到足够的重视)。我同意这可能不是面试官想要的,但简单地提一下(以及线程问题)只会帮助你获得这份工作的机会。