java 语法糖之 -----------自动装箱、拆箱
一、 示例代码
@Test public void test3(){ int i=1; int j=i++; if( i==(++j)&&( i++) == j){ i+=j; } System.out.println("i'"+ i); }
- 结果如下: 5
- 结果为什么会是这样呢? 仔细看来
二、 自动装箱、拆箱
-
定义
- 自动装箱,在编译之后被转化成了对应的包装方法,Integer.valueOf();
Integer i =1 ; 在编译中被执行: Integer i= Integer.valueOf(int i) ;
- 拆箱 ,在编译之后被转化成了对应的还原方法, Integer.intValue()方法。
int j = i++; 在编译中执行 拆箱 , int j = Integer.inValue(i);
- 示例,调用了拆箱,java虚拟机中常量池包括有Integer型常量池,用一个表存储,具体信息如下:
存储的范围值默认是 -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
欢迎关注公众号,查看更多内容 :
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一起深入探讨Maven远程仓库的配置和部署
Maven远程仓库的配置和部署 前言: Maven 是专门用于构建和管理Java相关项目的工具。Maven 是一个项目管理和整合工具。Maven 为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。 Maven 的主要目的是为开发者提供:一个可复用、可维护、更易理解的工程综合模型;与这个模型交互的插件或者工具。 今天要跟大家一起分享探讨的是Maven远程仓库的配置和部署,下面一起进入正题把 一、远程仓库的配置 在平时的开发中,我们往往不会使用默认的中央仓库,默认的中央仓库访问的速度比较慢,访问的人或许很多,有时候也无法满足我们项目的需求,可能项目需要的某些构件中央仓库中是没有的,而在其他远程仓库中有,如JBoss Maven仓库。这时,可以在pom.xml中配置该仓库,代码如下: jbossJBoss Repositoryhttp://repository.jboss.com/maven2/truedailyfalsewarndefaultrepository:在rep...
- 下一篇
Go语言小技巧
1 反射 val := reflect.ValueOf(v) kind := val.Kind() if kind == reflect.String { pValue := val.String() } else if kind == reflect.Int || kind == reflect.Int8 || kind == reflect.Int16 || kind == reflect.Int32 || kind == reflect.Int64 { pValueInt := val.Int() pValue := strconv.FormatInt(pValueInt, 10) } else if kind == reflect.Float32 || kind == reflect.Float64 { pValueFloat := val.Float() pValue := strconv.FormatFloat(pValueFloat, 'f', -1, 64) } else if kind == reflect.Slice { vSlice, ok := v.([]int...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启