本文由码农网 – 李俊英原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划

对开发人员来说, StackOverflow就像一个金矿。对具体的问题,它能帮我们找到最有用的答案,并且我们也可以从上面学习新的知识。

下面的内容,通过这些最常见的JAVA问题与答案,并着重的标记出我们找到的精华问题。即便你是一个经验丰富的开发人员,这些也是值得去学习的。

JAVA问题纵览

JAVA是StackOverflow上 第二流行的标签 ,有超过100万个问题与JAVA有关。仅在上个礼拜,就有4600个问题被提出,毫无疑问这里是开发者们最大也是最为活跃的线上社区。

此信息同样也出自StackOverflow 2016年的开发者调查中 ,56033名开发者被问到关于开发语言的选择,JAVA是第三位。因为在市场上JAVA占据着主导,因此我们估计读者也曾经有那么一两次的去访问StackOverflow来寻找答案。但是,即使你随意的在StackOverflow上闲逛,也会发现很多有趣的问题,下面让我们来看看这些精心选出的问题。

分支预测

在StackOverflow上最经常被问到的一个问题就是” 为什么处理一个排序过的数组比一个未排序的数组要快 ?”回答这样的问题,你得了解分支预测。

分支预测是一种期望可以提升应用流程的架构,旨在一条路径在真正被执行前就可以被提前的猜出。当然它不仅仅是一个完全意义上的猜测,而是一个有目的性的猜测。

分支在这里就是一个“IF 语句”。在此情况下,如果数组是排序过的,分支预测将起作用,不然则无法工作。 Mysticial 试着用一种简单的方式来解释这个问题,以铁路和火车为例子。想像一下,你驾驶火车来到一个交汇点,接下来你需要决定火车走哪条线。你会选择左还是右?当然,你也可以停下火车问问司机哪一条路是正确的,但是这却会降低整个火车运行的速度,并让火车的行进过程变的更加复杂。你也可以猜一下,但是你如何确保你猜的一定是对的呢?了解下这趟火车之前的司机都是怎么做的,并且知道在此之前他们都是如何选择道路的,这是一个非常好的主意。

这就是分支预测:找到模式并且使用他们。

不幸的是,多数情况下能问出这样问题的多半是一个失效的分支预测的受害者。由于分支没有可识别的模式,想要去猜测就真的只能是一个随机的猜测了。

JAVA的安全性

另一个流行的JAVA问题是“为什么在JAVA的密码管理中,更倾向去使用char[]而不是String?”更具体一些的问法是:为什么在JAVA Swing中的密码输入框方法是:getPassword(return char[]), 而不是getText(return String)

毫无意外的,这里是一个安全问题。因为String 是不可变的,这意味着你一旦创建了它则无法修改。同样也意味着在GC前你无法彻底的删除掉它。在某些情况下,如果有人黑进了你的内存,那么被保存成String的密码则可以被人获取的。

这就是为什么 你需要使用字符数组。你可以在使用完后显式的清除它,或者你也可以用其他的别的东西去覆盖它。这样敏感的信息就不会在系统的其他地方出现,即使此时GC还没有启动。

异常

即使有很多开发人员会忽略异常检查,但是依然有很多问题是关于JAVA异常的。在你的代码中这是一个值得引起你注意的问题,忽略它并不能使它消失。

最常见的一个问题是“什么是 NullPointerException,并如何消除它“, 看到这样的问题有如此多的人问,我们毫不惊奇。在JAVA的生产环境中,空指针异常也确实是排名第一的异常类型。

Takipi 介绍了一种检查空指针异常或者其他异常的一种新的方法。

一些有趣的问题

StackOverflow上总有些有趣的问题可以教授你一些新的知识。我们选了如下内容

为何如下代码可以使用Random String来打印出”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();
}

如果是一组选择好的随机数,那么事实上他们并不是真正随机的。随机数的算法是根据种子参数来进行计算的,(当前则是 -229985452 或者 -147909649)。每一次当申请一个随机数的时候,它会根据相同的随机数种子来生成一个相同的值 – 打印出”hello world”。

Random(-229985452).nextInt(27)

前六个随机数是:8,5,12,12,15,0.

Random(-147909649).nextInt(27)

前六个随机数是:23,15,18,12,4,0

当你将这些数字转换成字符的时候

104 –> h
101 –> e
108 –> l
108 –> l
111 –> o

119 –> w
111 –> o
114 –> r
108 –> l
100 –> d

你将获得hello world

为何两个相差一秒的时间相减会有奇怪的结果

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);
}

Java version:

java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Dynamic Code Evolution Client VM (build 0.2-b02-internal, 19.0-b04-internal, mixed mode)

Timezone(TimeZone.getDefault()):

sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
offset=28800000,dstSavings=0,
useDaylight=false,
transitions=19,
lastRule=null]

Locale(Locale.getDefault()): zh_CN

输出结果是353 (译者注:在JDK 1.8上未能重现这个问题, 原题注的JAVA版本是1.6)

很显然只有一秒的差距,但是得到的结果确实353,一个最基本的解释是:时区的问题。在1927年12月31日,上海的时区往后移动了5分钟52秒。

值得一提的是,如果你尝试着去运行这段代码,可能会有不同的结果。根绝Time Zone Database Project 2014 项目。这一时区的改变被挪到了1900-12-31,,因此可能有个343秒的一个变化。

不可捕获的ChuckNorrisException

有一些问题是关于:有没有一种异常是可以被抛出的,但是没人可以捕获它, 应用会崩溃么?或者这样的问题也可以变成“有没有代码可以让java.lang.ChuckNorrisException变成无法捕获的异常?“。

