`

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 == equal 比较 doc 比较大小 是否相等

    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 ...

    FYOwnFrame (自定义对话框)

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

    动态创建菜单、树

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

    用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; -- ...

    vb.net做的俄罗斯方块

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

    integer:验证值是否为整数

    var isInteger = require ( 'validate.io-integer' ) ; isInteger( 值 ) 验证值是否为integer 。 var value = 5 ; var bool = isInteger ( value ) ; // returns true 注意:此方法在确定value是否为integer...

    HugeInteger大整数计数器作业

    HugeInteger Class) Create a class HugeInteger that uses a 40-element array of digits to store integers as large as 40 digits each. Provide member functions input, output, add and subtract. For ...

    vb 2008 求逆矩阵 数组

    For y As Integer = 0 To j For x As Integer = 0 To i If value(x, y) &lt;&gt; 0 Then '如果存在一个非零值,则终止本行判断,继续下一行的判断 flag = False Exit For End If Next If flag Then '如果某行全为...

    类似QQ,MSN的窗口震动效果

    property XStrength: Integer read FXStrength write SetXStrength; property YStrength: Integer read FYStrength write SetYStrength; end; procedure Shake(valForm: TCustomForm; valXStrength: Integer = 4...

    景兴达门禁

    port: integer): integer;, 如果有绑定端口,下次软件先启动机器后启动也一样可以用 如果没绑定端口,必须保证机器先启动,软件后启动 3、设置服务器function JX102R_Set_Server(Ip: pchar; Port: integer = ...

    [C++][New]大数Integer类

    由于使用模板,所以只有一个Integer.h头文件 支持如下操作:&gt;, &gt;=, &lt;, &lt;=, ==, !=, +, +=, -, -=, *, =, /, /=,(输出);支持利用基本整数类型(int,unsigned,long long,……)和字符串(char和std::string)构造类型

    经典游戏 2048 单机

    Dim LINE_WIDTH As Integer = 5 '线宽 Dim LINE_MOVES As Integer '线宽调整数 Dim CELL_WIDTH As Integer = 50 '格子宽 Dim TOP_ As Integer = 120 '矩阵左上角纵坐标 Dim LEFT_ As Integer = 50 '矩阵左上角...

    Transform Coding with Integer-to-Integer Transforms.pdf

    Transform Coding with Integer-to-Integer Transforms.pdf H.264學習資料

    免费QRcode组件,效果很好

    Qrcode delphi c++ C# 找了很久,在国外网站找到绝对能用的QRcode生成代码,需要Dll,效果很好 { Summary ... Margin : integer = 4; PixelSize : integer = 3; Level : TErrorCorretion = QualityLow);

    用st控件来做spliter分割条

    Integer ii_barwidth = -1 // Default to negative value. long il_barcolor=78682240 long il_barmovecolor=8421504 integer ii_minobjectsize = 20 boolean ib_performredraw=True //-- Internal ...

    分享Str2Bin.txt

    Public Function StringToBinary(data As String, line As Integer) As String Dim sb As New StringBuilder() For i As Integer = 0 To data.Length - 1 If i Mod line = 0 Then If i &lt;&gt; 0 Then For ...

    Clock_Integer 指令库应用例程.rar

    Clock_Integer 指令库应用例程rar,Clock_Integer 指令库应用例程

Global site tag (gtag.js) - Google Analytics