java中两个Integer类型的值相比较的问题
今天在做一个算法时,由于为了和其他人保持接口的数据类型一致,就把之前的int换为Integer,前几天测了几组数据,和之前的结果一样,但是今天在测其它数据
的时候,突然出现了一个奇怪的bug,由于之前我的模块所有的数据(就是当时数据类型还是int)都测过,这个算法整体由三个所写的模块构成(包括我在内),所以其他
两位同伴都去检测各自的模块,但是后来发现是我传出来的数据有点问题,当时我也是百思不得其解,就一路打断点,加肉眼查看数据,后来终于发现是两个Integer类型的
值在本应该相等的地方进入相等体系中的逻辑,但却进入了不相等的逻辑流程中,这两个数是412(Integer),然后当时我就直接将一侧的Integer直接换成412后,就可以
进入相等的逻辑中,将另一侧换成Integer后,也可以进入相等的逻辑。
下面以一个例子看一下:
package intAndInteger;
public class test {
public static void main(String[] args) {
// 两个new出来的Integer类型的数据比较,
//相当于把new出来的地址作比较
Integer a0 = new Integer(1);// 普通的堆中对象
Integer b0 = new Integer(1);
System.out.println("new出来的 " + "a0==b0 :" + (a0 == b0));
System.out.println(a0);
// 调用intValue方法得到其int值
System.out.println("调用intValue " + "a0.intValue() == b0.intValue()" +
(a0.intValue() == b0.intValue()));
// 把Integer类型的变量拆箱成int类型
int c = 1;
System.out.println("将Integer自动拆箱 " + "a0==c: " + (a0 == c));
// 其实也是内存地址的比较
Integer a1 = 30; // 自动装箱,如果在-128到127之间,则值存在常量池中
Integer b1 = 30;
System.out.println("直接赋值的两个Integer的比较" +
"a2 == b2: "+ (a1 == b1));
Integer a2 = 30;
Integer b2 = 40;
System.out.println("直接赋值的两个Integer的比较 " +
"a6==b6: " + (a2 == b2));
Integer a3 = 128;
Integer b3 = 128;
System.out.println("直接赋值的两个Integer的比较 " +
"a5 == b5: " + (a3 == b3));
Integer a4 = 412;
Integer b4 = 412;
System.out.println("直接赋值的两个Integer的比较 " +
"a4 == b4: " + (a4 == b4));
// 从这里看出,当给Integer直接赋值时,
//如果在-128到127之间相等的话,它们会共用一块内存
// 而超过这个范围,则对应的Integer对象有多少个就开辟多少个
System.out.println("调用intValue " + "a4.intValue() == b4.intValue(): "
+ (a4.intValue() == b4.intValue()));
}
}
在JDK1.8.0下运行可得:
new出来的 a0==b0 :false
1
调用intValue a0.intValue() == b0.intValue()true
将Integer自动拆箱 a0==c: true
直接赋值的两个Integer的比较a2 == b2: true
直接赋值的两个Integer的比较 a6==b6: false
直接赋值的两个Integer的比较 a5 == b5: false
直接赋值的两个Integer的比较 a4 == b4: false
调用intValue a4.intValue() == b4.intValue(): true
综上:在用两个Integer对象比较数值的话,如果是整型值的话最好调用intValue方法来得到一个int类型的值,当然也可将其转变为
float(floatValue),double(longValue)类型来比较。
在JDK API 1.6.0中文版中是这样介绍intValue的,
intValue
public int intValue()
关于更深入的Integer的底层实现,可查看如下博客:http://blog.csdn.net/snail_rao/article/details/7639194
java中两个Integer类型的值相比较的问题的更多相关文章
- JAVA中两个int类型的变量在不借助第三个变量的情况下完成值的互换
在面试中被问到这个问题,想到两种解决方式,在此分享一下. 第一种,使用简单的数学运算达到目标(但是面试官往往会问你还有没有其他方式): public static void main(String[] ...
- Java中String转换Double类型 Java小数点后留两位
Java中String转换Double类型 double num1 = 0.0; String qq = "19.987"; num1 = Double.valueOf(qq.to ...
- Java中两个或多个byte数组合并及int类型转数组
Java中两个或多个byte数组合并及int类型转数组 // 用list好处是可以未知多个? public static byte[] test(List<byte[]> values) ...
- java中int和Integer比较
java中int和Integer比较 一,类型区别 我们知道java中由两种数据类型,即基本类型和对象类型,int就是基本数据类型,而Integer是一个class,也习惯把Integer叫做int的 ...
- 【JAVA】详解在JAVA中int与Integer的区别以及背后的原因。
区别 首先我们要明确,这两点之间有什么区别? 主要有以下几点: 数据类型不同:int是基础数据类型,而 Integer是包装数据类型: 默认值不同:int的默认值是 0,而 Integer的默认值是 ...
- java中int,float,long,double取值范围,内存泄露
java中int,float,long,double取值范围是多少? 写道 public class TestOutOfBound { public static void main(String[] ...
- [转] 有关java中两个整数的交换问题
转载申明:本文主要是用于自己学习使用,为了完善自己的只是框架,没有任何的商业目的. 原文来源:有关Java中两个整数的交换问题 如果侵权,麻烦告之,立刻删除. 在程序开发的过程,要交换两个变量的内容, ...
- JAVA 中两种判断输入的是否是数字的方法__正则化_
JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...
- C#中的基元类型、值类型和引用类型
C# 中的基元类型.值类型和引用类型 1. 基元类型(Primitive Type) 编译器直接支持的类型称为基元类型.基元类型可以直接映射到 FCL 中存在的类型.例如,int a = 10 中的 ...
随机推荐
- SQLite 解决:Could not load file or assembly 'System.Data.SQLite ... 试图加载格式不正确的程序/or one of its dependencies. 找不到指定的模块。
Could not load file or assembly 'System.Data.SQLite.dll' or one of its dependencies. 找不到指定的模块. 错误提示 ...
- .Net core Linux环境安装
10月份的时候在自己电脑上搭了开发环境,当时跑完Welcome后就搁置了一段时间,最近有一个小项目要正式采用core来开发并部署在linux环境下,于是在Linux上也搭建一个运行环境. 虽然不经常使 ...
- 2703 奶牛代理商 XII
2703 奶牛代理商 XII 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 小徐从美国回来后,成为了USAC ...
- 013医疗项目-模块一:加入工具类ResultUtil
这篇文章要做的就是优化,封装.把之前的代码尽量封装进类,并且不要硬编码. 在UserServiceimpl中的insertSysuser()函数之前是这么写的: ResultInfo resultIn ...
- HTML语义化之常见模块
用合理的HTML标记以及特有的属性去格式化文档内容. 浏览器会根据标签的语义给定一个默认的样式. 判断网页标签语义是否良好的一个简单方法就是:去掉样式,看网页结构是否组织良好有序,是否仍然有很好的可读 ...
- [CareerCup] 1.7 Set Matrix Zeroes 矩阵赋零
1.7 Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column are ...
- Linux第十一次学习笔记
异常控制流 异常控制流(ECF)发生在计算机系统的各个层次 在硬件层,硬件检测到的事件会触发控制突然转移到异常处理程序. 在操作系统层,内核通过上下文转换将控制从一个用户进程转移到另一个用户进程. 在 ...
- FPGA学习之基本结构
如何学习FPGA中提到第一步:学习.了解FPGA结构,FPGA到底是什么东西,芯片里面有什么,不要开始就拿个开发板照着别人的东西去编程.既然要开始学习FPGA,那么就应该从其基本结构开始.以下内容是我 ...
- Android技能杂谈——如何优雅的处理控件的点击事件
首先分享一个最佳实践: 大家开发复杂一些的Android应用的时候常常会写一个BaseActivity或者BaseFragment,里面写上一些基本而公用的方法,比如监听网络状况.弹出对话框.设置ac ...
- ASP.NET MVC系列 框架搭建(一)之仓储层的搭建
大神勿喷,小神默默学. 会了就是不值一提的东西,不会就是绝对的高大上. 最后上传源码.希望能给读者带来一些新的认识及知识. 还没上过头条..各位大神,请点支持一下小弟. 陆续更新.更新到你会为止!! ...