`

Integer == Integer?

 
阅读更多
Integer == Integer?

/** 
 *Q:Integer和Integer对象用  == 进行比较的过程是怎样的? 
 * 
 *看例子 
 */  
public class Test {  
  
    public static void main(String[] args) {  
        int a = 1;  
        int b = 1;  
        Integer c = 3;  
        Integer d = 3;  
        Integer e = 321;  
        Integer f = 321;  
  
        System.out.println(a == b);  
        System.out.println(c == d);  
        System.out.println(e == f);  
  
    }  
}  
output:  
true  
true  
false  
  
下面具体解释三个结果  
通过java命令   javap -c 得到下面的字节码  
  
 Compiled from "Test.java"  
public class Test extends java.lang.Object{  
public Test();  
  Code:  
   0:   aload_0  
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V  
   4:   return  
  
public static void main(java.lang.String[]);  
  Code:  
   0:   iconst_1  //将int类型常量1压入栈   
   1:   istore_1  //将int类型值存入局部变量1  
   2:   iconst_1  //将int类型常量1压入栈  
   3:   istore_2  //将int类型值存入局部变量2  
   4:   iconst_3  //将int类型常量3压入栈  
   5:   invokestatic    #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; //调用Integer的静态方法 valueOf,构建整型值为3的Integer对象  
   8:   astore_3  //将引用存入局部变量3  
   9:   iconst_3  
   10:  invokestatic    #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  
   13:  astore  4  
   15:  sipush  321  //将321压入栈  
   18:  invokestatic    #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  
   21:  astore  5  
   23:  sipush  321  
   26:  invokestatic    #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  
   29:  astore  6  
   31:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;  
   34:  iload_1   //从局部变量1中装载int类型值到栈  
   35:  iload_2  
   36:  if_icmpne       43  //从栈中pop出两个int类型值并进行大小比较  
   39:  iconst_1  
   40:  goto    44  
   43:  iconst_0  
   44:  invokevirtual   #4; //Method java/io/PrintStream.println:(Z)V  
   47:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;  
   50:  aload_3   //从局部变量3中装载引用到栈  
   51:  aload   4  
   53:  if_acmpne       60   //从栈中pop出两个引用值进行比较  
   56:  iconst_1  
   57:  goto    61  
   60:  iconst_0  
   61:  invokevirtual   #4; //Method java/io/PrintStream.println:(Z)V  
   64:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;  
   67:  aload   5  
   69:  aload   6  
   71:  if_acmpne       78  
   74:  iconst_1  
   75:  goto    79  
   78:  iconst_0  
   79:  invokevirtual   #4; //Method java/io/PrintStream.println:(Z)V  
   82:  return  
  
}  
  
  
整型值的比较很容易理解,就是值的大小比较  
  
但是为什么下面的语句会是不同的结果:  
  
        System.out.println(c == d);  
        System.out.println(e == f);  
  
从字节码上看都是一样的指令,没有不同的地方  
原因就在Integer的方法 valueOf  
  
我们来看这个方法的源码:字节码里调用的就是这个方法:   
  
 public static Integer valueOf(int i) {  
        if(i >= -128 && i <= IntegerCache.high)  
            return IntegerCache.cache[i + 128];  
        else  
            return new Integer(i);  
    }  
  
private static class IntegerCache {  
        static final int high;  
        static final Integer cache[];  
  
        static {  
            final int low = -128;  
  
            // high value may be configured by property  
            int h = 127;  
            if (integerCacheHighPropValue != null) {  
                // Use Long.decode here to avoid invoking methods that  
                // require Integer's autoboxing cache to be initialized  
                int i = Long.decode(integerCacheHighPropValue).intValue();  
                i = Math.max(i, 127);  
                // Maximum array size is Integer.MAX_VALUE  
                h = Math.min(i, Integer.MAX_VALUE - -low);  
            }  
            high = h;  
  
            cache = new Integer[(high - low) + 1];  
            int j = low;  
            for(int k = 0; k < cache.length; k++)  
                cache[k] = new Integer(j++);  
        }  
  
        private IntegerCache() {}  
    }  
  
Integer里弄了一个缓存,对于在 -128—127 之间的数值,会直接使用该缓存里的对象  
 也就是说 Integer c = 3 或者 Integer c = Integer.valueOf(3) ,最终 c 得到的是Integer里的缓存对象  
 同理,d也是获得该相同对象因此 进行 c == d 比较时,c和d引用的是同一个对象,因此就true  
 而对于321,已经超出缓存范围了,因此 valueOf 方法会生成一个新的Integer对象因此e和f就引用不同 的对象了,进行==比较,当然就false了  
 另外,对Integer的缓存,我们在日常开发时,对于小的整型值应该充分利用Integer的缓存对象省去过多的对象创建,回收的操作,这样会极大的提高程序性能  
分享到:
评论

相关推荐

    JAVA Integer == equal 比较 doc 比较大小 是否相等

    JAVA 中的 Integer 比较 在 Java 中,我们经常需要比较两个 Integer 对象是否相等,但是在使用 "==" 运算符时,可能会出现一些意外的结果。本文将深入探讨 Java 中的 Integer 比较,了解为什么使用 "==" 运算符可能...

    Add Digits

    一个给定的正整数,循环的将每一位相加,只要得到的结果是大于10的数,就继续循环相加

    考勤机接口调用(POs收费机)汇多

    /此公用文件主要是对考勤机操作, 如果对收费机操作则可参考此文件定义结构即可. unit uPublic; interface Uses Windows , SysUtils , QForms , StdCtrls ,... function GetSizeOfData(pCommand: Pointer): Integer...

    VB Socket 异步通信框架代码.rar

     Public Const SFJ_Pro_SegmentLength As Integer = 1024  '数据包的数据长度部分占字节位数  Public Const SFJ_Pro_Packet_DataLen_Byte_Num As Integer = 8  '数据包的数据类型部分占字节位数  Public ...

    vb.net初学者系列【算术运算符号】

    Dim exponent As Integer = 3 Dim result As Double = base ^ exponent Console.WriteLine(result) ' 输出 8 ``` 注意:虽然表格中标记为“∧”,但实际上在VB.NET中使用的符号是“^”。 #### 二、取负运算符(-)...

    bigdecimal转integer.docx

    在 Java 编程中,`BigDecimal` 和 `Integer` 是两个不同类型的数值表示。`BigDecimal` 用于处理精确的浮点数运算,适合财务或金融计算,因为它可以避免浮点数计算中的精度问题。而 `Integer` 是 Java 中的整数类型,...

    Integer创建对象

    对象池在`Integer`类中以内部类`IntegerCache`的形式存在,它是一个预先创建的`Integer`对象数组,数组长度为256,范围从-128到127。 这个对象池的存在是因为对于小整数(-128到127之间),`Integer`对象通常会被...

    FYOwnFrame (自定义对话框)

    ShowType:Integer=SB_OK;ShowIcon:integer=1;ShowTime:Integer=-1): Integer; Text//显示内容 Caption//显示的标题 OptionText//下拉框的内容,若没有可不填 ShowType//显示的类型:SB_OK确定 SB_OKCANCEL确定...

    mybatis返回Integer

    在使用MyBatis进行数据操作时,我们经常会遇到关于返回值类型的困扰,特别是涉及到基本类型int和对象类型Integer之间的转换。标题"mybatis返回Integer"指的是在MyBatis的映射文件或者Mapper接口中,使用Integer作为...

    在vb.net里如何实现2进制计算器程序代码?用完整示例.txt

    Dim decNum1 As Integer = Convert.ToInt32(num1, 2) Dim decNum2 As Integer = Convert.ToInt32(num2, 2) ' 根据按钮选择进行不同的运算 ' If RadioButton1.Checked Then ' 加法运算 ' Dim result As ...

    动态创建菜单、树

    integer width = 1381 integer height = 620 boolean titlebar = true string title = "Untitled" boolean controlmenu = true windowtype windowtype = response! long backcolor = 67108864 string icon = "App...

    VB.code.image.blur.rar_VB模糊_blur

    Dim r As Integer = 0, g As Integer = 0, b As Integer = 0, count As Integer = 0 For i As Integer = -radius To radius For j As Integer = -radius To radius If (x + i &gt;= 0 AndAlso x + i ...

    用VHDL语言编写的VGA显示彩条

    constant h_data: integer:=640; constant h_front: integer:=16; constant h_back: integer:=48; constant h_sync: integer:=96; constant h_period: integer:= h_sync + h_data + h_front + h_back; -- ...

    vbxincolor_visualbasic_

    Dim gray As Integer = CInt(0.21 * red + 0.72 * green + 0.07 * blue) ' 设置新图像的像素为灰度值 grayImage.SetPixel(x, y, Color.FromArgb(gray, gray, gray)) Next Next ' 显示或保存转换后的灰度图像...

    VB模拟扫雷代码

    Sub RevealCell(row As Integer, col As Integer) If minefield(row, col) = 1 Then ' 如果是雷,则游戏结束 GameOver() Else Dim mineCount As Integer = 0 For r As Integer = row - 1 To row + 1 For c As ...

    Mybatis Generator将tinyint映射成Integer的解决办法.pdf

    在使用MyBatis Generator生成Java DAO层代码时,可能会遇到将数据库中的tinyint类型映射成Integer类型的问题。这个问题在上述描述中得到了详细的解释。首先,我们来看一下问题的背景和原因。 在Java环境中,使用...

    bresenham算法画直线

    Dim x0 As Integer = 10, y0 As Integer = 10 Dim x1 As Integer = 100, y1 As Integer = 80 ' 调整起点和终点坐标,确保x0 &lt;= x1 If x0 &gt; x1 Then Dim temp As Integer = x0 x0 = x1 x1 = temp temp = y0 y0...

    vb图像显示和简单处理

    Dim pixel(,) As Integer = img.LockBits(New Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb) '定义滤波器大小,比如3x3 For x As Integer = filterSize To width - filter...

    JAVA-int和Integer的区别1.zip

    在Java编程语言中,`int`和`Integer`都是用于表示整数值的数据类型,但它们之间存在着显著的差异。理解这些区别对于编写高效且优化的Java代码至关重要。 首先,`int`是Java中的原始数据类型之一,它直接存储在栈...

    vb.net做的俄罗斯方块

    Public Const Width As Integer = 16 '声明一个整数常量Height,表示游戏界面横向的小正方形数目,初始化为30 Public Const Height As Integer = 30 '游戏界面的背景色 Public Shared BackColor As Color '小...

Global site tag (gtag.js) - Google Analytics