前两天面试遇到几道题,道道都是坑,坑坑全中,回来想了下,变记录下来。
题目一:
public class Main {
public static int v = 0;
public static int add() {
return Main.v++;
}
public static int div() {
return Main.v--;
}
public static int call() {
try {
return add();
} finally {
return div();
}
}
public static void main(String [] args){
System.out.pringln(call());//1
System.out.pringln(v);//0
}
此题坑在2个return,我只知道finally一定会执行,但是2个return我就蒙了,其实结果如下:第一个return 会调用add()方法并且返回值,第二finally中return的值并不返回。答案是1/0
题目二:
public static void main(String[] args) {
System.out.println(f());//10
System.out.println(vx);//10
}
static int vx = 0;
static int inc(){
return ++vx;
}
static int f(){
try{
return inc();
}
finally {
return vx = 10;
}
}
和上面题目很像,但是这里的vx的结果会是10
这两道题目很像,但是为什么结果不一样呢?这是因为后--导致的,如果第一道题目的sub方法改成--v那么call得到的结果就是0了。
举个例子:
int a = 0;
int fun(){
return a++;
}
调用这种函数的时候,函数先将a=0的值返回,在执行++操作。
题目三:
class Name{
public String f;
public String l;
public Name(String f, String l){
this.f = f;
this.l = l;
}
public boolean equals(Name o) {
return f.equals(o.f) && l.equals(o.l);
}
public static void main(String [] args){
Name n1 = new Name("a", "b");
List<Name> list = new ArrayList();
list.add(n1);
System.out.println(list.contains(new Name("a","b")));//false
}
}
这里我以为重写了equals,其实在集合类中equals的原形为
public boolean equals(Object obj)
而不是Name类中的样子,所以根本就没有重写,只是重载一个新的equals方法而已,并不会被List调用。