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”。

 

其实,选择一组随机的整数并不是随机的。给定一个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,但实际的输出却是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。

 

八、总结

对于Java,其实关键的不在于你懂多少,而是在于你可以一直学到更多的东西。StackOverflow不仅在code上的一些问题可以帮助我们,也有助于我们回过头来去深入地学习一些我们已经知道的知识。

扩展阅读

HashMap为什么是线程不安全的

科普:String hashCode 方法为什么选择数字31作为乘子

IntelliJ IDEA 常用快捷键

面试必备之TCP常见知识点整理

Maven 的这 7 个问题你思考过没有?

来源:https://www.rowkey.me/blog/2016/08/03/so-java-7-answers/

StackOverflow: 你没见过的七个最好的Java答案的更多相关文章

  1. 超赞!12套你没见过的社交媒体 & 社交网站图标

    如今,社交网络成为我们信息获取和传播的重要途径,很多网站都有把内容分享到社交媒体的功能.社交媒体图标作为向用户传递信息的重要媒介,不管是在网页还是 Web 应用程序中都非常需要.今天这篇文章和大家分享 ...

  2. 这是你没见过的不一样的redis

    转: 这是你没见过的不一样的redis 提到Redis,大家一定会想到的几个点是什么呢? 高并发,KV存储,内存数据库,丰富的数据结构,单线程(6版本之前) 那么,接下来,上面提到的这些,都会一一给大 ...

  3. 《手把手教你》系列基础篇(七十六)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 下篇(详解教程)

    1.简介 今天这一篇宏哥主要是结合实际工作中将遇到的测试场景和前边两篇学习的知识结合起来给大家讲解和分享一下,希望以后大家在以后遇到其他的测试场景也可以将自己的所学的知识应用到测试场景中. 2.测试场 ...

  4. Spring Boot 揭秘与实战(七) 实用技术篇 - Java Mail 发送邮件

    文章目录 1. Spring Boot 集成 Java Mail 2. 单元测试 3. 源代码 Spring 对 Java Mail 有很好的支持.因此,Spring Boot 也提供了自动配置的支持 ...

  5. 《手把手教你》系列基础篇(七十五)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 中篇(详解教程)

    1.简介 上一篇中介绍了DataProvider如何传递参数,以及和一些其他方法结合传递参数,今天宏哥接着把剩下的一些常用的也做一下简单的介绍和分享. 2.项目实战1 @DataProvider + ...

  6. Qt国际化相关类(以前没见过codec->toUnicode,QTextCodec,QLocale.toString和QLocale::setDefault,QInputMethod::locale())

    QTextCodec QTextCodec为文本编码之间提供转换. Qt用Unicode 来存储,绘制和操作字符串.在很多情况下你可能希望操作不同编码的数据.例如,大部分日本文档是以Shift-JIS ...

  7. 一封来自恶魔的挑战邀请函,那些你见过或者没见过的C语言指针都在这里了

    前言 相信大多数的同学都是第一门能接触到语言是C/C++,其中的指针也是比较让人头疼的部分了,因为光是指针都能专门出一本叫<C和指针>的书籍,足见指针的强大.但如果不慎误用指针,这些指针很 ...

  8. WinAPI你知道多少?!(上千个,好多都没见过)

    http://www.cnblogs.com/vanver/archive/2013/06/13/NO-2013_06_13pm.html 播客开篇,讲讲废话:本篇播客只是推荐给热与钻研的同学们... ...

  9. Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)

    Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Q ...

随机推荐

  1. Py修行路 python基础 (四)运算 copy

    字符串的格式化 在字符串中插入 %s ,作为占位符,后边儿再定义插入变量. 算术运算 % 取模   判断奇偶数 / 除法   有小于号 // 取整除  返回整数部分 逻辑运算 and or not ' ...

  2. ORACLE和MYSQL函数

    函数 编号 类别 ORACLE MYSQL 注释 1 数字函数 round(1.23456,4) round(1.23456,4) 一样: ORACLE:select round(1.23456,4) ...

  3. 第三章 服务治理: Spring Cloud Eureka

    Spring Cloud Eureka是 Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能 服务治理 ...

  4. HTTP常用标准请求头字段

    常用标准请求头字段 Accept 设置接受的内容类型 Accept: text/plain Accept-Charset 设置接受的字符编码 Accept-Charset: utf-8 Accept- ...

  5. Android 4.4 外置卡

    虾米.酷狗.百度地图.UC浏览器 下载 可以设置下载路径保存到外置SD卡上. 其他的软件目前还不支持. 最终Android 4.2是可以选择的,后来Android禁用了外置卡,以上软件是如何实现的?

  6. .NET 调用c++库注意事项

    很久没有更新了,主要还是因为自己懒吧,希望从今天开始坚持至少一周写一篇文章. 调用函数库是正常的,调用完成后,在使用EF进行数据更新时,将发生如下异常信息,而且几乎必现. 行库遇到了错误.此错误的地址 ...

  7. springMVC第一天

    这些是springMVC3.2所用到的jar包 web.xml配置 <?xml version="1.0" encoding="UTF-8"?> & ...

  8. jetbrains idea/webstorm等(注册,激活,破解码,一起支持正版,最新可用)(2017.3.16更新)【转】

    选择 License server (2017.3.16更新) http://idea.imsxm.com/ 详细请参考:  http://www.cnblogs.com/ys-wuhan/p/584 ...

  9. OK6410&nbsp;tftp下载内核、文件系…

    飞凌官方提供了一键下载烧写linux的方式,相对来说比较方便,但是对于开发来说不够灵活,因此这篇文章把tftp相关的点介绍一下,整理下其中遇到的一些问题. 一键烧写本质上是启动位于SD卡中的Uboot ...

  10. sqlplus客户端 navicat 使用sqlplus OCI

    链接:http://pan.baidu.com/s/1i5otsUT 密码:cbux 解压后放到某个目录下 这是我的 sqlplus客户端出现乱码 - 一支小白 - 博客园  http://www.c ...