我正在为 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
评论:你改变的越多越好。
我的问题是:
答案 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 :
==
和equals
之间的差异)问题B :
问题C :
此外,它提供了回答问题B的线索。
(即在命令行中添加一个System属性是我期待作为这个问题的答案:java.lang.Integer.IntegerCache.high
)。