java 语法糖之 -----------自动装箱、拆箱

简介: java 语法糖 自动装箱 自动拆箱 对象内存打印

一、 示例代码

   @Test
   public  void test3(){
       int i=1;
       int j=i++; 
       if( i==(++j)&&( i++) == j){
               i+=j;
       }
       System.out.println("i'"+ i);
   }
  • 结果如下: 5

    java_autobox

  • 结果为什么会是这样呢? 仔细看来

二、 自动装箱、拆箱

  • 定义

    • 自动装箱,在编译之后被转化成了对应的包装方法,Integer.valueOf();

    Integer i =1 ; 在编译中被执行: Integer i= Integer.valueOf(int i) ;

    • 拆箱 ,在编译之后被转化成了对应的还原方法, Integer.intValue()方法。

    int j = i++; 在编译中执行 拆箱 , int j = Integer.inValue(i);

  • 示例,调用了拆箱,java虚拟机中常量池包括有Integer型常量池,用一个表存储,具体信息如下:
    33

存储的范围值默认是 -128~127, 故如果Interger指向的是这个范围内的数字在编译的时候会直接指向常量池中的对象;

三、 通过两种方法,比较地址是否相同:

  • 第一种

    System.out.println(System.identityHashCode(i));
    System.out.println(System.identityHashCode(i++));
    System.out.println(System.identityHashCode(++j));
       
  • 第二种

    public class javaAuto {
        static final Unsafe unsafe = getUnsafe();
        static final boolean is64bit = true;
    
        public static void main(String... args) {
       
       int i=1;
       int j=i++;
       System.out.println("-------------------------");
       System.out.println("----");
       printAddresses("i", i);
    
       System.gc();
       System.out.println("----");
       printAddresses("j", ++j);
       
       System.gc();
       System.out.println("----");
       printAddresses("i++", i++);
        }
    
        public static void printAddresses(String label, Object... objects) {
       System.out.print(label + ": 0x");
       long last = 0;
       int offset = unsafe.arrayBaseOffset(objects.getClass());
       int scale = unsafe.arrayIndexScale(objects.getClass());
       switch (scale) {
           case 4:
               long factor = is64bit ? 8 : 1;
               final long i1 = (unsafe.getInt(objects, offset) & 0xFFFFFFFFL) * factor;
               System.out.print(Long.toHexString(i1));
               last = i1;
               for (int i = 1; i < objects.length; i++) {
                   final long i2 = (unsafe.getInt(objects, offset + i * 4) & 0xFFFFFFFFL) * factor;
                   if (i2 > last)
                       System.out.print(", +" + Long.toHexString(i2 - last));
                   else
                       System.out.print(", -" + Long.toHexString( last - i2));
                   last = i2;
               }
               break;
           case 8:
               throw new AssertionError("Not supported");
       }
       System.out.println();
        }
    
        private static Unsafe getUnsafe() {
       try {
           Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
           theUnsafe.setAccessible(true);
           return (Unsafe) theUnsafe.get(null);
       } catch (Exception e) {
           throw new AssertionError(e);
       }
        }
    
    }
    
  • 通过这两种方式打印出的,i ,i++,++j 的地址都是一样的;他们的值呢?

四、值

  • i 和 ++j 的值都是2,这个毋庸置疑;
  • (i++)==j ,这个比较,楼主怀疑是先执行的比较,再执行的++操作,可是貌似又不符合运算符的运算规则。
  • 待查...希望有人能告知答案,不胜感激

参考链接: https://blog.csdn.net/isscollege/article/details/78398968

欢迎关注公众号,查看更多内容 :
XG54_9_WXMH_5X_HB_H_7V

相关文章
|
1月前
|
Java 编译器
Java中的自动装箱和拆箱
Java中的自动装箱和拆箱
|
7月前
|
Java 编译器 程序员
Java动拆装箱
Java动拆装箱
60 0
|
25天前
|
Java
【Java】一个关于装箱的某里面试题
【Java】一个关于装箱的某里面试题
7 1
|
2月前
|
Java 编译器 测试技术
滚雪球学Java(07):自动装箱、自动拆箱,Java开发者必备技能
【2月更文挑战第8天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
72 5
|
4月前
|
IDE Java 开发工具
你知道 Java 中关键字 enum 是一个语法糖吗?反编译枚举类
你知道 Java 中关键字 enum 是一个语法糖吗?反编译枚举类
44 0
|
4月前
|
存储 缓存 Java
Java基本数据类型、包装类及拆装箱详解
Java的基本数据类型和对应的包装类是Java语言中处理数据的两个关键概念。基本数据类型提供了简单而高效的方式来存储数据,而包装类使得基本数据类型具有对象的特性。本文将深入探讨基本数据类型与包装类的应用场景及详细描述,并对自动拆箱和装箱的源码实现进行分析。
87 1
Java基本数据类型、包装类及拆装箱详解
|
6月前
|
Java
【面试题精讲】Java 中有哪些常见的语法糖?
【面试题精讲】Java 中有哪些常见的语法糖?
|
6月前
|
存储 Java 编译器
Java包装类与自动拆箱装箱
Java包装类与自动拆箱装箱
|
7月前
|
缓存 Java 编译器
Java引用类型的自动装箱与缓存池
Java引用类型的自动装箱与缓存池
41 0
|
7月前
|
Java 编译器
Java自动装箱和拆箱
Java自动装箱和拆箱
32 0