【问题标题】:Writing an interview test for java expert [closed]为Java专家编写面试测试[关闭]
【发布时间】:2013-02-02 11:03:21
【问题描述】:

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

备注:改的越少越好。


我的问题是:

  • 您会如何回答这些问题?
  • 如何改进?

【问题讨论】:

  • 我觉得你对“专家”的门槛很低
  • 不确定...你的答案是什么?
  • @Esilija 这是-8。这意味着找不到该值,并且(如果它在那里)它将位于第 7 位。未找到该值,因为它正在将 Integer 与 ==(而不是等于)进行比较。找到 32 是因为 Java 有一个“有趣”的特性,它可以缓存所有表示 -128 和 127 之间值的 Integer(因此所有持有 32 的 Integer 对象都是同一个对象)。
  • @Flexo,我想你不知道 SJuan76 写了什么:)
  • @emka86 - 我不认为自己是 Java 专家(和 yes, I am familiar with autoboxing),但我也不认为记住 API 参考资料是专家的标志。跨度>

标签: java


【解决方案1】:

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


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

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

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

你会对清单 1 进行什么更改

i == j ? 0 : -1 更改为i &gt; j ? -1 : 0

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

如何改进

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

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

【讨论】:

  • 你没有回答问题B。为什么是5,为什么它是正确的?根据您对问题 A 的回答,有一个错误。
  • 问题B中还有一个bug。;)
  • ...但由于整数缓存大小,它恰好可以工作。
  • @ben75 Java 程序员应该学习的第一件事是比较对象(指针)不同于比较值。指向相同“值”的两个指针是否“相同”取决于它们实际上是否是不同名称的相同指针。因此,您找到搜索“32”的索引 5(正确答案)是 Integer.parseInt() 为“32”返回相同 Integer 对象(指针)两次的“幸运机会”。
  • @user268396 :对不起,你错了。阅读彼得的答案
【解决方案2】:

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

【讨论】:

  • 是的,这样的开箱即用的思维比原始的解谜能力更令人印象深刻
  • C题不是“解谜能力”,而是“读题能力”。您只有一个 JRE,因此您唯一的选择是修改清单 3。感谢您的链接。
  • 哎呀,你抓住了我。你仍然只是选择解谜者而不是问题解决者。 :)
【解决方案3】:

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

问题 A

  • 展示java语言基础知识(==equals的区别)
  • 能够理解别人编写的丑陋(和未注释)代码

问题 B

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

问题 C

  • 表现出仔细理解和吸收约束的能力。在这种情况下,没有可用的 JDK,因此修改 listing1listing2 不是一种选择。

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

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

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 2015-09-29
    • 1970-01-01
    • 2016-08-15
    • 2011-11-14
    • 1970-01-01
    • 2011-08-06
    • 2014-11-16
    • 2020-06-07
    相关资源
    最近更新 更多