首页 > 基础资料 博客日记

奇怪的知识又增加了,为什么"100==100"为true,"1000==1000"为false?

2023-12-20 09:53:11基础资料围观196

Java资料网推荐奇怪的知识又增加了,为什么"100==100"为true,"1000==1000"为false?这篇文章给大家,欢迎收藏Java资料网享受知识的乐趣

今天我想记录一个有趣的问题,为什么在Java中使用相同的整数值时,有时候它们的相等性会产生不同的结果?让我们来一起看看吧!

首先,我们需要了解Java如何处理整数装箱(integer boxing)。在Java中的一些情况下,将一个基本类型转换为封装类类型(例如从int到Integer)被称为boxing,反之被称为 unboxing。具体来说,当我们初始化一个Integer对象时,Java会根据具体情况进行优化,将一些相同的值指向相同的对象。在本例中,范围在-128到127之内的整数都被认为是常量池中的对象。因此,当我们声明和初始化a和b时,它们都被赋予了100,它们将指向常量池中的同一个对象。因此,使用“==”运算符比较两个对象时,它们将被认为是相同的。

Integer a  = 100;
Integer b = 100;
System.out.println("a==b为"+(a==b));

image

但是如果我们试着比较c和d的值,为什么它们被认为不相等呢?这是因为范围在-128到127之外的整数不会像在范围内的那些整数一样被放入常量池中。所以我们不会得到指向同一个对象的结果。在本例中,c和d都是超出Integer对象常量池的范围的,因此它们指向不同的对象。尽管它们的值相等,但它们在内存中的位置不同。因此,使用“==”运算符比较两个对象时,它们将被认为是不同的。

Integer c = 1000;
		Integer d = 1000;
		System.out.println("c=b为"+(c==d));

image

现在知道了这个问题的原因,但这对我们有什么影响呢?这个问题意味着我们不能使用“==”运算符来比较两个Integer对象,而应该使用equals()方法。当我们使用equals()方法时,它将比较对象的值,而不是它们的引用,因此无论值在内存中的位置如何,它们将被认为是相等的。这在需要比较Integer对象时非常重要,因为我们不想被内存优化而误导我们得出错误的结果。

Integer c = 1000;
Integer d = 1000;

System.out.println("c=b为"+(c==d));
System.out.println("c.equals(d)为"+c.equals(d));

image

好吧,我想这就是我们今天的讨论了,我希望这篇文章能够帮助你更好地理解Java如何处理整数装箱,以及为什么我们应该注意使用equals()方法而不是“==”运算符。


文章来源:https://www.cnblogs.com/ilky/p/17915819.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

上一篇:玩转Spring状态机
下一篇:01Java语言概述

相关文章

本站推荐

标签云