`
deepinmind
  • 浏览: 451415 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
1dc14e59-7bdf-33ab-841a-02d087aed982
Java函数式编程
浏览量:41621
社区版块
存档分类
最新评论

关于Java的10个谎言

阅读更多
下面的这些都算是比较高级的问题了,面试中一般也很少问到,因为它们可能会把面试者拒之门外。不过你可以自己找个时间来实践一下。
1. System.exit(0)会跳过finally块的执行
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?为什么没有打印出堆栈跟踪信息呢?
2. String str = "Hello”;其中str是一个字符串对象
跟C++不同的是,Java里的变量要么是基础类型,要么是引用。变量不可能是对象。这意味着像这样的表达式:
String str = "Hello";
    String text = "Bye";
    str == text; // 比较两个引用,而不是内容
    str = text; // 把text的引用赋值给str


大多数情况下其实没有太大的区别,不过这么写容易引起困惑。
final StringBuilder sb = new StringBuidler();
    sb.append("Hello"); // 这个引用是final类型的,而不是这个实例。
    method(sb); // 可以通过方法来修改这个实例,不过这个变量是无法修改的
 

3. Java的内存泄露跟C++程序员理解的一样
内存泄露在维基百科上的定义是”在计算机科学中,如果程序没有正确地管理好内存分配 ,就会出现内存泄露。在面向对象编程中,如果内存中的一个对象无法在代码中访问不到的话,这就是内存泄露。”
不过在Java中,对象总是可达的,那些没有强引用的对象会被清除掉。内存泄露这个术语在Java中意味着:内存中存在着不该存在的对象,通常来说是有些不再使用的资源却仍存储在集合中。
4. 多线程编程很难
如果你没有经验的话,多线程编程的确很难。如果你只是把一堆代码扔到一堆线程中去执行,那样出了问题根本没法解决,只能是一团糟。
但如果你能进行线程的按需分配,控制线程间的交互,使用一些团队中的成员也能明白的简单的模式,问题就变得简单多了。当然还有一个挑战就是你得让团队中的所有人都遵循你的这个规则:-)
5. 不用关心不同操作间性能的不同
最近听说有个问题,它涉及到了整数的相加,内存访问,取模,以及输出到控制台。尽管在这些操作里面,每一个都比前面一个要慢一个数量级,但这哥们就是想优化这里面最快的操作,加法,还用了些更昂贵的操作来替换它。
如果你真的想要优化性能,你最好用一个廉价的操作来替换掉那些昂贵的操作,如果你的瓶颈在硬件这块,比方说要从硬盘里面读取大量的文件,修改软件的代码是没啥用了,因为问题根本 就不在这。

6. 随机数都是随机的

一组特定的随机数就像是某种模式的数字。这个问题我在这篇文章中已经讲到过了。很多人都不相信随机数生成器生成的数字其实是不随机的。

7. 应该尽量避免使用浮点数,因为它们会产生随机错误

对于同一个操作而言,浮点数每次都会产生同样的错误。错误是可预测的,因此也是可控的。如果你清楚你要做的事情是什么,并且坚持使用一些简单的规则,比如说对结果进行舍入操作,那么浮点数出的错也不会比BigDecimal要多,除此之外它的可读性更强,而且效率快了百倍以上(同时产生的垃圾对象也更少了)。


8. 时区是永恒不变的

之所以会有这个误解是因为,随着时间的变化,时区是在改变的。这意味着欧洲/伦敦在新纪元的时候是1970/1/1 01:00而不是00:00,为什么?因为伦敦在1968年到1971年这两年间的时间内使用的是夏令时。

在过去的这些年里面,还有不少时区也发生了变化。莫斯科以前是东三区(GMT+3),现在是东四区(GMT+4)(从2011年3月27日开始)。如果你看下2010年的时间,你会发现它是东三区而不是东四区。

还有些事你听起来或许会感觉很意外:

- 1721年的瑞典的2月有30天。
- 1751年英格兰的第一天是3月25日,和法国相比差了11天。
- 美国采用公历纪年后,它往前追溯了上百年,这样原先记录的那些日期都可以用两种日历来进行表示(通常为了更精确会同时提供两个日期)。比如乔治华盛顿的生日从1731年2月11变成了1732年2月22。

9. 当你在线程中读取一个非volatile变量时,你最终能读取它更新的那个值。

前几天这个问题在StackOverflow上出现过两回了。一般来说,JIT编译器优化代码的时候会将这个线程没有修改到的非volatile类型的字段进行内联。一旦这个代码被编译了(你可以通过-XX:+PrintCompilation看到),你在另一个线程对这个字段进行的修改它很可能就永远也看不到了。加上随机的同步块或者打印语句可以推迟这个优化的执行,或者扰乱JIT编译器,让它不去执行这个优化。

10. Java面试题都是正确的

有很多Java面试题要么是过时了(超过10年没有更新了,和现在的Java版本已经脱节),要么是误导大家的,甚至可能是错的。不幸的是这些答案都没有检查过就被到处传来传去。

我会参考Stackoverflow上面的答案,因为这里的答案同行审查做的更好些。总的来说,像rose india这样的网站就不要上了,上面的答案的质量差的离谱。如果你喜欢刨根究底的话,可以看看上面一篇文章里有多少拼写错误(类名以及专业术语)或者错误的言论。存在这些问题的一个原因在于没有一个有效的反馈机制来纠正这些错误。

原创文章转载请注明出处:http://it.deepinmind.com

英文原文链接
2
0
分享到:
评论
4 楼 deepinmind 2014-05-13  
sessionsong 写道
6. 随机数都是随机的
  这个和装填因字有关  默认用的是当前时间的毫秒数来作为生产随机数的因子 这个时候生产的随机数就不相同了 但如果当我们指定了装填因子 那么不论什么时候 生产的随机数都是一样的
eg:
Random r = new Random(1);
int b = r.nextInt();
System.out.println(b);
最少输出 总是: -1155869325


对,就是你说的这样
3 楼 sessionsong 2014-05-12  
6. 随机数都是随机的
  这个和装填因字有关  默认用的是当前时间的毫秒数来作为生产随机数的因子 这个时候生产的随机数就不相同了 但如果当我们指定了装填因子 那么不论什么时候 生产的随机数都是一样的
eg:
Random r = new Random(1);
int b = r.nextInt();
System.out.println(b);
最少输出 总是: -1155869325
2 楼 freezingsky 2014-05-10  
面试过N个大小不同的公司,什么鸟题都有,从IQ题到中小学数学题,从中文到英文,从架构到java语言细则,从桌面到web。其中,以java语法和数据结构印象深刻,有不少题目都是错的,但照样拿出来笔试。
1 楼 white_crucifix 2014-05-10  
引用
如果内存中的一个对象无法在代码中访问不到的话,这就是内存泄露

多了个“不”字吧。。

引用
不过在Java中,对象总是可达的

这个不太准确吧

相关推荐

    不可不知道的10个java谎言

    以下就是10个不可不知道的Java谎言: 1. **System.exit(0)会跳过finally块的执行**:实际上,即使调用了System.exit(0),finally块中的代码仍然会执行。除非在安全管理者(SecurityManager)中重写了checkExit方法...

    Java俄罗斯方源码

    Java俄罗斯方块是一款基于Java编程语言开发的经典游戏,它的实现涉及了多个重要的编程概念和技术,对于初学者来说,深入理解其源码可以帮助提升Java编程能力。以下是对标题和描述中涉及知识点的详细解释: 1. **...

    java jar包中文转拼音和首字母

    Java提供了多种库和方法来实现这个功能。本篇文章将详细探讨如何使用Java来实现中文转拼音和姓名首字母。 首先,中文转拼音主要涉及到汉字与汉语拼音的映射。Java标准库并没有内置这样的功能,所以我们通常需要引入...

    Java反编译工具包及JDK11中文文档

    Java反编译工具包及JDK11中文文档

    EasyModels 测试版2(读数据库自动生成C#和JAVA类文件)

    为了解决这个问题,出现了各种代码生成工具,其中之一就是"EasyModels 测试版2",它是一款能够自动从数据库读取表结构并生成C#和Java实体类的小型工具。 EasyModels测试版2的核心功能在于其自动化特性。它通过连接...

    Spinvader:具有Space Invader基础知识的Java 2D游戏

    Spinvader是一款Java 2D游戏,通过添加一些功能来融合传奇游戏Space Invader的基础知识。 它仍处于开发阶段。 控制 : 机芯:ZQSD 拍摄:太空 Show Hitbox:F4 调试Mod:F3 资源 : 音乐: 菜单:复杂的B-美丽...

    嵌入式系统/ARM技术中的Android os设备谎言分辨率的解决方法

    它的核心架构包括一个基础的Linux内核,为系统提供了基本的硬件抽象和驱动支持,同时通过软件堆栈实现丰富的功能,其中包括Java虚拟机和各种应用框架。 Android系统采用模块化设计,允许各个层级的开发者针对不同...

    恋爱这件小事.doc

    【恋爱这件小事】是关于情感经历的探讨,主要聚焦在初恋这一特殊的情感阶段。初恋,正如标题所言,虽然在人生的整个历程中看似微不足道,但它的影响力却深远且独特。文章通过引用电影《秒速5厘米》中的场景,阐述了...

    Python-pydis用Python3克隆一个redis性能更佳优越

    描述中提到,“pydis是一个试验,反驳一些关于软件和解释语言性能和优化的谎言。”这暗示了开发者试图通过`pydis`来证明,尽管Python通常被认为不如编译型语言如C或Java那样快,但在适当的设计和优化下,它仍然可以...

    北大青鸟y2笔试题-20090419笔试Y2

    【北大青鸟y2笔试题】是针对北大青鸟ACCP5.0课程的一个重要的考核环节,这个笔试题目集合主要涵盖了2009年4月19日进行的一次Y2阶段的考试内容。Y2阶段是北大青鸟ACCP(北大青鸟计算机应用能力培养计划)中的一个重要...

    Qracle jar包

    这个驱动程序实现了Java.sql和javax.sql接口,允许Java代码通过标准的SQL语句执行数据库查询、更新和事务处理。 Oracle JDBC驱动分为几种类型,包括 Thin、OCI(Oracle Call Interface)和JDBC-ODBC桥等。Qracle ...

    Tomcat7配置(包括JDK配置)

    JDK是Java编程语言的软件开发工具包,它包含了编译器、调试器和其他工具,用于开发、编译和运行Java应用程序。在配置Tomcat 7之前,确保你已经安装了JDK 1.7。如果没有,你可以访问Oracle官网下载适合操作系统的JDK ...

    JAR包—jsoup HTML抓取

    这里我们关注的是一个名为`jsoup`的Java库,它专门用于处理HTML文档,帮助开发者轻松地抓取和解析网页内容。本文将深入探讨`jsoup`的使用方法以及其在HTML抓取中的核心功能。 `jsoup`是一个开放源代码的Java库,...

    Mybatis 最小依赖jar 不集成spring 自学练习版本

    Mybatis 是一个流行的Java持久层框架,用于处理数据库操作,如CRUD(创建、读取、更新、删除)以及复杂的查询。它强调SQL的灵活性,允许开发者直接编写SQL语句,将数据映射到Java对象上,从而简化了数据访问层的开发...

    我国计算机趣闻.pdf

    11. **JAVA流行的影响**:这里以幽默的方式表达了Java的普及程度,甚至在游戏机上也能运行。 通过这种寓教于乐的方式,这篇文档让计算机技术知识变得平易近人,同时激发了读者对这些概念的好奇心。

    Servlet_Session和Cookie学习

    在现代互联网应用中,会话跟踪技术是一个至关重要的概念,它确保了网站能够识别在连续的多个页面访问过程中,来自同一个用户的请求。其中,Session和Cookie是两种常用的会话跟踪技术。Java Servlet技术作为Java EE的...

    villamizardev:我的GitHub个人资料的配置文件

    :waving_hand: 嗨,我是ALEJANDRO VILLAMIZAR :man::laptop: 我是一个全栈软件开发人员,具有Java,JavaScript,Angular,Spring Framework和SQL查询语言的高级知识。 另一方面,我有会话英语技能(中级,B1)。 ...

    Tomcat运行配置代码实例

    在IT行业中,Tomcat是一款广泛使用的开源Java Servlet容器,它主要负责执行Java Web应用程序,包括JSP和Servlet。本教程将深入探讨如何配置并运行Tomcat服务器,通过一个实际的代码实例来帮助你更好地理解这一过程。...

Global site tag (gtag.js) - Google Analytics