包装类型和基础类型是如何比较的

基础类型和基础类型比较

基础类型和基础类型比较使用==,直接比较值

包装类型比较

  1. 使用==比较,则比较的是引用指向的地址
  2. 使用equals()方法比较,则比较的是他的值

基础类型和包装类型比较

        Integer a = new Integer(10);
        Integer b = new Integer(10);
        System.out.println(a == b);//false   引用指向的地址不一样
        System.out.println(a.equals(b));//true  比较基本数据类型的值

        Integer c = 10;
        Integer d = 10;
        System.out.println(c == d);//true   引用指向的地址相同 自动装箱的Integer进行了缓存,[-128,127]进行了缓存
        System.out.println(c.equals(d));//true 基本数据类型的值是相同的

        int e = 10;
        System.out.println(e == c);//true int和Integer比较,Integer会自动拆箱,调用intValue方法, 所以 == 和 equals都肯定为true
        System.out.println(c.equals(e));// true Integer使用equals 传入 int,会先装箱成Integer 再使用equals()进行比较

使用javap -c 反汇编命令查看基础类型和包装类型进行比较的过程

      99: invokevirtual #8                  // Method java/lang/Integer.intValue:()I   调用intValue获取包装类型的基础类型
     102: if_icmpne     109
     105: iconst_1
     106: goto          110
     109: iconst_0
     110: invokevirtual #5                  // Method java/io/PrintStream.println:(Z)V
     113: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
     116: aload_3
     117: iload         5
     119: invokestatic  #7                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 调用Integer.valueOf()方法对基础数据类型进行装箱,再传入equals方法里
     122: invokevirtual #6                  // Method java/lang/Integer.equals:(Ljava/lang/Object;)Z
     125: invokevirtual #5                  // Method java/io/PrintStream.println:(Z)V

posted @ 2021-05-07 11:21  苏南hui  阅读(176)  评论(0编辑  收藏  举报