As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center获取指导。




7年前关闭。





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


备注:更改越少越好。



我的问题是:


您对这些问题的回答是什么?
如何改善呢?

最佳答案

作为面试问题,我将使问题更简单。我发现在面试中,如果没有提示就很难解决这类问题。在回答了几个他们无法回答的问题后,受访者可以放弃那些并非总是有效的方法。




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


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

如果您尝试使用-XX:+ AggressiveOpts之类的方法,或尝试使用其他选项来增加Integer缓存的大小,则在每种情况下它都会匹配。


您将如何更改清单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);

10-01 07:56