最新StackOverflow 上面最流行的 7 个 Java 问题汇总

63次阅读

共计 3372 个字符,预计需要花费 9 分钟才能阅读完成。

目前搜索程序员问题最全的应该 StackOverflow 了,基本上常碰到的问题,在上面都能找到满意的答案,那么今天就做了一个汇总,汇总下 2020 年 stackoverflow 上面最流行的 7 个问题

StackOverflow 发展到目前,已经成为了全球开发者的金矿。它能够帮助我们找到在各个领域遇到的问题的最有用的解决方案,同时我们也会从中学习到很多新的东西。

这篇文章是在我们审阅了 StackOverflow 上最流行的 Java 问题以及答案后从中挑出来的。即使你是一个有丰富经验的开发者,也能从中学到不少东西。

一、分支预测

问题链接:

https://stackoverflow.com/que…

StackOverflow 上最多投票的一个 Java 问题是:为什么处理一个排序数组要比非排序数组快的多

为了回答这个问题,你需要使用分支预测(branch prediction)。分支预测是一种架构,旨在通过在真实的路径发生前猜测某一分支的下一步来提升处理过程。

分支在这里即一个 if 语句。这样的话,如果是一个排序数组,那么分支预测将会进行,否则不会进行。

StackOverflow 上的一个回答者,链接:

http://stackoverflow.com/ques…

试图使用铁路和火车来简单介绍这个概念。假设你在铁轨连接处要决定火车要走哪条路,你会选择左边还是右边?

你可以拦住火车,然后问司机该往哪里,但是这样会让整个过程变慢。因此你只能去猜正确的方向,那么如何去猜呢?最好的办法就是通过观察目前这个火车每次经过时的路线,推测出正确的方向。

这就是分支预测:识别模式并使用它。

不幸的是,这个问题的提问者是分支预测失败的受害者。因为他的分支没有任何可以识别出的模式,所以预测出的行为是随机的。

二、Java 中的安全

问题链接:

http://stackoverflow.com/ques…

另一个流行的 Java 问题是:为什么在 Java 中有关密码的地方更加喜欢使用 char[]而不是 String?其实原始的问题更加具体一些,就是问的在 Swing 中,password 控件有一个 getPassword 方法 (返回 char[] 而不是 getText()返回的 String)。

其实这里不用惊讶 - 这是一个安全问题。String 是不可变的,意味着一旦它被创建了,那么你就不可能去修改它。

这也意味着在 GC 之前,你对这些数据不能做任何处理。因此,只要有人能够访问你的内存,那么 String 就有可能被他获取到。

这也就是为什么要使用 char 数组。你可以显示地清除数据或者覆盖它。这样密码这种敏感数据即使 GC 还没有进行也不会再在系统留下痕迹。另外,关注微信公众号:Java 技术栈,在后台回复:Java,可以获取我整理的 N 篇 Java 教程,都是干货。

三、异常

即使很多开发者倾向于忽略对受检异常的处理,StackOverflow 上仍然有很多关于异常的问题。

其中一个最流行的问题是:什么是 NullPointerException,我该怎么处理它?对此,我们并没有感到惊讶,因为这个问题也是在生产环境的 Java 应用中排名第一的异常。

实际上,当 NullPointerException(或者其他 exception)在系统出现的时候,我们可以发出一个告警。因为这种异常一般情况下都是业务代码逻辑有问题造成(笔者注)。

四、为什么这段代码使用随机字符串打印出了”hello world”

问题链接:

http://stackoverflow.com/ques…

这个问题给出了下面的代码,并打印出了”hello world”:

public static String randomString(int i){Random ran = new Random(i);
    StringBuilder sb = new StringBuilder();
    while (true){int k = ran.nextInt(27);
        if (k == 0)
            break;
        sb.append((char)('`' + k));
    }
    return sb.toString();}

其实,选择一组随机的整数并不是随机的。给定一个 seed 参数(在这个例子中是 -229985452 和 -147909649), 那么每次随机,同样的 seed 则会产生同样的输出。

Random(-229985452).nextInt(27)产生的前六个数字:8, 5, 12, 12, 15, 0

Random(-147909649).nextInt(27)产生的前六个数字:23, 15, 18, 12, 4, 0

这样,最终输出的就是”hello world”。

五、为什么两个时间戳相减 (in 1927) 得出一个奇怪的结果?

问题链接:

http://stackoverflow.com/ques…

public static void main(String[] args) throws ParseException {SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String str3 = "1927-12-31 23:54:07";
    String str4 = "1927-12-31 23:54:08";
    Date sDt3 = sf.parse(str3);
    Date sDt4 = sf.parse(str4);
    long ld3 = sDt3.getTime() /1000;
    long ld4 = sDt4.getTime() /1000;
    System.out.println(ld4-ld3);
}

按说上面的代码最后的结果应该是 1,但实际的输出却是 353。其实,这是一个时区的问题。

1927 年 12 月 31 号 24:00,上海时间往回调整了 5 分钟 52 秒,因此”1927-12-31 23:54:08”发生了两次,Java 将后面一次实例化成了本地的这个时间。因此和前一秒的差距成了 353。

我们需要指出,如果你试着来运行这段代码,结果并不一定是 353。Jon Skeet 指出了这一点,链接:

http://stackoverflow.com/a/68…

在时区数据库项目 2014 版中,这个改变的时间点改到了 1900-12-31,因此成了 344 秒的差距。

六、无法被捕获的 ChuckNorrisException

问题链接:

http://stackoverflow.com/ques…

这里有一个很明显的问题:如果有 exception 被抛出,但是没有任何办法去 catch,那么应用会崩溃吗?或者如这个问题所问:是否可以写一段 Java 代码让一个假设的 java.lang.ChuckNorrisException 无法被捕获。

答案是可以,但是这里有一个”但是”。你可以编译一段代码抛出一个 ChuckNorrisException,但是在 Runtime 时动态生成一个并不继承于 Throwable 接口的 ChuckNorrisException 类。当然,为了让这个过程可以进行,你需要关闭掉字节码验证。jtahlborn 给出了完整的解决办法。链接:

http://stackoverflow.com/a/13…

七、哈希表

哈希表是另外一个在 StackOverflow 上流行的问题系列。许多用户都想要知道所有集合类之间的区别,什么时候该使用哪种集合。

迭代顺序是主要考虑的因素。使用 HashMap 则忽略了所有的顺序信息,也就是获取元素的顺序和你插入元素的顺序是没有任何关系的;使用 TreeMap 则会得到一个排序好的迭代集合;使用 LinkedHashMap 则是一个 FIFO 的顺序。

八、总结

对于 Java,其实关键的不在于你懂多少,而是在于你可以一直学到更多的东西。

StackOverflow 不仅在 code 上的一些问题可以帮助我们,也有助于我们回过头来去深入地学习一些我们已经知道的知识。以上就是 2020 年 StackOverflow 上面最流行的 7 个 Java 问题汇总了,欢迎留言交流啊

正文完
 0