java陷阱常见面试题

总览

Java是一种极简主义的语言,具有比其他语言故意更少的功能,尽管如此,Java仍然具有产生奇怪效果的边缘情况,甚至具有令人惊讶的效果的一些常见情况也会使您轻而易举。 如果您习惯于阅读另一种语言,则可以轻松地以错误的方式阅读Java,而不会感到困惑。

变量仅是引用或原语

没错,变量不是对象。 这意味着当您看到以下内容时,s 不是一个对象 ,它不是一个String,它是对String的引用

String s = "Hello";

这回答了许多混乱的领域,例如;

  • 问:如果String是不可变的,该如何更改。 例如 s + =“!”;
  • 答:您不能使用普通Java,只能更改对String的引用。

==比较引用,而不是它们的内容。

更令人困惑的是,有时使用==是可行的。 如果您有两个相同的不可变值,则JVM也可以尝试使引用相同。 例如

String s1 = "Hi", s2 = "Hi";Integer a = 12, b = 12;

在这两种情况下,都使用对象池,因此引用最终是相同的。 s1 == s2和a == b都成立,因为JVM引用了同一对象。 但是,稍微改变一下代码,以便JVM不会合并对象,并且==返回false,这可能是意外的。 在这种情况下,您需要使用equals。

String s3 = new String(s1);Integer c = -222, d = -222;
s1 == s2      // is trues1 == s3      // is falses1.equals(s3) // is truea == b        // is truec == d        // is false (different objects were created)c.equals(d)   // is true

对于Integer,对象池从-128开始,至少为127(可能更高)

Java按值传递引用

所有变量都按值传递,甚至引用也是如此。 这意味着,当您拥有一个作为对对象的引用的变量时,将复制此引用,但不复制该对象。 例如

public static void addAWord(StringBuilder sb) {sb.append(" word");sb = null;
}
StringBuilder sb = new StringBuilder("first ");
addWord(sb);
addWord(sb);
System.out.println(sb); // prints "first word word"

引用的对象可以更改,但是对复制的引用的更改对调用者无效。

在大多数JVM中,Object.hashCode()与内存位置无关

hashCode()必须保持不变。 没有这个事实,像HashSet或ConcurrentHashMap这样的哈希集合将无法工作。 但是,对象可以位于内存中的任何位置,并且可以更改位置,而无需您的程序知道发生了这种情况。 使用该位置的hashCode无效(除非您有一个不移动对象的JVM)

对于OpenJDK和HotSpot JVM,hashCode()是按需生成的,并存储在对象的标头中。 使用Unsafe,您可以查看是否已设置hashCode(),甚至可以通过

Object.toString()做一些令人惊讶的事,而不是有用的事

toString()的默认行为是为类和hashCode()打印内部名称。

