Stackoverflow:您从未见过的7个最佳Java答案

您可以在Stackoverflow上找到哪些最有趣的答案?

Stackoverflow是开发人员的金矿。 它可以帮助我们找到遇到的特定问题的最有用答案,并且我们总是从中学习新事物。

对于以下文章,我们研究了最流行的Java问题和答案,并决定重点介绍一些我们发现的珍贵宝石。 即使您是一位经验丰富的开发人员,也总会有一些新东西要学习。

所有人的Java答案

Java是Stackoverflow上第二受欢迎的标签 ,与它相关的问题超过一百万。 在过去的一周中,该网站上载了4,600多个问题,毫无疑问,它是最大,最活跃的在线开发者社区。

这些信息与Stackoverflow的2016年开发人员调查结果紧密相关,在该调查中,有56,033名编码员被问到他们选择哪种语言。 Java排在第三位:

最受欢迎的技术

2016年最受欢迎的技术。来源:Stackoverflow

我们已经知道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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值