stackoverflow
您可以在Stackoverflow上找到哪些最有趣的答案?
Stackoverflow是开发人员的金矿。 它可以帮助我们找到遇到的特定问题的最有用答案,并且我们总是从中学习新事物。
在以下文章中,我们研究了最受欢迎的Java问题和答案,并决定重点介绍一些我们发现的珍贵宝石。 即使您是经验丰富的开发人员,也总会有一些新东西要学习。
所有人的Java答案
Java是Stackoverflow上第二受欢迎的标签 ,与它相关的问题超过一百万。 在上周,有超过4,600个问题上传到该网站,毫无疑问,它是最大,最活跃的在线开发人员社区。
这些信息与Stackoverflow的2016年开发人员调查结果紧密相关,在该调查中,有56,033名编码员被问到他们选择哪种语言。 Java排在第三位:
我们已经知道Java统治着就业市场 ,可以肯定地假设您也曾经访问过Stackoverflow一次或两次来找到问题的答案。 但是,即使您只是随便浏览Stackoverflow而没有特定的问题,也会弹出很多有趣的事情。 让我们看看其中一些宝石。
1.分支预测
在Stackoverflow上最受争议的Java问题之一是:“ 为什么处理排序数组比未排序数组更快? ”。 为了回答这个问题,您需要使用分支预测。 它是一种架构,旨在通过猜测在选择实际路径之前特定分支的运行方式来改善应用程序流程。 如果您愿意,可以进行有根据的猜测,但这实际上并不是猜测。
for (int i = 0; i < 100000; ++i)
{
// Primary loop
for (int c = 0; c < arraySize; ++c)
{
if (data >= 128)
sum += data;
}
}
这里的分支是if语句。 在这种情况下,如果对数组进行排序,则分支预测将起作用。 如果未排序,它将无法正常工作。
Mysticial已尝试使用铁路和火车以更简单的方式对此进行解释。 想象一下,您经营一个路口,需要确定火车的行驶方向,您会选择向左还是向右? 当然,您可以停止火车,并问驾驶员哪种方法是正确的方法,但这会使整个过程缓慢,笨拙且令人讨厌。 您需要猜测。 您如何确定自己的猜测是正确的? 查看当前列车的过去行驶情况,了解每次行驶的方向。
那就是分支预测:识别模式并遵循它们。
不幸的是,在这种情况下,提出主要问题的用户是分支预测失败的受害者。 发生这种情况是因为分支没有可识别的模式,因此尝试预测其动作是非常随机的。
2. Java的安全性
Java用户经常会提出的另一个常见问题是:“ 为什么 Java中使用char []而不是String来代替String? ”。 这个问题本身更具体一些,询问为什么Swing密码字段具有getPassword()(返回char [])方法而不是getText()(返回String)。
这里不足为奇–这是一个安全问题。 字符串是不可变的,这意味着您无法在创建字符串后对其进行修改。 这也意味着您无法在GC敲门前清除数据。 如果有机会有人可以访问您的内存,则可以使用带有密码的字符串来供他使用。
这就是为什么您应该使用char数组的原因。 完成处理后,您将可以明确擦除数据,也可以用其他任何方式覆盖数据。 即使在GC运行之前,敏感数据也不会出现在系统中的任何位置。
3.例外
即使许多开发人员更喜欢忽略检查的异常 ,但仍有许多关于Java中异常的问题。 这是您应该在代码中解决的主要问题,而忽略该问题并不能解决它。
最受质疑的问题之一是“什么是NullPointerException,以及如何解决它?”。 我们对这种异常的流行程度并不感到惊讶,因为它在生产Java应用程序中也被列为第一大异常类型 。
在Takipi,我们实际上可以选择在系统上引入新的NullPointerException(或任何其他异常)时设置警报。 检查一下 。
4.怪癖和魔术
时不时地,您在Stackoverflow中遇到一个令人困惑的问题,它会教给您一些新知识。 我们选择了一些我们最喜欢的宝石:
问题提出了以下打印声明,打印出“ 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();
}
System.out.println(randomString(-229985452) + " " + randomString(-147909649));
答案是没有汤匙。 这意味着选择随机的整数集将不是随机的。 相反,该实例将遵循以特定种子参数(在这种情况下为-229985452或-147909649)开头的随机数生成算法。 每次您要求一个随机模式时,相同的种子将生成相同的模式-这将打印出您好世界。
用户Eng.Fouad完美地解释了这一点:
在新的Random(-229985452).nextInt(27)中,随机产生的前6个数字是:
8、5、12、12、15、0
新的Random(-147909649).nextInt(27)生成的前6个数字是:
23、15、18、12、4、0
当您将这些数字添加到字符`(即96)的整数表示中时,您将获得“ hello world”:
104 –>小时
101 –> e 108 –> l 108 –> l 111 –> o
119 –> w
111 –> o
114 –> r 108 –> l 100 –>天
在下面的问题中,用户解析两个日期字符串,它们相隔一秒引用时间,并进行比较。
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秒,因此没有得到1的结果,而是得到了结果353(排队怪异的音乐)。 这有一个非常基本的解释:这是时区问题。 1927年12月31日,上海时间倒退了5分52秒,Java将其解析为该本地日期/时间的瞬间。
我们确实必须指出,如果您尝试从原始问题中运行代码,它将产生不同的结果。 正如乔恩·斯基特(Jon Skeet) 在回答中指出的那样 ,在2014年时区数据库项目中,更改时间已移至1900-12-31,现在仅343秒更改。
这是一个显而易见的问题:如果引发了异常但没有人可以捕获它,应用程序会崩溃吗? 或如问题所问:“是否有可能在Java中构建一小段代码,使假定的java.lang.ChuckNorrisException无法捕获?”。
简短的答案是有可能的,但其中涉及“但是”。 您可以编译引发ChuckNorrisException的代码,并定义一个在运行时不会扩展Throwable的类ChuckNorrisException。 仅凭这一点还不足以使其正常工作,并且您必须禁用字节码验证程序。 jtahlborn给出的答案将带您完成整个过程。
如果您是Java难题的粉丝,则可能需要查看我们的Java Deathmatch游戏。
5.哈希图
我们在Stackoverflow上遇到的最常见问题之一与哈希映射有关。 许多用户想知道集合之间的区别以及何时应该在另一个之上使用集合。
这里的关键要素是迭代顺序。 使用HashMap,您将没有有关订单的信息,并且当您向集合中添加更多元素时,该订单可能会更改。 使用TreeMap,您将获得排序的迭代,而使用LinkedHashMap,您将获得FIFO顺序。
如果您对此仍然感到困惑,我们的Rebel Labs朋友会帮您制作一张方便的图表 ,说明一个收藏相对于另一个收藏的好处。
最后的想法
对Java的了解并不重要,您可以学到更多。 Stackoverflow可以帮助解决代码中的特定问题,但它也是了解有关我们认为我们从头到尾知道的事情的新信息的绝佳来源。
如果您遇到一个有趣的问题,激烈的辩论或其他怪癖,我们很乐意在下面的评论中听到。
翻译自: https://www.javacodegeeks.com/2016/07/stackoverflow-7-best-java-answers-havent-seen.html
stackoverflow