简单的回答是:这是可能的,但是那是有一些前提的。你可以编译一段代码抛出ChuckNorrisException,然后再定义一个ChuckNorrisException类,但是这个类却不在运行时继承自Throwable。但是仅仅如此还是不够的,你必须禁用二进制码检查。“StackOverflow”上有一个答案可以提供这样的一个完整例子 (点击访问)

如果你喜欢类似的问题,你可以查看 Java Deathmatch 游戏

Hash Maps

在StackOverflow上还有一种常见的问题是与hash maps有关的。很多开发人员都想知道集合类中的不同类的区别,以及在何时用哪一个。

核心的问题是迭代的顺序。在HashMap中是没有任何与顺序有关的信息的,并且元素的顺序在你插入集合的时候就已经被改变了。在TreeMap中,你可以得到一个已被排序的集合,在LinkedHashMap中,你可以得到一个先进先出(FIFO)的集合。

如果你还有疑惑,我们的朋友Rebel Labs制作了 一个图 来解释这些集合间的关系。

结束语

无论你对JAVA有多了解,总有些的知识是需要你学习的。StackOverflow不仅仅是问问题的地方,也是可以彻底的学习新知识的地方。

译文链接:http://www.codeceo.com/article/7-java-question-in-stackoverflow.html
英文原文:StackOverflow: Seven of the Best Java Answers That You Haven’t Seen
翻译作者:码农网 – 李俊英
转载必须在正文中标注并保留原文链接、译文链接和译者等信息。]

StackOverflow:7个你从未见过的Java问题最佳答案的更多相关文章

  1. 那些年,我们见过的 Java 服务端“问题”

    导读 明代著名的心学集大成者王阳明先生在<传习录>中有云: 道无精粗,人之所见有精粗.如这一间房,人初进来,只见一个大规模如此.处久,便柱壁之类,一一看得明白.再久,如柱上有些文藻,细细都 ...

  2. 面试那点小事,你从未见过的spring boot面试集锦(附详细答案)

    一, 什么是spring boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问页面https://spring.io/projects,我们将看到所有在应用程序中使用的不同功能的 ...

  3. 你从未见过的Case Study写作指南

    Case Study,意为案例分析,Case Study与其它的留学论文作业最大的的差别就在于Case Study在论文开始就需要明确给出论,然后再阐述这个结论的论证依据和理由.留学生们需要知道的是C ...

  4. Stackoverflow上人气最旺的10个Java问题(转ImportNew)

    本文转自:http://www.importnew.com/16841.html 写的确实太好了 1.为什么两个(1927年)时间相减得到一个奇怪的结果? 如果执行下面的程序,程序解析两个间隔1秒的日 ...

  5. Stackoverflow上人气最旺的10个Java问题

    1. 为什么两个(1927年)时间相减得到一个奇怪的结果? (3623个赞) 如果执行下面的程序,程序解析两个间隔1秒的日期字符串并比较: 01 public static void main(Str ...

  6. StackOverflow 周报 - 高质量问题的问答(Java、Python)

    这是 Stack Overflow 第三周周报,本周加入了 Python 的内容,原计划两篇 Java.两篇 Python.但明天过节所以今天就先把周报发了,两篇 Java.一篇 Python.公众号 ...

  7. 那些年,我们见过的 Java 服务端乱象

    导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.” 移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利逐渐消失,很多 ...

  8. 那些年,我们见过的Java服务端乱象

    导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.”移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利逐渐消失,很多创 ...

  9. StackOverflow: 你没见过的七个最好的Java答案

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

随机推荐

  1. POJ3697+BFS+hash存边

    /* 疾速优化+hash存边 题意:给定一个包含N(1 ≤ N ≤ 10,000)个顶点的无向完全图,图中的顶点从1到N依次标号.从这个图中去掉M(0 ≤ M ≤ 1,000,000)条边,求最后与顶 ...

  2. $.cookie 使用不了的问题定位过程

    最近在项目中需要使用到jquery的cookie,按理说在html头中引入jquery-1.7.1.min.js和jquery.cookie.js,然后在js中就可以使用cookie函数了.像这样使用 ...

  3. Git教程之分支管理之一

    分支在实际中有什么用呢? 你创建了一个属于你自己的分支,别人看不到,别人还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又 ...

  4. P102、面试题14:调整数组顺序使奇数位于偶数前面

    题目:输入一个整数数组,实现一个函数来调整该数组中数字的属性怒,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 思路:其实就是用快速排序法的第一轮排序,从左右夹逼,左边遇到偶数,停下来, ...

  5. 睡眠--TASK_INTERRUPTIBLE and TASK_UNINTERRUPTIBLE

    http://i.cnblogs.com/EditPosts.aspx?opt=1   Two states are associated with sleeping, TASK_INTERRUPTI ...

  6. laravel Authentication and Security

    Creating the user modelFirst of all, we need to define the model that is going to be used to represe ...

  7. Oracle中Blob和Clob类型的区别与操作

    Oracle中Blob和Clob类型 1.Oracle中Blob和Clob类型的区别 BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的 ...

  8. poj2828

    很容易想到一种动态的做法:平衡树…… 或者是二分+树状数组 但,前者编程复杂度较大,而且据说会被卡(没试过):后者理论上超时(据说可以擦边过?): 所以要尝试新的算法: 倒着考虑,显然最后一个对象的位 ...

  9. javascript 一些需要知道的东西

    这里我直接贴出代码,注释已经补全,欢迎指正: <script type="text/javascript"> /** 1,js中一切皆是对象,函数也是, 2,当定义变量 ...

  10. I.MX6 build.prop

    /************************************************************************ * I.MX6 build.prop * 说明: * ...