Integer类型值相等或不等分析

转载 2017年01月03日 20:33:07

     看到博客园一位博友写的面试问题,其中一题是 Integer a = 1; Integer b = 1 ; (a == b)?true :false; 当时我一看,这不是明显的true 嘛,  看到评论讨论才知道,对于Integer值比较 有范围规定   。平时都是用equals做比较判断,简单省事。没注意到这些细节。正好趁此机会好好谷歌了一下,以此做个备份。

     用以下代码做测试

 

复制代码
 1      @Test
 2     public void testInteger() {
 3         Integer a = -129;
 4         Integer a1 = -129;
 5         Integer aaa = new Integer(-129);
 6 
 7         Integer aa = -128;
 8         Integer aa1 = -128;
 9 
10         System.out.println("a==a1:" + (a == a1) + "--aa==aa1:" + (aa == aa1)); //   a==a1:false--aa==aa1:true
11         System.out.println("aaa==a1:" + (aaa == a1));        // aaa==a1:false
12         System.out.println("a.equals(a1):" + a.equals(a1));   //  a.equals(a1):true
13 
14         Integer b = 128;
15         Integer b1 = 128;
16         System.out.println("b==b1:" + (b == b1));    // b==b1:false
17         System.out.println("b.equals(b1):" + b.equals(b1));  //  b.equals(b1):true
18 
19         Integer c = 127;
20         Integer cc = 127;
21         Integer d = 1;
22         Integer dd = 1;
23 
24         System.out.println("c==cc:" + (c == cc) + "----d==dd:" + (d == dd));  // c==cc:true----d==dd:true
25         System.out.println("------------");
26 
27         Integer e = 128;
28         int e1 = 128;
29         System.out.println("e == e1:" + (e == e1));  // e == e1:true
30     }
复制代码

      得出的结论是  Integer 类型的值在[-128,127] 期间,Integer 用 “==”是可以的。  为什么会出现这个情况呢,实际上在我们用Integer a = 数字;来赋值的时候Integer这个类是调用的public static Integer valueOf(int i)这个方法。

     

     

     

 

 

        我们来看看ValueOf(int i)的代码,可以发现他对传入参数i做了一个if判断。在-128<=i<=127的时候是直接用的int原始数据类型,而超出了这个范围则是new了一个对象。我们知道”==”符号在比较对象的时候是比较的内存地址,而对于原始数据类型是直接比对的数据值。那么这个问题就解决了。

       还有一点需要注意到 是   Integer e = 128; int e1 = 128;  e == e1:true  而  Integer b = 128; Integer b1 = 128;   b==b1:false   ,e=128 已经大于127了,所以e 是一个对象(new 出来的) 为什么e = e1 是ture , 因为  int为值类型,引用类型Integer与值类型int比较显然比较的是值因为int在堆中是不开辟内存的,他在栈中的值则为他本身的值所以e==e1比较的是他们各自的value, e==e1为true

     总结:Integer 类型的值在[-128,127] 期间,Integer 用 “==”是可以的   , Integer  与 int 类型比较(==)比较的是值。

 

Integer类型值相等或不等分析

看到博客园一位博友写的面试问题,其中一题是 Integer a = 1; Integer b = 1 ; (a == b)?true :false; 当时我一看,这不是明显的true 嘛,  看到评论...
  • WeiWanampDaiXu
  • WeiWanampDaiXu
  • 2017年08月09日 12:58
  • 97

Java Integer和int类型变量的两两相等性比较

这里假设你对Java的基本类型和对应的包装器之间自动拆箱和装箱已经有所了解。但是这里强调一点,自动的拆箱和装箱是编译器在生成类的字节码时插入适当的方法调用来实现的。也就是说,我们可以反编译class文...
  • l294265421
  • l294265421
  • 2015年08月30日 14:35
  • 5872

Integer,new String 判断相等,值传递,以及引用传递的关系。

Integer,new String 判断相等,值传递,以及引用传递的关系。 总结: 1.Integer和String,参数引用的时候都是值传递的。StringBuffer和其他对象就都是...
  • mawming
  • mawming
  • 2016年03月21日 14:01
  • 355

Java常考面试题6 equals相同的对象对于的hashCode是否相等?

equals和hashcode的关系
  • HZ_LIZX
  • HZ_LIZX
  • 2017年02月09日 17:49
  • 1669

Integer类型数据相等问题

今天很奇怪   遇到有时候  Integer类型的数据有时候可以相等,有时候不能相等。   测试才知道有猫腻。 public class TestInteger {     public ...
  • shaowei213
  • shaowei213
  • 2014年09月18日 01:01
  • 2700

Java Integer与int,栈与堆

就是懒!直接给出例子!
  • supertojob
  • supertojob
  • 2014年09月16日 14:50
  • 422

Java面试小知识点:Integer的等与不等

就常量池来说一说Integer这个int的包装类
  • Pa_Java
  • Pa_Java
  • 2015年06月09日 11:23
  • 548

Java为什么两个值相等的对象==比较返回false而两个值相等的不同类型的的基本数据类型返回true

Java为什么两个值相等的对象==比较返回false而两个值相等的不同类型的的基本数据类型返回true...
  • qq_35580883
  • qq_35580883
  • 2017年12月15日 14:17
  • 10113

Integer类型数据相等问题

转载自:http://blog.csdn.net/shaowei213/article/details/39359239 今天很奇怪   遇到有时候  Integer类型的数据有时候可以相等,有时候...
  • aedvance
  • aedvance
  • 2016年07月14日 16:25
  • 235

Integer类型数据相等问题

今天很奇怪   遇到有时候  Integer类型的数据有时候可以相等,有时候不能相等。   测试才知道有猫腻。 public class TestInteger {     public ...
  • lcathm
  • lcathm
  • 2017年03月06日 19:22
  • 151
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Integer类型值相等或不等分析
举报原因:
原因补充:

(最多只允许输入30个字)