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上经常造成混乱。

我曾问过甲骨文公司的其他开发人员有关此问题,我的印象是现在很难修复它。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python高阶函数介绍_python高级特性和高阶函数及使用详解

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

会计专业计算机技能大赛,会计技能大赛策划

会计技能大赛策划一.活动背景会计是一个基于理论和实践相结合的学科,对于经管学院,会计专业是一个新创建的专业,缺少相应的会计实践。作为会计专业的学生,在不断学习理论的同时,我们更应该加强实践操作能力…

MySQL中查询获取每个班级成绩前三名的学生信息

CREATE TABLE t_testscore( pk_id INT PRIMARY KEY, c_name VARCHAR(50) , c_score INT, c_class INT )DEFAULT CHARSETutf8;INSERT INTO t_testscore VALUES (1, 张三6, 66, 1),(2, 张三5, 65, 1),(3, 张三4, 64, 1), (4, 张三3, 63, 1),(5, 张三2, 62, 1);INSERT…

vue自定义指令clickoutside扩展--多个元素的并集作为inside

都是个人理解,如果发现错误,恳请大家批评指正,谢谢。还有我说的会比较啰嗦,因为是以自身菜鸡水平的视角来记录学习理解的过程,见谅。 1.前言 产品使用vueelement作为前端框架。在功能开发过程中,难免遇到使…

35个让人惊讶的 CSS3 动画效果演示

本文收集了35个惊人的 CSS3 动画演示,它们将证明 CSS3 Transform 和 Transition 属性的强大能力。CSS 是网页设计非常重要的一部分,随着越来越多的浏览器对 CSS3 支持的不断完善,设计师和开发者们有了更多的选择。如今,用纯 CSS 就…

可选类型API

Java 8引入了Optional类。 简而言之,不是返回null,而是检查null,而是返回Optional实例,该实例可以设置或不设置值。 这样,您就不会因NullPointerException而失败。 我不会讨论Optional类型是否会完全消除NPE&#xff…

计算机社团活动丰富多彩,描写社团丰富多彩的句子

我们学校的社团活动真是丰富多彩用这个句子开头试着写一段话感恩生命,感谢她给予我们丰富的感情。喜怒哀乐,悲思忧惧,洒洒脱脱,原原本本,痛快淋漓,无拘无束;喜而笑,怒而吼&#xff0…

宝元系统u盘使用说明_教你如何使用U盘安装电脑系统

①到老毛桃官网首页下载老毛桃UEFI版u盘启动盘制作工具安装到电脑上;②准备一个容量在4G以上并能够正常使用的u盘。1第一步将u盘插入电脑usb接口,程序会自动扫描,我们只需在下拉列表中选择用于制作的u盘,然后点击“一键制作”按钮…

IP通信基础 4月1日

广域网数据链路控制规程 1.面向字符型传输规程 2.面向比特型传输规程 面向比特型传输规程分析 帧 标志字段F 地址字段A 控制字段C 信息字段TNFO 帧检验序列FCS 标志字段F 1Byte 1Byte 1Byte 可变长 2Byte 1Byte…

输入人民币/美元后自动判断,输出转换后相对应的值

1 2 作者:pasaulis3 版本:v2.04 日期:2018.11.75 功能:输入人民币/美元后自动判断,输出转换后相对应的值6 7 in_str_valueinput(请输入人民币/美元金额(格式示例:100rmb/100usd))9 u…

支持在iPad中播放的HTML5视频网站推荐

YouTube是最早支持HTML5视频的网站,随着iPad等平板电脑的流行,越来越多的视频网站开始支持HTML5视频播放。下面就向大家分享一些国内的HTML5视频网站,是根据网上信息整理而成,欢迎大家反馈和推荐更多的HTML5视频网站。 腾讯 优酷…

自定义Log4j 2.0

我们越来越接近Log4j 2 GA版本,因此,我们应该开始研究它会给我们带来什么。 我个人有很多理由对Log4j 2.0感到兴奋。 社区很棒,Apache许可证给了我很多自由,最后它受到Apache软件基金会的保护。 嘿,这是一个很棒的软件…

计算机斐波那流程图,循环结构——斐波那契数列.DOC

循环结构——斐波那契数列循环结构——斐波那契数列1.教学目标根据新课标的要求和学生的认知特点,确定本节课的教学目标。(1)知识与技能学生能理解循环结构概念;把握循环结构的三要素:循环的初始状态、循环体、循环的终止条件&…

为什么用链路聚合_H3C ComwareV7平台网络设备可靠性配置——链路聚合

H3C ComwareV7平台网络设备可靠性配置——链路聚合链路聚合简介:链路聚合是通过多个物理接口(通常指以太网接口,串口只在特定场景且与以太网聚合技术等同故不再赘述)捆绑实现的逻辑接口,而这些被捆绑在一起的以太网接口就称为该聚合组的成员端…

用php实现一个双向队列

队列是一种线性表,按照先进先出的原则进行 单向队列:只能从头进,从尾出 双向队列:头尾都可以进出 class DuiLie { private $array array();//声明空数组 public function setFirst($item){ //array_unshift() 函数用于向数组插入…

idea+maven+ssm搭建boot_crm项目遇到的问题

使用ideamavenssm搭建一个boot_crm项目,遇到的问题如下: 1.环境搭建好了,相关配置文件都配置好了,也部署到了tomcat,但是无法启动首页。 通过百度,google找到了,原因是web.xml文件出了问题&…

大型计算机变形,计算机变形病毒的主要特征和发展趋势

计算机变形病毒的主要特征和发展趋势计算机病毒具有一些基本的特性,这些基本特性主要指的是病毒的传染性、破坏性、恶作剧等,这是普通病毒所具备的基本特性,而能用变化自身代码和形状来对抗反病毒手段的变形病毒才是下一代病毒首要的基本特征…

Redis与Jedis排序

在本文中,我们将讨论Redis SORT命令。 Redis提供了SORT命令,我们可以使用该命令从LIST,SET或ZSET中检索或存储排序的值。 我们可以使用最简单的形式在KEY上使用命令,如下例所示: SORT numbers_list这将对键中包含的…

获取 HTML5 网页设计灵感的10个网站推荐

这篇文章向大家推荐10个收集 HTML5 网页作品的网站,让大家感受一下 HTML5 的魅力。作为下一代网页标准,HTML5 增加了很多新标签以及新特性,正引领网页技术革命。希望这些优秀的 HTML5 网页案例能带给大家制作 HTML5 网页的灵感。 HTML5 Gall…

postgresql存图片字段类型_PostgreSQL让人着迷的多态性,另辟蹊径省时又省力

PostgreSQL 让人着迷的地方,不在于他比某些数据库的流行,也不在于比某些数据库的高“贵”, 更不如某些数据库的“简单”。Postgresql 让人无法自拔的是他的”多端变化”, 用开发的角度来说,叫多态性。PG本身支持着太多…