Java的Integer和int有什么区别

Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换,对应如下:

原始类型:boolean,char,byte,short,int,long,float,double

包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

顺便一提,Java中的基本数据类型只有以上8个,除了基本类型(primitive type),剩下的都是引用类型(reference type)。

所以最基本的一点区别是:Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。除此之外还有区别,请看代码:

public class TestInteger {
    public static void main(String[] args) {
        int i = 128;
        Integer i2 = 128;
        Integer i3 = new Integer(128);
        System.out.println(i == i2); //Integer会自动拆箱为int,所以为true
        System.out.println(i == i3); //true,理由同上
        Integer i4 = 127;//编译时被翻译成:Integer i4 = Integer.valueOf(127);
        Integer i5 = 127;
        System.out.println(i4 == i5);//true
        Integer i6 = 128;
        Integer i7 = 128;
        System.out.println(i6 == i7);//false
        Integer i8 = new Integer(127);
        System.out.println(i5 == i8); //false
        Integer i9 = new Integer(128);
        Integer i10 = new Integer(123);
        System.out.println(i9 == i10);  //false
    }
}

  

为什么i4和i5比是true,而i6和i7比是false呢?关键就是看valueOf()函数了,这个函数对于-128到127之间的数,会进行缓存, Integer i5 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。所以i4和i5比是true,而i6和i7比是false。

而对于后边的i5和i8,以及i9和i10,因为对象不一样,所以为false。

以上的情况总结如下:

1,无论如何,Integer与new Integer不会相等。不会经历拆箱过程,new出来的对象存放在堆,而非new的Integer常量则在常量池(在方法区),他们的内存地址不一样,所以为false。

2,两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。因为java在编译Integer i2 = 128的时候,被翻译成:Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。

3,两个都是new出来的,都为false。还是内存地址不一样。

4,int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。

原文地址:https://www.cnblogs.com/mmykdbc/p/8715646.html

时间: 2025-01-06 06:35:16

Java的Integer和int有什么区别的相关文章

java中integer和int类型的区别

int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer.在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果

java基础巩固系列(二):Integer与int之间的区别

在JDK1.5之后引入了自动装箱(autoboxing)与自动拆箱(unboxing),这让很多对java的初学者感到很疑惑,我刚才也是其中一员. 首先,有一些基本的概念需要了解: 1.Ingeter是int的包装类,int的初值为0,Ingeter的初值为null. 2.Integer是一个类,用Integer声明一个变量是一个对象类型(或者说引用类型):int是基本类型,用int声明的变量是非对象类型,即不能在其上调用方法. 3."=="作用于对象上的时候,其比较的是对象的引用本身

Integer 与int类型的区别使用

区别一: Java 为每个原始类型提供了包装类型:  - 原始类型: boolean,char,byte,short,int,long,float,double  - 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,DoubleInteger与int的区别最基本的是:Ingeter是int的包装类,int的初值为0,Ingeter的初值为null1.自动拆箱比较为true 1 @org.junit.Test 2 public void t

Java中Integer与int类型的装箱和拆箱

其实Integer与int类型的赋值与比较最关键的一点就是:这两个变量的类型不同.Integer是引用类型,int是原生数据类型.         我们分四种情况来讨论:         1) Integer与int类型的赋值                 a.把Integer类型赋值给int类型.此时,Integer类型变量的值会自动拆箱成int类型,然后赋给int类型的变量,这里底层则是通过调用intValue()方法来实现所谓的拆箱的.                 b.把int类型赋

Java中Integer和int的异同

1 public void Test1() { 2 int a = 128; 3 Integer b = 128; 4 Integer c = 128; 5 //Integer会自动拆箱成int,所以为ture 6 System.out.println(a==b); 7 System.out.println(a==c); 8 } 9 10 @Test 11 public void Test2() { 12 Integer a = 127; 13 Integer b = 127; 14 Syste

Java中Integer和int比较大小出现的错误

Java在某一处维护着一个常量池,(我记得)在小于128的范围内,直接用 1 Integer i = 100; 2 int j = 100; 3 return i == j;//true 这里返回的是true. 但是>=128, 1 Integer i = 500; 2 int j = 500; 3 return i == j; //false 这里的常量池可以修改,在什么地方我忘了,可以百度一下,最好还是比较之前转换一下.

java的Integer缓冲

java.lang.Integer.valueOf(int)方法默认情况下如果参数在-128到127之间,则返回缓存中的对象,否则返回new Integer(int). 缓存中的对象是JVM第一次使用valueOf方法时初始化的. 可以设置系统属性 java.lang.Integer.IntegerCache.high 修改缓冲区上限,默认为127.参数内容应为大于127的十进制数形式的字符串,否则将被忽略.取值范围为127-Long.MAX_VALUE,但是用时将强转为int. 当系统中大量使

java面试题之int和Integer的区别

int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象:而int则是直接存储数据值 4.Integer的默认值是null,int的默认值是0 延伸: 关于Integer和int的比较 1.由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变

【转载】C#之int与Java之Integer的区别

本文涉及到一些JVM原理和Java的字节码指令,推荐感兴趣的读者阅读一本有关JVM的经典书籍<深入Java虚拟机(第2版)>,将它与我在<.NET 4.0面向对象编程漫谈>中介绍的CLR原理与IL汇编指令作个对比,相信读者会有一定的启发.而仔细对比两个类似事物的异同,是很有效的学习方法之一. 1 奇特的程序输出 前段时间,一个学生给我看了一段“非常诡异”的Java代码:   public class testInteger {    public static void main(