为java专家编写面试测试

时间:2013-02-02 11:03:21

标签: java

我正在为 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

问题A:

执行清单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

评论:你改变的越多越好。


我的问题是:

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

3 个答案:

答案 0 :(得分:4)

作为面试问题,我会让问题更简单。我发现在采访中,如果没有一些提示,解决这些问题会更加困难。经过几个问题,他们无法回答,受访者可能会放弃,这并不总是有效。


  

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

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

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

  

您将更改为列表1

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

当然使用Integer.compare()会产生一些问题;)

  

如何改进

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

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

答案 1 :(得分: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));
    }
}

因为专家不会将该代码保留为可怕的。

如何改善面试问题?

Don't do puzzles in an interview.

或者查看this page

答案 2 :(得分:0)

只是用这个问题来解释我的期望:

问题A

  • 演示了java语言的基本知识(==equals之间的差异)
  • 能够理解其他人编写的丑陋(和未注释)代码

问题B

  • 展示更多&#34;深度&#34;了解JVM和整数缓存(在我看来,不是最重要的)
  • 表现出自信:即使这种奇怪的行为似乎表明答案问题A不正确。

问题C

  • 展示了仔细理解和消​​化约束的能力。在这种情况下,没有可用的JDK,因此无法修改 listing1 listing2

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

(即在命令行中添加一个System属性是我期待作为这个问题的答案:java.lang.Integer.IntegerCache.high)。