`

java int 与 Integer比较

阅读更多

int与 Integer  之间  ==  比较

 

 

	
	public static void main(String[] args) {
		int basicInt11 = 1;
		Integer wrapperInteger11 = 1;
		Integer wrapperInteger12 = new Integer(1);
		Integer wrapperInteger13 = Integer.valueOf(1);
		
		System.out.println("1[int] == 1[Integer] -> " + (basicInt11 == wrapperInteger11));
		System.out.println("1[int] == 1[new Integer(1)] -> " + (basicInt11 == wrapperInteger12));
		System.out.println("1[int] == 1[Integer.valueOf(1)] -> " + (basicInt11 == wrapperInteger13));
		
		System.out.println("1[Integer] == 1[new Integer(1)] -> " + (wrapperInteger11 == wrapperInteger12));
		System.out.println("1[Integer] == 1[Integer.valueOf(1)] -> " + (wrapperInteger11 == wrapperInteger13));
		System.out.println("====================================");
		int basicInt21 = 128;
		Integer wrapperInteger21 = 128;
		Integer wrapperInteger22 = new Integer(128);
		Integer wrapperInteger23 = Integer.valueOf(128);
		System.out.println("128[int] == 128[Integer] -> " + (basicInt21 == wrapperInteger21));
		System.out.println("128[int] == 128[new Integer(1)] -> " + (basicInt21 == wrapperInteger22));
		System.out.println("128[int] == 128[Integer.valueOf(1)] -> " + (basicInt21 == wrapperInteger23));
		
		System.out.println("128[Integer] == 128[new Integer(1)] -> " + (wrapperInteger21 == wrapperInteger22));
		System.out.println("128[Integer] == 128[Integer.valueOf(1)] -> " + (wrapperInteger21 == wrapperInteger23));
	}

 

结果
1[int] == 1[Integer] -> true
1[int] == 1[new Integer(1)] -> true
1[int] == 1[Integer.valueOf(1)] -> true
1[Integer] == 1[new Integer(1)] -> false
1[Integer] == 1[Integer.valueOf(1)] -> true
====================================
128[int] == 128[Integer] -> true
128[int] == 128[new Integer(1)] -> true
128[int] == 128[Integer.valueOf(1)] -> true
128[Integer] == 128[new Integer(1)] -> false
128[Integer] == 128[Integer.valueOf(1)] -> false

 

 

 

从以上可看出,基本类型与包装类型  ==  比较始终相对。

而包装类型,值一样,采取初始化方式不一样,  ==结果不一样。

1[Integer] == 1[new Integer(1)] -> false
1[Integer] == 1[Integer.valueOf(1)] -> true

值为 128的时候, 128[Integer] == 128[Integer.valueOf(1)] -> false  结果也不一样。

 

分析,java 的数据分为基本类型和引用类型。  ==  进行比较。则基本类型比较的是值,  引用类型则比较的是引用地址。

同一个class的不同对象(new 出来的) 必然引用地址不想等。

查看 Integer 源码:

 

    public Integer(int value) {
        this.value = value;
    }

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

 

 

从源码可看出,  new Integer(1)  与  Integer.valueOf(1) 初始化是不一样的。

new Integer(1) 是完全新建一个对象。

Integer.valueOf(1) 则会先查找本地缓存是否存在该对象,存在则直接返回,不存在,则新建一个对象。

而 Intger aa = 1 , 这种格式,JVM是怎么初始化的呢? 这其实需要把 .java文件,先转成 .class文件,然后再反编译.class文件看,即可明白。

设上面为  A.java 则windows下面, 在此文件目录  shift +右键  选择:在此处打开命令,  输入  javac A.java

则通过 Java Decompiler 打开  A.class

 

  public static void main(String[] paramArrayOfString)
  {
    int i = 1;
    Integer localInteger1 = Integer.valueOf(1);
    Integer localInteger2 = new Integer(1);
    Integer localInteger3 = Integer.valueOf(1);

    System.out.println(new StringBuilder().append("1[int] == 1[Integer] -> ").append(i == localInteger1.intValue()).toString());
    System.out.println(new StringBuilder().append("1[int] == 1[new Integer(1)] -> ").append(i == localInteger2.intValue()).toString());
    System.out.println(new StringBuilder().append("1[int] == 1[Integer.valueOf(1)] -> ").append(i == localInteger3.intValue()).toString());

    System.out.println(new StringBuilder().append("1[Integer] == 1[new Integer(1)] -> ").append(localInteger1 == localInteger2).toString());
    System.out.println(new StringBuilder().append("1[Integer] == 1[Integer.valueOf(1)] -> ").append(localInteger1 == localInteger3).toString());
    System.out.println("====================================");
    int j = 128;
    Integer localInteger4 = Integer.valueOf(128);
    Integer localInteger5 = new Integer(128);
    Integer localInteger6 = Integer.valueOf(128);
    System.out.println(new StringBuilder().append("128[int] == 128[Integer] -> ").append(j == localInteger4.intValue()).toString());
    System.out.println(new StringBuilder().append("128[int] == 128[new Integer(1)] -> ").append(j == localInteger5.intValue()).toString());
    System.out.println(new StringBuilder().append("128[int] == 128[Integer.valueOf(1)] -> ").append(j == localInteger6.intValue()).toString());

    System.out.println(new StringBuilder().append("128[Integer] == 128[new Integer(1)] -> ").append(localInteger4 == localInteger5).toString());
    System.out.println(new StringBuilder().append("128[Integer] == 128[Integer.valueOf(1)] -> ").append(localInteger4 == localInteger6).toString());
  }

 从上可看出  javac 后的二进制代码与写的有些不一样。 这是因为,编译器对此进行了优化(可能不同版本编译器,上面结果还有些不一样)。

Integer a = 1;  其实编译后,JVM看到的是 Integer a = Integer.valueOf(1);

 基本类型和包装类型比较时,  int b=1  ; Intger a=1;  == 两边,只要有基本类型, 则另外一边返回的也一定是基本类型 (localInteger5.intValue())。

因此是基本类型的值比较。

 

    public int intValue() {
        return value;
    }

 

 

总结:  用 == 的时候 一定要保证是基本类型的比较,而不是引用类型的比较。当存在包装类型的时候, 最好转化为 基本类型,再用 ==,防止出现 ==两边都是包装类型。

 

 

 

 

 

 

分享到:
评论

相关推荐

    JAVA-int和Integer的区别1.zip

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

    JAVA-int和Integer的区别

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

    Java int与integer的区别

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

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

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

    Java int与integer的对比区别

    6. **比较**:对于 `int`,可以直接使用 `==` 进行值的比较,而对于 `Integer`,必须使用 `.equals()` 方法,除非进行的是对象引用的比较。 7. **缓存**:`Integer` 类有一个内置的缓存,用于存储-128到127之间的值...

    Java中int和Integer的区别.doc

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

    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

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

    - 自动装箱与拆箱:从JDK 5.0开始,Java引入了自动装箱和拆箱机制,使得`int`和`Integer`之间可以无缝转换。例如,`Integer i = 1;`会自动将整数1装箱成一个`Integer`对象,而`int j = i;`会自动将`Integer`对象...

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

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

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

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

    JAVA中的integer的一些见解

    对JAVA中的int类型和integer类型进行透彻分析的一个文档 很有帮助的哦 亲!

    Integer和int的不同

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

    详解Java中int和Integer的区别

    2. Integer 变量和 int 变量比较时,只要两个变量的值是相等的,则结果为 true(因为包装类 Integer 和基本数据类型 int 比较时,Java 会自动拆包装为 int,然后进行比较,实际上就变为两个 int 变量的比较)。...

    java中String类型和int类型比较及相互转换

    在Java中,直接比较一个String类型的值与一个int类型的值是非法的,因为它们属于不同的数据类型。若要进行比较,必须先进行类型转换。 #### 2.1 使用compareTo方法比较String类型 对于两个String类型的比较,可以...

    细数java中Long与Integer比较容易犯的错误总结.docx

    ### Java中Long与Integer比较易犯错误总结 #### 一、引言 在Java编程过程中,经常需要对数值进行比较操作。对于基本数据类型如`int`和`long`,可以直接使用`==`进行比较。然而,当涉及到它们的包装类`Integer`和`...

    JAVA IntSet 数列集合

    它类似于标准的`java.util.Set`接口,但只处理基本类型`int`,而非包装类`Integer`。`IntSet`的设计目标是提高性能,因为与对象相比,基本类型的存储和操作通常更快。以下是对`IntSet`主要功能的详细解释: 1. **...

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

    当 int 和 Integer 进行比较时,Integer 会进行拆箱,转为 int 值与 int 进行比较。 非 new 生成的 Integer 变量和 new Integer() 生成的变量比较时,结果为 false,因为非 new 生成的 Integer 变量指向的是 Java ...

Global site tag (gtag.js) - Google Analytics