StackOverflow:7个你从未见过的Java问题最佳答案
本文由码农网 – 李俊英原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!
对开发人员来说, 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问题最佳答案的更多相关文章
- 那些年,我们见过的 Java 服务端“问题”
导读 明代著名的心学集大成者王阳明先生在<传习录>中有云: 道无精粗,人之所见有精粗.如这一间房,人初进来,只见一个大规模如此.处久,便柱壁之类,一一看得明白.再久,如柱上有些文藻,细细都 ...
- 面试那点小事,你从未见过的spring boot面试集锦(附详细答案)
一, 什么是spring boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问页面https://spring.io/projects,我们将看到所有在应用程序中使用的不同功能的 ...
- 你从未见过的Case Study写作指南
Case Study,意为案例分析,Case Study与其它的留学论文作业最大的的差别就在于Case Study在论文开始就需要明确给出论,然后再阐述这个结论的论证依据和理由.留学生们需要知道的是C ...
- Stackoverflow上人气最旺的10个Java问题(转ImportNew)
本文转自:http://www.importnew.com/16841.html 写的确实太好了 1.为什么两个(1927年)时间相减得到一个奇怪的结果? 如果执行下面的程序,程序解析两个间隔1秒的日 ...
- Stackoverflow上人气最旺的10个Java问题
1. 为什么两个(1927年)时间相减得到一个奇怪的结果? (3623个赞) 如果执行下面的程序,程序解析两个间隔1秒的日期字符串并比较: 01 public static void main(Str ...
- StackOverflow 周报 - 高质量问题的问答(Java、Python)
这是 Stack Overflow 第三周周报,本周加入了 Python 的内容,原计划两篇 Java.两篇 Python.但明天过节所以今天就先把周报发了,两篇 Java.一篇 Python.公众号 ...
- 那些年,我们见过的 Java 服务端乱象
导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.” 移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利逐渐消失,很多 ...
- 那些年,我们见过的Java服务端乱象
导读 查尔斯·狄更斯在<双城记>中写道:“这是一个最好的时代,也是一个最坏的时代.”移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利逐渐消失,很多创 ...
- StackOverflow: 你没见过的七个最好的Java答案
StackOverflow发展到目前,已经成为了全球开发者的金矿.它能够帮助我们找到在各个领域遇到的问题的最有用的解决方案,同时我们也会从中学习到很多新的东西.这篇文章是在我们审阅了StackOver ...
随机推荐
- Deployment of VC2008 apps without installing anything
If you create a default CRT/MFC application with VS2008, this application will not run on other comp ...
- java 布尔值一种赋值方法
在研读jmeter的代码时发现一个很常见的布尔值赋值方式,记录下来备忘: public static void main(String[] args) { // TODO Auto-generated ...
- 阿里云 EDAS-HSF 用户指南
阿里云 EDAS-HSF 用户指南 针对 EDAS v2.3.0©Alibaba EDAS 项目组2015/8/19 1 前言本文档旨在描述阿里云 EDAS 产品中应用服务化模块的基本概念,以及如何使 ...
- js动态创建及移除div的方法
本文实例讲述了js动态创建及移除div的方法.分享给大家供大家参考.具体实现方法如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- P137、面试题23:从上往下打印二叉树
题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印.例如输入如图的二叉树,则依次打印出8,6,10,5,7,9,11.(其实是按层遍历)二叉树结点的定义如下:struct Bin ...
- c#自带压缩类实现数据库表导出到CSV压缩文件的方法
在导出大量CSV数据的时候,常常体积较大,采用C#自带的压缩类,可以方便的实现该功能,并且压缩比例很高,该方法在我的开源工具DataPie中已经经过实践检验.我的上一篇博客<功能齐全.效率一流的 ...
- C#如何使用和开发自定义配置节
在日常的程序设计中,如何灵活和巧妙地运用配置信息是一个成功的设计师的首要选择.这不仅是为了程序设计得更灵活性和可扩展性,也是为了让你的代码给人以清新的感觉.程序中的配置信息一般放在应用程序的app.c ...
- log4j学习一:解决系统日志错位问题
这两天,开发的系统遇到了一个非常奇怪的问题,我们的前台程序会将日志时而输出到webapp.log,时而输出到其他日志文件如AlarmThreshold.log中,初看并无规律,但秉着“机器永远不会出错 ...
- 设计模式 - observer
简单来讲,就是observer依赖于subject,当subject发生变化时,observer得到通知,并将状态与subject同步,常来用于维护对象间状态的一致性. observer的工作过程大体 ...
- JSOI2007建筑抢修
实际上和大多这类题一样(比如wikioi上的地鼠游戏),考察的都是堆的操作 这次改完之后就算把堆的模版定下来了 悲剧的是:大根堆打成了小根堆,导致一开始一直是10分…… 按结束时间排序,(经过验证,结 ...