常见的Java神话

这些问题在任何面试中都可能太过提出而无法提出,因为它们可能会使候选人推迟。 不管怎样,他们可能会在您自己的时间练习。

误解1)System.exit(0)阻止最终被调用

为什么这样的代码

System.setSecurityManager(new SecurityManager() {
        @Override
        public void checkExit(int status) {
            throw new ThreadDeath();
        }
    });

    try {
        System.exit(0);
    } finally {
        System.out.println("In the finally block");
    }

打印

In the finally block

为什么不打印堆栈跟踪?

在此代码中,str是一个String对象。

与C ++不同,所有变量都是基元或引用。 变量不能是对象。 这意味着当你有一个像

String str = "Hello";
String text = "Bye";

str == text; // compares two references, not their contents.
str = text; // assign the reference text has to str.

在许多情况下,差异不大,但会引起与此类线条的真正混淆。

final StringBuilder sb = new StringBuidler();
    sb.append("Hello"); // The reference sb is final, not the instance it references.
    method(sb); // method can alter the instance, but it cannot change the reference.

误解3)Java内存泄漏是C ++开发人员可以理解的。

在Wikipedia上,内存泄漏是

计算机科学中 ,当计算机程序错误地管理内存分配时,就会发生内存泄漏 。 在面向对象的编程中 ,当对象存储在内存中但无法被运行的代码访问时,可能会发生内存泄漏。

但是,在Java中,对象始终是可访问的,并且清除了那些不能强烈访问的对象。 Java中的内存泄漏一词是指; 保留内存的任何不希望有的增加,通常是由于在不再需要资源时将其记录在集合中。

如果没有纪律,则多线程很难。 如果仅将一堆代码和一堆线程放在一起,就会遇到一个很难解决的问题,这将是一团糟。
 
但是,如果只使用所需数量的线程,控制线程之间的交互方式,并使用团队中每个人都能理解的一些简单模式,则问题将变得非常简单。 接下来的挑战是使整个团队都遵守规则。

最近,我读了一个涉及整数加法,内存访问,模数和打印到控制台的问题。 尽管每个操作都比该列表中的每个操作慢几个数量级,但该人员仍在尝试加快最快的操作速度,但是使用了更昂贵的操作。

当您想提高性能时,您需要用便宜的操作代替更昂贵的操作,并且如果瓶颈是硬件(例如,读取硬盘驱动器上的数百万个文件),则更改软件无济于事,因为这不是问题的根源。

误解6)随机数总是看起来随机

随机数的特定组合与带模式的数一样可能。 这个问题是我在此博客上提出的问题的转贴 许多人不敢相信随机数生成器会产生一个看起来根本不是随机的序列。

误解7)浮点数应避免,因为它具有随机误差。

每次相同的操作,浮点都会产生相同的错误。 该错误是可预测的,因此是可管理的。 如果您知道自己在做什么,并遵循一些简单的规则(例如,对结果四舍五入),则浮点代码与使用BigDecimal相比,不会出错,但它更易于阅读并且速度提高了大约100倍(并且不会产生垃圾)。

误解8)时区是永恒的

造成混淆的常见原因是,随着时间的推移,时区会发生变化。 这意味着欧洲/伦敦时代是1970/1/1 01:00而不是00:00,为什么? 在1968年到1970年之间,伦敦的夏令时为2.5年。

在过去几年中,许多其他时区发生了变化。 莫斯科是GMT + 3,现在是GMT + 3(从2011年3月27日开始)。如果您查看2010年的某个时间,应该会看到GMT + 3不是+4。

因为您认为这听起来很奇怪,

  • 在瑞典1721年2月30日
  • 在英国1751年,第一天是3月25日,与法国相差11天。
  • 当美国采用公历时,它是追溯性的,因此记录了几百年的日期可以参考这两个日历。 (通常给两个日期以尽量减少混乱),例如乔治华盛顿的生日从1731年2月11日更改为1732年2月22日。

误解9)当您在一个线程中读取一个非易失性值时,最终会看到一个更新的值。

最后一天在StackOverflow上出现了两次。 基本上,JIT可以优化代码,使其内联线程不变的非易失性字段。 一旦代码编译完成(您可以使用-XX:+ PrintCompilation看到它),它可能永远不会看到您稍后在另一个线程中执行的更改。 添加随机同步块或打印语句可能会减慢过程或使JIT迷惑,并且它不会执行优化(无论是及时执行还是完全执行)。
有关更多信息,请说明何时需要挥发物

误解10)关于Java面试问题的大多数内容都是准确的。

很高比例的Java面试问题要么已经过时(仅十年以上,并且不适用于Java的任何现代版本),要么具有误导性,或者完全是错误的。 不幸的是,这些文件未经检查就被编译和回收了。
我会在StackOverflow上查看答案,因为它们的码头评论更好。 最重要的是,避免使用质量令人惊讶的持续低劣的印度玫瑰之类的网站。 如果您感到学究,请尝试查找一篇文章中可以找到多少拼写错误(使用班级名称和技术术语)和神话。 问题的一部分是没有有效的方法来提供反馈并纠正这些问题。

翻译自: https://www.javacodegeeks.com/2014/05/common-java-myths.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值