加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

StackOverflow: 你没见过的七个出格好的Java谜底

发布时间:2019-07-20 03:22:48 所属栏目:建站 来源:飒然Hang
导读:StackOverflow成长到今朝,已经成为了环球开拓者的金矿。它可以或许辅佐我们找到在各个规模碰着的题目的最有效的办理方案,同时我们也会从中进修到许多新的对象。这篇文章是在我们审视了StackOverflow上最风行的Java题目以及谜底后从中挑出来的。纵然你是一个

StackOverflow成长到今朝,已经成为了环球开拓者的金矿。它可以或许辅佐我们找到在各个规模碰着的题目的最有效的办理方案,同时我们也会从中进修到许多新的对象。这篇文章是在我们审视了StackOverflow上最风行的Java题目以及谜底后从中挑出来的。纵然你是一个有富厚履历的开拓者,也能从中学到不少对象。

一、分支猜测

题目链接:

https://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array

StackOverflow上最多投票的一个Java题目是:为什么处理赏罚一个排序数组要比非排序数组快的多。为了答复这个题目,你必要行使分支猜测(branch prediction)。分支猜测是一种架构,旨在通过在真实的路径产生前揣摩某一分支的下一步来晋升处理赏罚进程。

分支在这里即一个if语句。这样的话,假如是一个排序数组,那么分支猜测将会举办,不然不会举办。

StackOverflow上的一个答复者,链接:http://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array/11227902#11227902

试图行使铁路和火车来简朴先容这个观念。假设你在铁轨毗连处要抉择火车要走哪条路,你会选择左边照旧右边?你可以拦住火车,然后问司机该往哪里,可是这样会让整个进程变慢。因此你只能去猜正确的偏向,那么怎样去猜呢?最好的步伐就是通过调查今朝这个火车每次颠末期的蹊径,展望出正确的偏向。

这就是分支猜测:辨认模式并行使它。

不幸的是,这个题目的提问者是分支猜测失败的受害者。由于他的分支没有任何可以辨认出的模式,以是猜测出的举动是随机的。

二、Java中的安详

题目链接:

http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords-in-java

另一个风行的Java题目是:为什么在Java中有关暗码的处所越发喜好行使char[]而不是String?着实原始的题目越发详细一些,就是问的在Swing中,password控件有一个getPassword要领(返回char[]而不是getText()返回的String)。

其拭魅这里不消惊奇-这是一个安详题目。String是不行变的,意味着一旦它被建设了,那么你就不行能去修改它。这也意味着在GC之前,你对这些数据不能做任那里理赏罚。因此,只要有人可以或许会见你的内存,那么String就有也许被他获取到。

这也就是为什么要行使char数组。你可以表现地破除数据可能包围它。这样暗码这种敏感数据纵然GC还没有举办也不会再在辖档汪下陈迹。

三、非常

题目链接:

http://blog.takipi.com/the-top-10-exceptions-types-in-production-java-applications-based-on-1b-events/

纵然许多开拓者倾向于忽略对受检非常的处理赏罚,StackOverflow上如故有许多关于非常的题目。个中一个最风行的题目是:什么是NullPointerException,我该怎么处理赏罚它?对此,我们并没有感想惊奇,由于这个题目也是在出产情形的Java应用中排名第一的非常。

现实上,当NullPointerException(可能其他exception)在体系呈现的时辰,我们可以发出一个告警。由于这种非常一样平常环境下都是营业代码逻辑有题目造成(笔者注)。

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

题目链接:

http://stackoverflow.com/questions/15182496/why-does-this-code-using-random-strings-print-hello-world

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

  1. System.out.println(randomString(-229985452) + " " + randomString(-147909649)); 
  2.  
  3. public static String randomString(int i){ 
  4.     Random ran = new Random(i); 
  5.     StringBuilder sb = new StringBuilder(); 
  6.     while (true) 
  7.     { 
  8.         int k = ran.nextInt(27); 
  9.         if (k == 0) 
  10.             break; 
  11.  
  12.         sb.append((char)('`' + k)); 
  13.     } 
  14.  
  15.     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/questions/6841333/why-is-subtracting-these-two-times-in-1927-giving-a-strange-result

  1. public static void main(String[] args) throws ParseException { 
  2.     SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   
  3.     String str3 = "1927-12-31 23:54:07";   
  4.     String str4 = "1927-12-31 23:54:08";   
  5.     Date sDt3 = sf.parse(str3);   
  6.     Date sDt4 = sf.parse(str4);   
  7.     long ld3 = sDt3.getTime() /1000;   
  8.     long ld4 = sDt4.getTime() /1000; 
  9.     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/6841479/5982245

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

六、无法被捕捉的ChuckNorrisException

题目链接:

http://stackoverflow.com/questions/13883166/uncatchable-chucknorrisexception

这里有一个很明明的题目:假若有exception被抛出,可是没有任何步伐去catch,那么应用会瓦解吗?可能如这个题目所问:是否可以写一段Java代码让一个假设的java.lang.ChuckNorrisException无法被捕捉。

谜底是可以,可是这里有一个”可是”。你可以编译一段代码抛出一个ChuckNorrisException,可是在Runtime时动态天生一个并不担任于Throwable接口的ChuckNorrisException类。虽然,为了让这个进程可以举办,你必要封锁掉字节码验证。jtahlborn给出了完备的办理步伐。链接:

http://stackoverflow.com/a/13883510/5982245

七、哈希表

哈希表是其它一个在StackOverflow优势行的题目系列。很多用户都想要知道全部荟萃类之间的区别,什么时辰该行使哪种荟萃。

迭代次序是首要思量的身分。行使HashMap则忽略了全部的次序信息,也就是获取元素的次序和你插入元素的次序是没有任何关系的;行使TreeMap则会获得一个排序好的迭代荟萃;行使LinkedHashMap则是一个FIFO的次序。

假如你照旧对这些感想狐疑,这里有一个相干声名的图表可以参考(Rebel Labs建造。链接:

http://zeroturnaround.com/wp-content/uploads/2016/04/Java-Collections-cheat-sheet.png。

StackOverflow: 你没见过的七个最好的Java谜底

八、总结

对付Java,着实要害的不在于你懂几多,而是在于你可以一向学到更多的对象。StackOverflow不只在code上的一些题目可以辅佐我们,也有助于我们回过甚往复深入地进修一些我们已经知道的常识。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读