点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

原文:https://dwz.cn/Boy5tcHJ

译文:https://dwz.cn/j1hgReGd

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

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/questions/6841333/why-is-subtracting-these-two-times-in-1927-giving-a-strange-result

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/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上的一些问题可以帮助我们,也有助于我们回过头来去深入地学习一些我们已经知道的知识。

往期推荐

MySQL百万级、千万级数据多表关联SQL语句调优

斗鱼开源基于Go实现的微服务框架 Jupiter

以为是行废代码,原来有这作用!

一行代码引来的安全漏洞就让我们丢失了整个服务器的控制权

尤雨溪:重头来过的 Vue 3 带来了什么?

用了那么多年的 Master 分支或因种族歧视而成为历史?

最后两天优惠啦!

欢迎加入我的知识星球,每周二聊技术,每周六侃社会!

最近更新

【预告】一个给阿里提的数据安全问题

【分享】最近碰到的API网关的奇怪用法...

【社会】老实工作没有其他收入,为什么还要补缴个税?

【职场】过来人说说银行科技怎么样?值得进去吗?

不知道星球是否适合你?

点击”阅读原文“查看更多星球精华

StackOverflow 上面最流行的 7 个 Java 问题!相关推荐

  1. StackOverflow 上面最流行的 7 个 Java 问题!| 值得一看

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群",加入新技术 StackOverflow发展到目前,已经成为了全球开发者的金矿. ...

  2. 流行的9个Java框架介绍: 优点、缺点等等

    流行的9个Java框架介绍: 优点.缺点等等 在 2018年,Java仍然是世界上最流行的编程语言.它拥有一个巨大的生态系统,在全世界有超过900万Java开发人员.虽然Java不是最直接的语言,但是 ...

  3. 流行的9个Java框架介绍:优点、缺点等等

    2019独角兽企业重金招聘Python工程师标准>>> 在2018年,Java仍然是世界上最流行的编程语言.它拥有一个巨大的生态系统,在全世界有超过900万Java开发人员.虽然Ja ...

  4. GitHub上最流行的10000个Java都使用了哪些库?

    2019独角兽企业重金招聘Python工程师标准>>> Java开发者所使用的Java语言已经很成熟且高度进化,目前常常要面临的问题是何时写新代码--是追随每个人都在讨论的新的热门技 ...

  5. Java:现实世界中最流行的10个Java应用程序示例

    Java 是 DevOps.AI.机器学习和微服务的第一大编程语言.今天,Java 广泛用于企业应用程序和构建动态数字产品.它也是增强和虚拟现实.大数据和持续集成的有用技术.Java 生态系统是使用先 ...

  6. 最为流行的几款Java IDE

    Java应用程序越做越大.越做越复杂.Java IDE在其中所起的作用也日益显著.有了Java IDE,使软件的生产率倍增.本文为大家介绍几款时下最为流行的Java IDE. 一.Eclipse Ec ...

  7. JetBrains调查:JavaScript最流行,Python超越Java

    文 | 白开水 出品 | OSC开源社区(ID:oschina2013) JetBrains 的第五次年度开发者生态系统调查<The State of Developer Ecosystem 2 ...

  8. Java:2022年最流行的Web开发Java框架

    在2022年,你可以看到Java仍然是世界上最流行的编程语言之一.Java不仅是最流行的计算机编程语言之一,它还是一个平台.平台是帮助创建和运行用任何编程语言编写的程序的环境.此外,已经设计了各种框架 ...

  9. Stackoverflow上人气最旺的十个Java问题

    2019独角兽企业重金招聘Python工程师标准>>> 1. 为什么两个(1927年)时间相减得到一个奇怪的结果?(3623个赞) 如果执行下面的程序,程序解析两个间隔1秒的日期字符 ...

最新文章

  1. 我发现一条惊人规律,年后跳槽BATJ,都是这种人....
  2. 分数混合运算简便方法_分数四则混合运算
  3. 【学术相关】U.S.News正式发布最新的2022最佳全球院校排名
  4. JVM 调优实战--常用命令参数及PS收集器的GC日志格式
  5. 苹果平板可以用html么,9.7寸ipad pro能用pencil吗?ipad pro全面支持Apple Pencil
  6. 用beyond compare解决git不能同步项目重新下载项目然后就行对比解决冲突
  7. MCI:移动持续集成在大众点评的实践
  8. 阿里云centos7使用yum安装mysql的正确姿势
  9. linux 主机的网络属性基本配置:
  10. python爬虫大众点评_Python爬虫丨大众点评数据爬虫教程(1)
  11. 微信小程序简单签到功能源码分享
  12. 解决用U盘重装Mac系统中电脑无法识别U盘的问题
  13. 感觉现在的技术圈越来越像娱乐圈了
  14. MySQL中文存到数据库是,springMVC保存数据到mysql数据库中文乱码问题解决方法
  15. 小球碰撞python代码_python开发的小球完全弹性碰撞游戏代码_python_脚本之家
  16. 【论文阅读】DeepIM: Deep Iterative Matching for 6D Pose Estimation
  17. 【教程】Unity 与 Simence PLC 联动通讯
  18. 12864液晶屏接口定义,16引脚的(普中科技所配)
  19. MySQL数据库多表查询练习题
  20. linux cat命令缩写,linux下cat命令详解

热门文章

  1. post和get提交中文数据的转码问题
  2. python 3.10 新增 switch-case 简介
  3. golang 正则 校验 字符串
  4. golang 获取两个时间 相差多少 小时
  5. cve-2019-11076 Cribl UI 1.5.0 未授权命令执行漏洞分析
  6. python3 正则表达式 匹配多个 单词 字符串
  7. 关于WriteFile函数的lpNumberOfBytesWritten在Win8开始的不同
  8. vs2010发布、打包安装程序(超全超详细)
  9. Linux Shell -- 无网不利
  10. Linux grep命令分析以及C语言版本的实现