济南Java培训
达内济南山大路中心

17156168575

热门课程

7个关于流行的Java问题的精华答案

  • 时间:2017-04-18
  • 发布:互联网
  • 来源:互联网

    StackOverflow:7个你从未见过的Java问题最佳答案,学习java做一个java工程师不但待遇高,而且前途无可限量.为什么这样说呢?因为java程序语言作为最流行的计算机开发语言之一,几乎所有的系统、软件、app、网页等都是需要用到java的.
济南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 介绍了一种检查空指针异常或者其他异常的一种新的方法.

    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"上有一个答案可以提供这样的一个完整例子

    Hash Maps

    在StackOverflow上还有一种常见的问题是与hash maps有关的.很多开发人员都想知道集合类中的不同类的区别,以及在何时用哪一个.

    核心的问题是迭代的顺序.在HashMap中是没有任何与顺序有关的信息的,并且元素的顺序在你插入集合的时候就已经被改变了.在TreeMap中,你可以得到一个已被排序的集合,在LinkedHashMap中,你可以得到一个先进先出(FIFO)的集合.

    如果你还有疑惑,我们的朋友Rebel Labs制作了 一个图 来解释这些集合间的关系.

    结束语

    无论你对JAVA有多了解,总有些的知识是需要你学习的.StackOverflow不仅仅是问问题的地方,也是可以彻底的学习新知识的地方.

    更多济南Java培训机构相关资讯,请扫描下方二维码

济南Java培训

上一篇:专业程序员的7个特质
下一篇:关于Java的10个谎言

论码农到工程师的进阶

成为伟大程序员的 10 大要点

如何进阶为30W年薪的Java程序员

论培训与自学java的区别

选择城市和中心
贵州省

广西省

海南省