2

我目前正在为java 专家简介写一个面试问题。这里是:


考虑到这段代码:

清单 1

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);
        }
    };
}

然后使用此 cmd 行编译此代码

清单 2

javac com/example/Searching.java

并使用此命令行运行

清单 3

java com/example/Searching 128

问题一:

执行清单 3 产生:

index of 128 is:-8

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

问题 B:

考虑到这一点

 java com/example/Searching 32

输出是

index of 32 is:5

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

问题 C:

假设您有一个 JRE 1.6、一个 shell 和一个文本编辑器。您将更改为清单 1 和/或清单 2 和/或清单 3 以产生此输出:

index of 128 is:7

备注:你改变的越少越好。


我的问题是:

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

3 回答 3

4

对 C 的回答:

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));
    }
}

因为专家不会让该代码变得如此糟糕。

如何改进面试问题?

不要在面试中做谜题。

或者看看这个页面

于 2013-02-02T11:42:55.077 回答
4

作为一个面试问题,我会让问题变得更简单。我发现在面试中,如果没有提示,解决这类问题会困难得多。在几个他们无法回答的问题之后,受访者可以放弃,这并不总是富有成效的。


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

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

如果您尝试类似 -XX:+AggressiveOpts` 或其他选项来增加整数缓存大小,它将在每种情况下匹配。

你会改变清单 1

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

当然使用 Integer.compare() 会出现一些问题;)

如何改进它

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

int count = 0;
for(int n = Integer.parseInt(args[0]); n != 0; n >>>= 1)
  count++;
System.out.println(count);
于 2013-02-02T11:11:10.240 回答
0

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

问题一

  • ==演示java语言的基本知识(和之间的区别equals
  • 理解别人编写的丑陋(和未注释)代码的能力

问题 B

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

问题 C

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

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

(即在命令行中添加一个系统属性是我期望的这个问题的答案:)java.lang.Integer.IntegerCache.high

于 2013-02-02T14:11:43.457 回答