`
liulanghan110
  • 浏览: 1076156 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

int和Integer的区别

    博客分类:
  • JAVA
 
阅读更多

先看一个例子:

 

 

public class test {
	public static void main(String args[]){
		Integer c1 = 1;
		Integer d1 = 1;
		int c2 = 1;
		int d2 = 1;
		Integer c3 = 300;
		Integer d3 = 300;
		int c4 = 300;
		int d4 = 300;
		System.out.println(c1==d1);
		System.out.println(c2==d2);
		System.out.println(c3==d3);
		System.out.println(c4==d4);

	}
}

 输出结果

 

true
true
false
true
 
可以发现,当数字为1时, Integer和int结果一样,但是当数字为300时,Integer和int结果不一样,为什么会这样呢?
将编译好的test.class文件反编译后发现。上面的代码其实是这样的:
import java.io.PrintStream;

public class test
{
  public static void main(String[] paramArrayOfString)
  {
    Integer localInteger1 = Integer.valueOf(1);
    Integer localInteger2 = Integer.valueOf(1);
    int i = 1;
    int j = 1;
    Integer localInteger3 = Integer.valueOf(300);
    Integer localInteger4 = Integer.valueOf(300);
    int k = 300;
    int m = 300;
    System.out.println(localInteger1 == localInteger2);
    System.out.println(i == j);
    System.out.println(localInteger3 == localInteger4);
    System.out.println(k == m);
  }
}
 
也就是Integer c1 = 1;其实就是Integer c1 =  Integer.valueOf(1) ;
查看Integer.valueOf代码发现:
public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }
 也就是当数字大于-128小于IntegerCache.high时直接从IntegerCache中取值,当超出这个范围的时候就会新建一个对象
new Integer(i);
查看IntegerCache的代码可以发现IntegerCache.high的值为127,在运行程序时可以通过参数调整。
也就是当-128<=i<=127不会new一个对象。
 
那么new一个对象和从缓存中取值有什么区别呢。
 

看一个最基本的
例如:

 

Objet obj = new Object();
 变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。

 

也就是说如果有这样的代码:

Integer a1 = new Integer(1);
Integer a2 = new Integer(1);
Integer a3 = new Integer(1);
Integer a4 = new Integer(1);
Integer a5 = new Integer(1);

 假如一个变量需要1k的存储空间一个new Integer也需要1k的存储空间(当然,实际没这么大),那么总共需要10k的存储空间,但是当将1缓存到内存中时,将a1、a2、 a3 、a4、 a5都指向这个1,也就是只需要6k的存储空间,这样就节约了内存。而且新建对象也需要花费时间,所以这样的优化节约了空间和时间。

 

-128<=i<=127只是JDK的默认范围,当然可以自己将IntegerCache设置大一些。

 

像字符串常量池和LongCache等都有类似的优化思想。

 

由于==比较的是引用,所以当数字在-128<=i<=127范围之内时,指向的是同一个地方,返回true;当数字在范围之外时,每次都新建一个对象,指向的是不同的地方,所以返回false。

 

但是当类型时int时,无论什么数字都返回true。

  

如果把Java内存简单的区分为堆内存(Heap)和栈内存(Stack),实际中的区域远比这种观点复杂,所指的“栈”就是VM栈中各个帧的本地变量表部分。本地变量表存放了编译期可知的各种标量类型(boolean、byte、char、short、int、float、long、double)、对象引用(不是对象本身,仅仅是一个引用指针)、方法返回地址等。

int a1 = 300;
int a2 = 300;
int a3 = 300;
int a4 = 300;

 时,并不会创建对象,只会在栈中存放a.b c.d四个变量,和一个数字300。所以无论为1还是300,int时用等于比较都会相等。

 

另外看如下的代码:

public class test {
	public static void main(String args[]){
		Integer c1 = 1;
		int d1 = 1;
		Integer c2 = 300;
		int d2 = 300;
		System.out.println(c1==d1);
		System.out.println(c2==d2);
	}
}

 输出结果为

true

true

反编译之后可以看到如下代码:

import java.io.PrintStream;

public class test
{
  public static void main(String[] paramArrayOfString)
  {
    Integer localInteger1 = Integer.valueOf(1);
    int i = 1;
    Integer localInteger2 = Integer.valueOf(300);
    int j = 300;
    System.out.println(localInteger1.intValue() == i);
    System.out.println(localInteger2.intValue() == j);
  }
}

 也就是Intger和int比较时,会调用Intger.intValue() 方法,所以Intger和int用==比较时,会一直相等。

 

但是,并不推荐用==比较两个不同的类型。

分享到:
评论

相关推荐

    JAVA-int和Integer的区别

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

    JAVA-int和Integer的区别1.zip

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

    Java中int和Integer的区别.doc

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

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

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

    第7讲 int和Integer有什么区别1

    【标题】:“第7讲 int和Integer有什么区别1” 【描述】:“1. 理解自动装箱、拆箱2. 源码分析3. 原始类型线程安全” 【标签】:“java 数学” 【正文】: 在Java编程中,`int`和`Integer`是两种不同的数据类型,...

    Java基本数据类型与封装类型详解(int和Integer区别)

    本文将深入探讨Java中的int基本数据类型和Integer封装类型之间的差异。 1. 类型区别: - int是Java的八种基本数据类型之一,属于原始类型(Primitive Type),它直接存储整数值,没有对象的概念。int的默认值是0。...

    详解Java中int和Integer的区别

    Java 中 int 和 Integer 的区别 Java 作为一门面向对象的编程语言,具有两种基本数据类型:基本数据类型(primitive type)和引用类型(reference type)。在 Java 中,基本数据类型只有八个:boolean、char、byte...

    int与Integer的区别(Java各种数据类型详细介绍及其区别).doc

    本篇文章将深入探讨Java中的基本类型,特别是`int`和`Integer`的区别。 1. 基本类型: - 实数:`double`和`float`。`double`使用8个字节存储,遵循IEEE 754双精度标准,范围广泛。`float`使用4个字节,遵循单精度...

    Java int与integer的区别

    int与integer的区别从大的方面来说是基本数据类型与其包装类的区别:  int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象  1.Java 中的数据类型分为基本数据类型和复杂数据类型  int 是...

    mybatis返回Integer

    首先,我们要理解Java中的基本类型int和引用类型Integer的区别。int是Java的基本数据类型,它占用32位存储空间,直接存储数值,而Integer是int的包装类,是一个对象,它包含一个int类型的成员变量。在Java中,对象的...

    Integer和int的不同

    在Java编程语言中,`Integer`和`int`是两种不同的数据类型,它们在使用上有一些关键的区别。首先,`int`是Java的八种原始数据类型之一,它用来存储整数值,如-2147483648到2147483647之间的数字。`int`变量的默认值...

    简单了解java中int和Integer的区别

    Java 中 int 和 Integer 的区别 Java 中的 int 和 Integer 是两个不同的概念,都是表示整数类型,但是它们有着不同的特性和用途。本文将详细介绍 Java 中 int 和 Integer 的区别。 1. 数据类型 int 是 Java 中的...

    Java中int与integer的区别(基本数据类型与引用数据类型)

    在Java编程语言中,`int` 和 `Integer` 是两种截然不同的数据类型,它们各自具有独特的特性和用途。理解这两者之间的差异对于编写高效、可靠的代码至关重要。 首先,`int` 是Java中的一个基本数据类型,它代表整数...

    java 举例分析 equals hashcode 基本类型与基本对象的比较 shot与Short int与Integer long与Long

    举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character

    Java int与integer的对比区别

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

    Java中关于int和Integer的区别详解

    在Java编程语言中,`int`和`Integer`虽然都用于表示数值,但它们之间存在着显著的区别。`int`是Java中的一个基本数据类型,而`Integer`是`int`的包装类,属于引用数据类型。下面是这两个概念的详细解析: 1. **基本...

    Java中Integer两种转int方法比较

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

    Mybatis返回int或者Integer类型报错的解决办法

    在使用Mybatis进行数据操作时,有时可能会遇到返回`int`或`Integer`类型时出现异常的情况。这种问题通常出现在当Mapper方法试图返回一个可能是`null`的结果,但方法声明的返回类型是基本类型`int`时。由于基本类型不...

Global site tag (gtag.js) - Google Analytics