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 中的 ...
随机推荐
- Android service ( 二) 远程服务
通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的service.在android平台中,一个进程通常不能访问其他进程中的内存 ...
- css继承性和不继承的属性。
在CSS中并不是所有的属性都是能够继承的,因此在使用时一定要了解哪些是能够继承的哪些是不能够继承的.visibility和cursor能够被所有元素继承:letter-spacing,word-spa ...
- MVC ajaxSubmit上传图片
注意事项: 1.提交form,必须引用jquery.form.min.js 2.不要使用mvc自带的Ajax.Form() 1.页面cshtml <form name="frmInpu ...
- C语言 指针与字符串
C语言可以在栈区 or 堆区 or 全局区 存放字符串,字符串不单单是存储在全局区的. //字符串与指针 #include<stdio.h> #include<stdlib.h> ...
- MSMQ消息队列安装
一.Windows 7安装.管理消息队列1.安装消息队列 执行用户必须要有本地 Administrators 组中的成员身份,或等效身份. 具体步骤: 开始—>控制面板—>程 ...
- 办公软件Office PPT 2010视频教程从入门到精通系列教程(22课时)
办公软件Office PPT 2010视频教程从入门到精通系列教程(22课时) 乔布斯的成功离不开美轮美奂的幻灯片效果,一个成功的商务人士.部门经理也少不了各种各样的PPT幻灯片.绿色资源网给你提供了 ...
- Linux常用指令---系统管理
四.linux服务器" [have no space]"开发机dev2上不管是upa/upc上传文件时,会挂载在/目录下,而此时这里只有3G空间,通过df -h显示各大挂载点使用情 ...
- python机器学习《入门》
写在前面的废话: 好吧,不得不说鱼C的markdown文本编辑器挺不错的,功能齐全.再次感谢小甲鱼哥哥的python视频让我去年大三下学期的时候入门了编程,爱上了编程这门语言,由于是偏冷门的统计学,在 ...
- Sonatype Nexus高级配置
Sonatype Nexus的安装配置参见:CentOS系统中安装Nexus并导入已有的构件库.Nexus内置了Jetty容器,${NEXUS_HOME}/bin/jsw目录下包含了各个操作系统的启动 ...
- El Capitan 中 SIP 介绍
http://havee.me/mac/2015-10/system-integrity-protection-on-el-capitan.html 这两天大家纷纷将 OS X 系统升级到了 El C ...