今天在做一个算法时,由于为了和其他人保持接口的数据类型一致,就把之前的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()
以 int 类型返回该 Integer 的值。

指定者:
类 Number 中的 intValue
返回:
转换为 int 类型后该对象表示的数值。

关于更深入的Integer的底层实现,可查看如下博客:http://blog.csdn.net/snail_rao/article/details/7639194

java中两个Integer类型的值相比较的问题的更多相关文章

  1. JAVA中两个int类型的变量在不借助第三个变量的情况下完成值的互换

    在面试中被问到这个问题,想到两种解决方式,在此分享一下. 第一种,使用简单的数学运算达到目标(但是面试官往往会问你还有没有其他方式): public static void main(String[] ...

  2. Java中String转换Double类型 Java小数点后留两位

    Java中String转换Double类型 double num1 = 0.0; String qq = "19.987"; num1 = Double.valueOf(qq.to ...

  3. Java中两个或多个byte数组合并及int类型转数组

    Java中两个或多个byte数组合并及int类型转数组 // 用list好处是可以未知多个? public static byte[] test(List<byte[]> values) ...

  4. java中int和Integer比较

    java中int和Integer比较 一,类型区别 我们知道java中由两种数据类型,即基本类型和对象类型,int就是基本数据类型,而Integer是一个class,也习惯把Integer叫做int的 ...

  5. 【JAVA】详解在JAVA中int与Integer的区别以及背后的原因。

    区别 首先我们要明确,这两点之间有什么区别? 主要有以下几点: 数据类型不同:int是基础数据类型,而 Integer是包装数据类型: 默认值不同:int的默认值是 0,而 Integer的默认值是 ...

  6. java中int,float,long,double取值范围,内存泄露

    java中int,float,long,double取值范围是多少? 写道 public class TestOutOfBound { public static void main(String[] ...

  7. [转] 有关java中两个整数的交换问题

    转载申明:本文主要是用于自己学习使用,为了完善自己的只是框架,没有任何的商业目的. 原文来源:有关Java中两个整数的交换问题 如果侵权,麻烦告之,立刻删除. 在程序开发的过程,要交换两个变量的内容, ...

  8. JAVA 中两种判断输入的是否是数字的方法__正则化_

    JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...

  9. C#中的基元类型、值类型和引用类型

    C# 中的基元类型.值类型和引用类型 1. 基元类型(Primitive Type) 编译器直接支持的类型称为基元类型.基元类型可以直接映射到 FCL 中存在的类型.例如,int a = 10 中的 ...

随机推荐

  1. 错误异常 (1)Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) will not work properly

    [已解决]Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) wil ...

  2. Asp.net mvc项目架构分享系列之架构搭建初步

    copy to:http://www.cnblogs.com/ben121011/p/5014795.html 项目架构各部分解析 Core Models IDAL MSSQLDAL IBLL BLL ...

  3. Android 界面排版的5种方式

    Android布局是应用界面开发的重要一环,在Android中,共有五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对 ...

  4. es2自动发现插件

    https://www.elastic.co/guide/en/elasticsearch/plugins/current/discovery-multicast-usage.html http:// ...

  5. Maximum Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  6. C语言 百炼成钢15

    //题目43:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出 //圈子,问最后留下的是原来第几号的那位. #include<stdio.h> #inclu ...

  7. Oracle11G安装之后

    本人对oracle还处于摸索阶段,今天安装了一下Oracle11G, 安装之后,后台管理端的登录地址:https://172.16.10.75:1158/em 1.使用之前设置的dba管理员密码账号登 ...

  8. OC格式化标准符

    %@       对象     •    %d, %i   整数     •    %u        无符整形     •    %f         浮点/双字     •    %x, %X   ...

  9. 老王Python培训视频教程(价值500元)【基础进阶项目篇 – 完整版】

    老王Python培训视频教程(价值500元)[基础进阶项目篇 – 完整版] 教学大纲python基础篇1-25课时1.虚拟机安装ubuntu开发环境,第一个程序:hello python! (配置开发 ...

  10. Linux 删除文件夹和文件命令

    inux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可.直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字-r 就是 ...