StackOverflow:你没见过的四个最佳的Java答案

作者:web前端    发布时间:2020-01-20 09:28     浏览次数 :

[返回]

图片 1

本文由码农网 – 李俊英原创翻译,转发请看清文末的转发供给,接待加入大家的付费投稿安顿!

原稿来自:DZone译文来自:后端技能随想StackOverflow(后面简单称谓so卡塔尔国发展到眼下,已经成为了中外开垦者的宝藏。它亦可扶持我们找到在各种领域碰到的题指标最实用的减轻方案,同期大家也会从当中学习到非常多新的东西。那篇散文是在大家审阅了so上最盛行的Java难点以致答案后从当中挑出来的。尽管你是叁个有加多经验的开采者,也能从当中学到不菲东西。分层预测SO上最多投票的多少个Java难点是:为啥处理二个排序数组要比非排序数组快的多。为了酬答那几个难点,你需求采纳分支预测(branch prediction卡塔尔国。分支预测是风流倜傥种构造,目的在于通过在真正的门路爆发前估计某大器晚成支行的下一步来提高管理进程。分支在这里间即三个if语句。那样的话,假设是一个排序数组,那么分支预测将会进展,不然不会开展。Mysticial(so上的二个回答者卡塔尔(قطر‎试图动用铁路和列车来简要介绍那么些定义。若是你在铁轨连接处要调节列车要走哪条路,你会选拔侧面依旧左侧?你能够阻挡轻轨,然后问的哥该往那边,然则这么会让整个进程变慢。由此你一定要去猜准确的可行性,那么如何去猜呢?最佳的秘技正是通过阅览近年来那几个火车每便经过时的门路,估量出科学的趋向。那便是分支预测:识别方式并运用它。不幸的是,这么些题指标提问者是分段预测退步的被害者。因为她的支行未有此外能够辨认出的格局,所以预测出的一言一行是即兴的。Java中的安全另三个流行的Java难题是:为何在Java中关于密码的地点更为垂怜使用char[]并不是String?其实原始的标题尤为切实有个别,正是问的在Swing中,password控件有一个getPassword方法(重临char[]实际不是getText(卡塔尔国再次来到的String卡塔尔(قطر‎。其实这里而不是神经过敏-那是一个康宁难题。String是不可变的,意味着大器晚成旦它被成立了,那么你就不容许去校勘它。那也意味在GC早前,你对这个数量不可能做其余管理。由此,只要有人能够访谈你的内部存储器,那么String就有希望被她取获得。这也正是怎么要运用char数组。你能够显示地肃清数据可能覆盖它。那样密码这种敏感数据便是GC还并未有進展也不会再在系统留住印痕。异常就算超级多开垦者趋势于忽视对受检非凡的拍卖,SO上依然有比非常多有关那多少个的难题。个中一个最流行的主题材料是:什么是NullPointerException,作者该怎么处理它?对此,大家并从未以为兴奋,因为那一个难点也是在生育条件的Java应用中排行第后生可畏的极其。实际上,当NullPointerException(也许别的exceptionState of Qatar在系统现身的时候,大家得以生出三个报告急察方。因为这种非常日常情状下都以业务代码逻辑万分产生(作者注卡塔尔(قطر‎。干什么这段代码应用随机字符串打字与印刷出了”hello world”标题链接:这几个难题交给了上边包车型大巴代码,并打印出了”hello world”

对开垦职员来讲, StackOverflow有如贰个财富。对实际的题目,它能帮大家找到最可行的答案,况且大家也足以从上边学习新的学识。

System.out.println(randomString(-229985452) + " " + randomString(-147909649));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();}

上边包车型客车剧情,通过那个最司空见惯的JAVA难题与答案,并首要的标记出大家找到的精髓难点。即让你是多个资历足够的开采职员,那一个也是值得去上学的。

实则,采用风姿洒脱组自由的整数并不是即兴的。给定叁个seed参数(在这里个例子中是-229985452和-147909649卡塔尔, 那么每一次随机,同样的seed则会发出相仿的出口。Random(-229985452卡塔尔(قطر‎.nextInt(27卡塔尔(قطر‎发生的前三个数字:8, 5, 12, 12, 15, 0Random(-147909649卡塔尔(قطر‎.nextInt(27State of Qatar发生的前三个数字:23, 15, 18, 12, 4, 0那样,最后输出的正是”hello world”。怎么几个日子戳相减(in 一九三零State of Qatar得出二个离奇的结果?标题链接:

JAVA难题纵览

JAVA是StackOverflow上 其次风行的竹签 ,有超过100万个难题与JAVA有关。仅在上个礼拜,就有4600个难题被提出,不可否认这里是开采者们最大也是Infiniti活跃的线上社区。

图片 2

此音讯雷同也出自StackOverflow 二〇一四年的开荒者考察中 ,56033名开垦者被问到关于开拓语言的选料,JAVA是第二个人。因为在商海上JAVA侵吞着主导,由此大家揣测读者也早本来就有那么意气风发两遍的去探访StackOverflow来探索答案。可是,尽管你轻便的在StackOverflow上闲逛,也会发觉众多有意思的标题,上边让我们来探问那一个用心选出的难点。

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);}

支行预测

在StackOverflow上最常常被问到的叁个主题素材正是” 为何地点理四个排序过的数组比一个未排序的数组要快 ?”回答这样的主题材料,你得询问分支预测。

分层预测是黄金年代种期待能够荣升利用流程的构造,目的在于一条路子在真正被推行前就足以被提前的猜出。当然它不只是二个通通意义上的困惑,而是二个有针对性的揣度。

分层在那处正是一个“IF 语句”。在这里意况下,假设数组是排序过的,分支预测将起效用,不然而不能职业。 Mysticial 试着用生龙活虎种轻松的措施来解释那么些难点,以铁路和列车为例子。想像一下,你精通火车来到二个交汇点,接下去你须求调节列车走哪条线。你会挑选左依旧右?当然,你也得以告意气风发段落火车问问司机哪一条路是合情合理的,不过那却会减低整个高铁运转的速度,并让列车的行进进度变的更加的犬牙相错。你也得以猜一下,不过你什么确定保障您猜的听之任之是对的吧?精通下那趟列车在此之前的驾乘者都以怎么办的,况且知道以前他们都以如何抉择道路的,那是贰个丰裕好的主意。

那正是分支预测:找到方式同时接收他们。

不好的是,好些个动静下能问出那样难题的大非常多是一个失效的分段预测的遇害者。由于支行未有可识其他格局,想要去猜度就实在一定要是贰个任意的估计了。

按理说上边的代码最后的结果应当是1,但实际上的输出却是353。其实,这是三个时区的标题。1928年三月31号24:00,东京大运到回调度了5分钟52秒,由此”1926-12-31 23:54:08”发生了一次,Java将前面一次实例化成了本地的那一个时刻。由此和后少年老成秒的反差成了353。我们须要提出,借让你试着来运转这段代码,结果并不一定是353。JonSkeet提议了那点,在时区数据库项目贰零壹肆版中,那几个退换的时刻点改到了1901-12-31,因而成了344秒的异样。没辙被抓走的Chuck诺ReesException主题材料链接:这里有贰个很显著的标题:假若有exception被抛出,但是还未有别的情势去catch,那么应用会崩溃吗?也许如那几个主题材料所问:是还是不是能够写后生可畏段Java代码让几个借使的java.lang.ChuckNorrisException不能够被捕获。答案是足以,不过这里有多少个”可是”。你能够编写翻译风华正茂段代码抛出三个ChuckNorrisException,但是在Runtime时动态变化一个并不继续于Throwable接口的Chuck诺ReesException类。当然,为了让那个进程能够开展,你须求关闭掉字节码验证。jtahlborn给出了黄金年代体化的消弭办法。哈希表哈希表是另外叁个在SO上流行的标题连串。许多客商都想要知道全体集合类之间的界别,什么日期该选择哪一类集合。迭代相继是必不可少构思的要素。使用HashMap则忽视了颇负的各类音讯,也正是得到成分的逐一和您插入元素的逐个是绝非别的关联的;使用TreeMap则会得到叁个排序好的迭代集合;使用LinkedHashMap则是叁个FIFO的顺序。要是你照旧对这么些感觉纠缠,这里有一个唇亡齿寒表明的图形可以参谋(Rebel Labs制作卡塔尔国。总结对于Java,其实首要的不在于你懂多少,而是在乎你能够间接学到越多的事物。StackOverflow不仅仅在code上的一些标题得以帮忙大家,也可以有协助大家回过头来去浓郁地球科学习一些我们曾经清楚的学识。

JAVA的安全性

另一个风行的JAVA难点是“为啥在JAVA的密码处理中,更赞成去行使char[]并非String?”更宛在近年来有些的问法是:为啥在JAVA Swing中的密码输入框方法是:getPassword(return char[]), 而不是getText(return String)

并不是意外的,这里是八个安全主题材料。因为String 是不可变的,那象征你只要创设了它则不恐怕改过。相近也代表在GC前您无法通透到底的删除掉它。在好几景况下,尽管有人黑进了你的内部存款和储蓄器,那么被保留成String的密码则足以被人获得的。

这正是为啥你须要利用字符数组。你能够在采取完后显式的撤消它,只怕你也足以用别样的其余东西去覆盖它。那样敏感的音讯就不会在系统的其它市方现身,纵然那时GC还一贯不运行。

异常

不畏有不菲开辟人士会忽视卓殊检查,不过仍然有成都百货上千主题材料是关于JAVA卓殊的。在您的代码中那是四个值得引起你注意的难点,忽视它并不可能使它消灭。

最习见的二个主题素材是“什么是 NullPointerException,并怎样肃清它“, 见到这样的标题有这么多的人问,大家毫不感叹。在JAVA的生育意况中,空指针非常也实在是排行第大器晚成的充足类型。

Takipi 介绍了豆蔻梢头种检查空指针格外或许其余极其的生机勃勃种新的主意。