`
hiqrf
  • 浏览: 18854 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA Integer

    博客分类:
  • JAVA
阅读更多
public class Test {
public static void main(String[] args) {
Integer i1 = 127;
Integer i2 = 127;
Integer i3 = Integer.valueOf(127);

if (i1 == i2)
System.out.println("i1 == i2 is true!");
else
System.out.println("i1 == i2 is false!");

if (i1 >= i2)
System.out.println("i1 >= i2 is true!");
else
System.out.println("i1 >= i2 is false!");

if (i1 == i3)
System.out.println("i1 == i3 is true!");
else
System.out.println("i1 == i3 is false!");

}
}

当值是127时,输出是:
i1 == i2 is true!
i1 >= i2 is true!
i1 == i3 is true!

当值是128时,输出是:
i1 == i2 is false!
i1 >= i2 is true!
i1 == i3 is false!

说明:
我使用的是Sun JDK 1.5.0_03-b07 和 Eclipse 3.2M4。

“Integer i1 = 127;”在JDK1.4下不能编译通过的,会提示:“ Type mismatch: cannot convert from int to Integer”的错误,一般改写为:“Integer i1 = new Integer(127);”。

“Integer i1 = 127;”在JDK1.5下可以编译通过的,这就是自动装箱(Autoboxing)和自动拆箱(Auto-Unboxing)。自动装箱(Autoboxing)特性让Java自动包装一个简单数据类型(例如int)到对应的包装类型中(例如Integer)中。

在《JSR 201: Extending the Java Programming Language with Enumerations, Autoboxing, Enhanced for loops and Static Import》中,对这个问题,是作了这样的规定:
If the value p being boxed is true, false, a byte, an ASCII character, or an integer or short number between -127 and 128, then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.

在Java中,The following is the list of primitives stored as immutable objects(不可变对象):
* boolean values true and false
* All byte values
* short values between -128 and 127
* int values between -128 and 127
* char in the range \u0000 to \u007F

为了更容易理解问题,用Jad将上面代码反编译,如下:
import java.io.PrintStream;

public class Test
{

public Test()
{
}

public static void main(String args[])
{
Integer i1 = Integer.valueOf(128);
Integer i2 = Integer.valueOf(128);
Integer i3 = Integer.valueOf(128);

if(i1 == i2)
System.out.println("i1 == i2 is true!");
else
System.out.println("i1 == i2 is false!");

if(i1.intValue() >= i2.intValue())
System.out.println("i1 >= i2 is true!");
else
System.out.println("i1 >= i2 is false!");

if(i1 == i3)
System.out.println("i1 == i3 is true!");
else
System.out.println("i1 == i3 is false!");
}
}

从这可以看出,“Integer i1 = 128;”在JDK1.5下应该编译成了“Integer i1 = Integer.valueOf(128);”。


再看看java.lang.Integer中关于valueOf的源代码是怎样的:
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);
}

可以看出,这个值在-128到127之间,会将其cached(缓存)起来,如果多次使用的话,会节省内存和改善性能;如果不在这个范围之内,则生成一个新的Integer Object instance,这样如果进行“==”时,由于是比较两个不同的Object references,故结果是false。事实上,这个特性从JDK 1.3就存在了(以前的我不清楚) 。
分享到:
评论

相关推荐

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

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

    JAVA Integer类型自加实例详解

    JAVA Integer类型自加实例详解 JAVA Integer类型自加实例详解是 Java 语言中一个非常重要的知识点,对于 Java 开发者来说,无论是初学者还是高级开发者 都需要了解和掌握这方面的知识。本文将深入探讨 Java Integer...

    Java Integer的缓存特性

    项目里遇到的小问题的 整理

    Java Integer.ValueOf()的一些了解

    Java Integer.ValueOf()的一些了解 在Java中,Integer.ValueOf()方法是一个非常重要的方法,它可以将整数类型的值转换为Integer对象。下面我们就来详细了解一下这个方法的实现原理和使用方式。 首先,让我们来看...

    通过实例了解Java Integer类和int的区别

    Java Integer类和int的区别 Java Integer类和int是Java中两个相关却又不同的概念,很多开发者容易混淆它们之间的区别本文将通过实例来了解Java Integer类和int的区别。 知识点1:自动装箱和拆箱 在Java中,我们...

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

    在Java中,享元模式在Integer和String类中有显著的应用。 首先,我们来看Integer类。在Java中,基本数据类型int的封装类是Integer。在某些情况下,我们可能需要将int转换为Integer对象,这个过程称为自动装箱。反之...

    JAVA-int和Integer的区别

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

    Java Integer.valueOf()和Integer.parseInt()的区别说明

    Java Integer.valueOf()和Integer.parseInt()的区别说明 Java 中的 Integer 类中有两个静态方法,Integer.valueOf(String s) 和 Integer.parseInt(String s),它们都可以将字符串转换为整型,但它们之间有着很大的...

    Java中Integer两种转int方法比较

    在Java编程语言中,将`Integer`对象转换为基本数据类型`int`有两种常见的方法:`Integer.parseInt()`和`Integer.valueOf()`。理解这两种方法的区别和应用场景对于编写高效且正确的Java代码至关重要。 首先,我们来...

    Java int与integer的对比区别

    在Java编程语言中,`int` 和 `Integer` 都是用来表示整数的,但它们在性质和使用场景上有着显著的区别。理解这两者之间的差异对于编写高效且符合Java语法规则的代码至关重要。 首先,`int` 是Java中的一个基本数据...

    JAVA Integer类常用方法解析

    主要介绍了JAVA Integer类常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

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

    Integer创建对象

    在这个问题中,我们关注的是`Integer`类的创建,以及Java对象池机制对性能的影响。让我们深入探讨一下。 首先,`Integer`是Java中的一个包装类,用于封装基本类型`int`。Java提供了八种基本类型的包装类,包括`...

    EmptyUtils.java

    EmptyUtils.java---Java验证对象是否为空的工具类,工具可判断List,String,Integer,Object,Object[]类型的对象是否为空。

    javainteger源码-Free-Code-Camp:和尚访问群岛的土地。总共有N个岛,编号从1到N。一些岛对通过在水上运行的双向桥相互连

    标题中的“javainteger源码-Free-Code-Camp”指的是在Free Code Camp这个学习平台上,有关Java编程语言中Integer类的源代码分析。Integer是Java中的一个内置类,它封装了基本类型int,提供了许多与整数操作相关的...

    Integer类的使用方法

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

    HugeInteger.java

    HugeInteger.java

    java 去除重复元素

    在Java编程中,处理数据集合时,我们常常会遇到去除重复元素的需求。这可能是为了保持数据的唯一性,或者为了优化存储和计算效率。本文将详细介绍如何在Java中去除重复元素,主要关注数组和列表这两种常见数据结构。...

    My-DynamicIntArray:我自己的Java Integer ArrayList类的实现

    动态数组 我自己的Java Integer ArrayList类的实现

Global site tag (gtag.js) - Google Analytics