欢迎来到it培训的黄埔军校——智游教育!

stackoverflow:7个你从未见过的java问题最佳答案-永利国际

于2017-04-11 09:08:25 发表在java知识库
对开发人员来说, stackoverflow就像一个金矿。对具体的问题,它能帮我们找到最有用的答案,并且我们也可以从上面学习新的知识。
下面的内容,通过这些最常见的java问题与答案,并着重的标记出我们找到的精华问题。即便你是一个经验丰富的开发人员,这些也是值得去学习的。

java问题纵览

java是stackoverflow上  ,有超过100万个问题与java有关。仅在上个礼拜,就有4600个问题被提出,毫无疑问这里是开发者们最大也是最为活跃的线上社区。
此信息同样也出自stackoverflow  ,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的生产环境中,空指针异常也确实是排名第一的异常类型。
 介绍了一种检查空指针异常或者其他异常的一种新的方法。

一些有趣的问题

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

为何如下代码可以使用random string来打印出””?

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秒的一个变化。

有一些问题是关于:有没有一种异常是可以被抛出的,但是没人可以捕获它, 应用会崩溃么?或者这样的问题也可以变成“有没有代码可以让java.lang.chucknorrisexception变成无法捕获的异常?“。
简单的回答是:这是可能的,但是那是有一些前提的。你可以编译一段代码抛出chucknorrisexception,然后再定义一个chucknorrisexception类,但是这个类却不在运行时继承自throwable。但是仅仅如此还是不够的,你必须禁用二进制码检查。“stackoverflow”上有一个答案可以提供这样的一个完整例子 (点击访问)
如果你喜欢类似的问题,你可以查看  游戏

hash maps

在stackoverflow上还有一种常见的问题是与hash maps有关的。很多开发人员都想知道集合类中的不同类的区别,以及在何时用哪一个。
核心的问题是迭代的顺序。在hashmap中是没有任何与顺序有关的信息的,并且元素的顺序在你插入集合的时候就已经被改变了。在treemap中,你可以得到一个已被排序的集合,在linkedhashmap中,你可以得到一个先进先出(fifo)的集合。
如果你还有疑惑,我们的朋友rebel labs制作了  来解释这些集合间的关系。

结束语

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