为java专家编写面试测试

Writing an interview test for java expert

我目前正在编写一个Java专家配置文件的面试问题。这里是:

考虑到本规范:

清单1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.example;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Searching {
    public static void main(String[] args) {
        int input = Integer.valueOf(args[0]);
        String[] strings = {"1","2","4","8","16","32","64","128"};
        List<Integer> integers = new ArrayList<Integer>();
        for (String s : strings) {
            integers.add(Integer.valueOf(s));
        }
        System.out.println("index of"+input+" is:"+Collections.binarySearch(integers, input, cmp));
    }

    static Comparator<Integer> cmp = new Comparator<Integer>() {
        public int compare(Integer i, Integer j) {
            return i < j ? -1 : (i == j ? 0 : 1);
        }
    };
}

然后用此命令行编译此代码

清单2

1
javac com/example/Searching.java

用这个命令行运行

清单3

1
java com/example/Searching 128

问题A:

执行清单3产生:

1
index of 128 is:-8

你能解释一下这个输出吗?

问题B:

考虑到这一点

1
 java com/example/Searching 32

输出是

1
index of 32 is:5

你能解释一下这个输出吗?

问题C:

假设您有一个JRE1.6、一个shell和一个文本编辑器。您将如何更改为清单1和/或清单2和/或清单3以生成此输出:

1
index of 128 is:7

备注:变化越少越好。

我的问题是:

  • 你对这些问题的答案是什么?
  • 如何改进?


回答C:

1
2
3
4
5
6
7
public class Searching {
    public static void main(String[] args) {
        int input = Integer.parseInt(args[0]);
        int[] values = {1, 2, 4, 8, 16, 32, 64, 128};
        System.out.println("index of" + input +" is:" + Arrays.binarySearch(values, input));
    }
}

因为专家不会把这段代码留下那么糟糕的样子。

如何改进面试问题?

面试时不要做拼图。

或者看看这个页面。


作为一个面试问题,我会把问题简单化。我发现,在采访中,没有提示就很难解决这类问题。在回答了一些他们无法回答的问题后,被采访者可以放弃,但这并不总是有效的。

Can you explain this output ?

使用i == j的代码中有一个错误,它对A&B的影响不同。在一种情况下,排序假定值小于128,在第二种情况下,它与32匹配,因为它是缓存的。

如果您尝试使用-xx:+aggressiveOpts`或其他选项来增加整数缓存大小,则在每种情况下都会匹配。

What would you change to listing 1

i == j ? 0 : -1改为i > j ? -1 : 0

当然,使用integer.compare()会有一些问题;)

how to improve it

根据程序的目的,我将使用

1
2
3
4
int count = 0;
for(int n = Integer.parseInt(args[0]); n != 0; n >>>= 1)
  count++;
System.out.println(count);


为了解释我对这个问题的期望:

问题A:

  • 演示Java语言的基本知识(EDCOX1×3)与EDCOX1(4)的区别
  • 能够理解他人编写的难看(未注释)代码

问题B:

  • 展示更多关于JVM和整数缓存的"深入"知识(在我看来,不是最重要的)
  • 表现出自信:即使这种奇怪的行为似乎表明答案A不正确。

问题C:

  • 展示仔细理解和吸收约束的能力。在这种情况下,没有可用的JDK,因此修改listing1或listing2不是一个选项。

此外,它还提供了回答问题B的线索。

(也就是说,在命令行中添加一个系统属性,我希望作为这个问题的答案:java.lang.Integer.IntegerCache.high)。