如前所述,hashCode不是存储位置,即使它以十六进制打印也是如此。 而且,类名,特别是对于数组,令人困惑。 例如; String []打印为[Ljava.lang.String; [表示它是一个数组,L表示它是一个“语言”创建的类,而不是像BTW这样具有代码B的字节之类的基元。 表示课程结束。 例如说你有一个像

String[] words = { "Hello", "World" };
System.out.println(words);

打印类似

[Ljava.lang.String;@45ee12a7

不幸的是,您必须知道该类是一个对象数组,例如,如果您只有对象字,那么您将遇到问题,并且必须知道调用Arrays.toString(words)。 这种中断封装的方式非常糟糕,并且在StackOverflow上经常造成混乱。

我曾问过Oracle公司的其他开发人员这件事,我的印象是现在很难修复它。

参考: Vanilla Java博客上来自我们JCG合作伙伴 Peter Lawrey的Java常见陷阱 。

翻译自: https://www.javacodegeeks.com/2014/03/common-gotchas-in-java.html

java陷阱常见面试题

java陷阱常见面试题_Java常见陷阱相关推荐

  1. Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3

    Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3 总览 问题 详解 String.intern()的作用 link LeetCode的Two Sum题 ...

  2. Java基础常见面试题(一)

    Java基础常见面试题(一) 1. 为什么说 Java 语言"编译与解释并存"? 我们可以将高级编程语言按照程序的执行方式分为两种: 编译型 :编译型语言会通过编译器将源代码一次性 ...

  3. Java开发常见面试题详解(JVM)_2

    Java开发常见面试题详解(JVM)_2 JVM 问题 详解 JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots link 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认 ...

  4. Java工程师常见面试题集锦

    Java工程师常见面试题集锦(一)互联网人必看!(附答案及视频教程,持续更新) 2019年01月02日 14:01:14 CSDNedu 阅读数:653 大牛也怕面试题,尤其是基础题,在面试中如果出现 ...

  5. 测试开发java常见面试题_Java常见面试题200+,学习、面试必备

    本套Java面试题,选取了企业面试最常问到的问题,可以做为Java工程师的面试宝典,也可以做为想要不断完善和扩充自己 java 技术的学习者. 主要包含: Java 基础.容器.多线程.反射.对象拷贝 ...

  6. 合肥Java面试常考题_北大青鸟java 面试--常见面试题(中)

    上一文中,我们总结了java面试的基础,多线程,jvm的常见面试题,本文合肥北大青鸟合工大校区的袁老师继续介绍面试中网络.数据结构和算法.分布式理论和微服务的常见面试题. 一.网络 网络的话,主要集中 ...

  7. 北大java面试,北大青鸟java 面试--常见面试题(下)

    在之前的两篇文章中,我们已经提到了java面试中的常见问题,还有部分内容,合肥北大青鸟合工大校区的袁老师在本文也给出,希望对大家的面试过程有些帮助.这是我总结的最后一部分常见面试题:分别是数据库,基础 ...

  8. Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)

    Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...

  9. Java虚拟机常见面试题

    2019独角兽企业重金招聘Python工程师标准>>> 1.java引用的四种状态 强引用.软引用.弱引用.虚引用. 强引用 new一个Object存放在堆内存,然后用一个引用指向它 ...

最新文章

  1. html 文件、图片、txt 下载 链接和按钮
  2. Windows Azure HandBook (5) Azure混合云解决方案
  3. 现实工程中常用到的C语言函数总结(不断更新)
  4. [转载]基于数据挖掘技术入侵检测系统研究
  5. 吴恩达机器学习Ex1多元回归部分
  6. 13.Java为什么不支持多继承
  7. 个人管理:如何发现自己的兴趣?
  8. 2013递归求解单链表中的结点个数(C++,附递归函数思路讲解与手绘图)
  9. 交叉火力dsp手机调音软件_dsp教程_交叉火力dsp调音教程_教你学dsp百度云
  10. 中信证券java面试_中信证券面试问题分享
  11. 一文了解人工智能——学科介绍、发展史、三大学派
  12. 【Rust日报】 2019-08-05:用Rust重写物联网网关 Part 2: 饮鸩止渴:为什么我们不用C++重写IoT应用...
  13. popupWindow在5.0版本以下不显示的问题
  14. 学习编程,应该从哪里开始学习呢?
  15. 小程序以及h5引入阿里图标不显示最简单解决方案
  16. 第八届蓝桥杯B组国赛总结
  17. 2008ESRI用户大会问答之ArcGIS部分
  18. matlab给图像加网格,matlab把图像进行网格化,或者是在图像中画网格
  19. 图像处理 去模糊 去马赛克 软件
  20. HQChart使用教程68 - 配置DRAWTEXT, DRAWICON, DRAWNUMBER字体大小

热门文章

  1. 【manacher】双倍回文(金牌导航 manacher-2/luogu 4287)
  2. SpringBoot @Async加在实现接口类的非接口方法上获取Bean异常
  3. 两个月拿到N个offer,看看我是如何做到的
  4. 最值得程序员get的30本行业干货
  5. Node.JS第二讲笔记
  6. 第一章数据库系统基础
  7. ❤️ 爆肝一个月!JAVA零基础入门总结(下)❤️
  8. LC67---删除有序链表中重复的元素---牛客---JAVA
  9. SQL注入问题及预防方法
  10. 范式 第一 第二 第三范式