java陷阱常见面试题_Java常见陷阱
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公司的其他开发人员这件事,我的印象是现在很难修复它。
翻译自: https://www.javacodegeeks.com/2014/03/common-gotchas-in-java.html
java陷阱常见面试题
java陷阱常见面试题_Java常见陷阱相关推荐
- Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3
Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3 总览 问题 详解 String.intern()的作用 link LeetCode的Two Sum题 ...
- Java基础常见面试题(一)
Java基础常见面试题(一) 1. 为什么说 Java 语言"编译与解释并存"? 我们可以将高级编程语言按照程序的执行方式分为两种: 编译型 :编译型语言会通过编译器将源代码一次性 ...
- Java开发常见面试题详解(JVM)_2
Java开发常见面试题详解(JVM)_2 JVM 问题 详解 JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots link 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认 ...
- Java工程师常见面试题集锦
Java工程师常见面试题集锦(一)互联网人必看!(附答案及视频教程,持续更新) 2019年01月02日 14:01:14 CSDNedu 阅读数:653 大牛也怕面试题,尤其是基础题,在面试中如果出现 ...
- 测试开发java常见面试题_Java常见面试题200+,学习、面试必备
本套Java面试题,选取了企业面试最常问到的问题,可以做为Java工程师的面试宝典,也可以做为想要不断完善和扩充自己 java 技术的学习者. 主要包含: Java 基础.容器.多线程.反射.对象拷贝 ...
- 合肥Java面试常考题_北大青鸟java 面试--常见面试题(中)
上一文中,我们总结了java面试的基础,多线程,jvm的常见面试题,本文合肥北大青鸟合工大校区的袁老师继续介绍面试中网络.数据结构和算法.分布式理论和微服务的常见面试题. 一.网络 网络的话,主要集中 ...
- 北大java面试,北大青鸟java 面试--常见面试题(下)
在之前的两篇文章中,我们已经提到了java面试中的常见问题,还有部分内容,合肥北大青鸟合工大校区的袁老师在本文也给出,希望对大家的面试过程有些帮助.这是我总结的最后一部分常见面试题:分别是数据库,基础 ...
- Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)
Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...
- Java虚拟机常见面试题
2019独角兽企业重金招聘Python工程师标准>>> 1.java引用的四种状态 强引用.软引用.弱引用.虚引用. 强引用 new一个Object存放在堆内存,然后用一个引用指向它 ...
最新文章
- html 文件、图片、txt 下载 链接和按钮
- Windows Azure HandBook (5) Azure混合云解决方案
- 现实工程中常用到的C语言函数总结(不断更新)
- [转载]基于数据挖掘技术入侵检测系统研究
- 吴恩达机器学习Ex1多元回归部分
- 13.Java为什么不支持多继承
- 个人管理:如何发现自己的兴趣?
- 2013递归求解单链表中的结点个数(C++,附递归函数思路讲解与手绘图)
- 交叉火力dsp手机调音软件_dsp教程_交叉火力dsp调音教程_教你学dsp百度云
- 中信证券java面试_中信证券面试问题分享
- 一文了解人工智能——学科介绍、发展史、三大学派
- 【Rust日报】 2019-08-05:用Rust重写物联网网关 Part 2: 饮鸩止渴:为什么我们不用C++重写IoT应用...
- popupWindow在5.0版本以下不显示的问题
- 学习编程,应该从哪里开始学习呢?
- 小程序以及h5引入阿里图标不显示最简单解决方案
- 第八届蓝桥杯B组国赛总结
- 2008ESRI用户大会问答之ArcGIS部分
- matlab给图像加网格,matlab把图像进行网格化,或者是在图像中画网格
- 图像处理 去模糊 去马赛克 软件
- HQChart使用教程68 - 配置DRAWTEXT, DRAWICON, DRAWNUMBER字体大小