`
lanhuidong
  • 浏览: 227587 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Integer之==

    博客分类:
  • Java
阅读更多
package lan; 

public class Test { 
        public static void main(String[] args) { 
       	 Integer i1 = 4; 
       	 Integer i2 = 4; 
       	 System.out.println(i1 == i2); 
        } 
} 

当i1、i2的值在-128~127之间时,输出true,否则为false。

java language specification-3.0 写道
If p is a value of type int, then boxing conversion converts p into a reference r of class and type Integer, such that r.intValue() == p
If the value p being boxed is true, false, a byte, a char in the range \u0000 to \u007f, or an int or short number between -128 and 127, then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.

在命令行通过JDK自带的反汇编工具javap对.class文件进行反汇编:javap -c Test

Compiled from "Test.java"
public class lan.Test extends java.lang.Object{
public lan.Test();
  Code:
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_4
   1:   invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   4:   astore_1
   5:   iconst_4
   6:   invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   9:   astore_2
   10:  getstatic       #22; //Field java/lang/System.out:Ljava/io/PrintStream;
   13:  aload_1
   14:  aload_2
   15:  if_acmpne       22
   18:  iconst_1
   19:  goto    23
   22:  iconst_0
   23:  invokevirtual   #28; //Method java/io/PrintStream.println:(Z)V
   26:  return

}

 可以看出Integer i = 4实际上就是 Integer i = Integer.valueOf(4);于是查看JDK源代码:

 public static Integer valueOf(int i) {
	final int offset = 128;
	if (i >= -128 && i <= 127) { // must cache 
	    return IntegerCache.cache[i + offset];
	}
        return new Integer(i);
    }

 

 private static class IntegerCache {
	private IntegerCache(){}

	static final Integer cache[] = new Integer[-(-128) + 127 + 1];

	static {
	    for(int i = 0; i < cache.length; i++)
		cache[i] = new Integer(i - 128);
	}
    }

 

从上面两段代码可以看出Integer i = x(x为-128~127之间的数),返回的是同一个对象的引用,只有超出这个范围才会重新创建一个Intger对象。因此也就解释了前面的现象。

分享到:
评论

相关推荐

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

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

    Integer创建对象

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

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

    动态创建菜单、树

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

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

    Java中int和Integer的区别.doc

    Java 中 int 和 Integer 的区别 Java 中的数据类型可以分为基本数据类型和复杂数据类型,int 是基本类型,而 Integer 是一个类。下面是它们之间的主要区别: 1. 数据类型 int 是基本数据类型,直接存储数值,而 ...

    bigdecimal转integer.docx

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

    java包装类练习.doc

    Integer i = new Integer(xxx) 和 Integer i = xxx 的区别在于,前者创建了一个新的对象,而后者可能会从常量池中返回该对象的引用。如果 xxx 的值在 -128 到 127 之间,那么 Integer i = xxx;就可能会从常量池中...

    JAVA-int和Integer的区别1.zip

    首先,`int`是Java中的原始数据类型之一,它直接存储在栈(stack)中,无需额外的对象开销。`int`可以存储从-2^31到2^31-1(即-2,147,483,648到2,147,483,647)之间的整数值。由于它是原始类型,因此`int`变量的赋值...

    Java中int和Integer的区别.doc.doc

    Java 中 int 和 Integer 的区别 在 Java 编程语言中,int 和 Integer 是两种不同的数据类型,虽然它们看起来很相似,但它们有着根本的区别。下面我们将详细探讨这两种数据类型的差异。 基本类型 vs 复杂数据类型 ...

    Add Digits

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

    JAVA-int和Integer的区别

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

    基于cyclone2 FPGA设计的VGA显示Quartus工程VHDL源码+文档说明.rar

    基于cyclone2 FPGA设计的VGA显示飞机小游戏Quartus工程源码+文档说明 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;...-- life_enemy:in integer

    Java中的==和equals区别

    Integer x = new Integer(5); Integer y = new Integer(5); System.out.println(x == y); // 输出 false,因为x和y指向不同的对象实例 ``` #### `equals` 方法 `equals`方法是`Object`类的一个成员方法,用于比较...

    JAVA中Integer值的范围实例代码

    JAVA 中 Integer 值的范围实例代码解析 在 Java 中,Integer 是一个非常重要的类,用于表示整数值。然而,Integer 的值范围是有限制的,这篇文章将会详细介绍 Java 中 Integer 值的范围实例代码。 首先,让我们来...

    Integer类的使用方法

    ### Integer类的使用方法详解 在Java编程语言中,`Integer`类是一个非常重要的封装类,它用于将基本数据类型`int`封装成对象。这不仅增强了数据的灵活性,还提供了许多实用的方法来处理整数相关的操作。下面,我们...

    NDI_Dec.zip

    VID_ADDR_WIDTH : integer := 32; VID_BURST_WIDTH : integer := 8; VID_BURST_LENGTH : integer := 8; NDI_ADDR_WIDTH : integer := 32; NDI_BURST_WIDTH : integer := 8; NDI_BURST_LENGTH : integer := 8 ...

    55丨享元模式(下):剖析享元模式在JavaInteger、String中的应用1

    相比之下,如果创建的Integer对象值在-128到127范围之外,如`Integer i3 = 129; Integer i4 = 129;`,则不会复用缓存池中的对象,而是每次都会创建新的实例。因此,`i3 == i4`会返回false,因为它们引用的是两个不同...

    mybatis返回Integer

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

    Java基础之Integer使用的注意事项及面试题

    "Java基础之Integer使用的注意事项及面试题" Java 中的 Integer 对象是一种 wrapper class,它可以将基本类型 int 转换为对象。然而,在使用 Integer 对象时,需要注意一些细节,以避免出现意外的结果。 首先,...

Global site tag (gtag.js) - Google Analytics