php网站开发实战开发,最好的网站建设价格,厦门网站建设推荐,阜阳seo目录
前言
一、自动装箱与拆箱#xff08;以 Integer 包装类为例#xff09;
二、再来看看几个示例
三、Double ,Float 类型亦是如此吗#xff1f;
四、补充 前言 小伙伴们大家好#xff0c;日常使用业务层方面的代码居多#xff0c;但也不可忘了基本的一些代码格式… 目录
前言
一、自动装箱与拆箱以 Integer 包装类为例
二、再来看看几个示例
三、Double ,Float 类型亦是如此吗
四、补充 前言 小伙伴们大家好日常使用业务层方面的代码居多但也不可忘了基本的一些代码格式以及原理比如最近看到的一种题型这里就涉及到了自动装箱的基础知识了 Integer i new Integer(10);Integer j 10;Integer k 10;System.out.println(i j); //falseSystem.out.println(k j); //true
一、自动装箱与拆箱以 Integer 包装类为例 1、装箱就是自动将基本数据类型转换为包装器类型( int Integer),调用Integer.valueOf(int )方法 2、拆箱就是反过来将包装器类型转换为基本数据类型调用了Integer.intValue方法 3、java并不是一开始就支持自动拆装查了下是在Java SE5之后才支持该功能 自动装箱之后写法对比 Java SE5之前Integer i new Integer(10); Java SE5之后Integer i 10; 二、再来看看几个示例 1.比如前言中提到的 i 和 j 为什么不相等 Integer i new Integer(10) 创建了一个新的Integer对象而Integer j 10; 则会自动装箱实际上会调用Integer Integer j 10 实际上进行了装箱操作相当于调用了Integer.valueOf(10) 而由于10在缓存范围内因此会复用缓存中的对象。 i和j虽然表示的是相同的值但是i和j指向的是不同的对象所以表达式 i j 的结果是false 2.通过new 关键字生成的Integer对象比较 Integer i new Integer(127);Integer j new Integer(127);System.out.println(i j); //false i 和 j 分别是通过 new Integer(127) 创建的两个不同的对象会被强制创建为新的对象而不是从缓存中获取。即使值相同但它们在内存中的位置不同因此比较 i j 会返回 false。 3.Integer.valueOf 方法缓存的对象大小区间 Integer k 10;Integer l Integer.valueOf(10);Integer l1 Integer.valueOf(128);System.out.println(k l); //trueSystem.out.println(k l1); //false Integer k 10; Integer l Integer.valueOf(10); 这两行代码执行时都会将值为10的整数赋给Integer对象。在Java中对于数值范围在-128到127之间的整数会被缓存起来所以当你比较 k l 时因为10在缓存范围内它们实际上指向的是同一个对象所以返回true。 而当比较 k l1 时因为128不在缓存范围内所以 Integer.valueOf(128) 会创建一个新的Integer对象与 Integer k 10; 创建的对象不同因此返回false。 来看下 Integer.valueOf 方法内部 制定了数值范围如果是在[-128,127]之间返回IntegerCache缓存中已经存在的对象的引用否则创建一个新的 Integer对象所以k 和 l 指向的是同一个对象k 和 l1 分别指向不同的对象
三、Double ,Float 类型亦是如此吗 Double i 10.0;Double j 10.0;Float i1 10.0f;Float j1 10.0f;Long i2 10l;Long j2 10l;System.out.println(i j); //falseSystem.out.println(i1 j1); //falseSystem.out.println(i2 j2); //true 通过结果可以看出Long 类型之外的都没有缓存的功能 因为为了性能和内存的考虑只对整数类型的包装类如Integer、Long等进行了缓存优化而没有对浮点数类型的包装类如Float、Double等进行缓存具体分为以下几点。 整数类型的范围相对较小而且常常被使用到因此缓存能够显著提高性能。整数类型的对象在程序中经常被频繁使用缓存能够减少内存的占用和对象的创建次数。对于浮点数类型范围更广而且通常不像整数类型那样被频繁使用。缓存这些类型可能会导致内存开销过大而且由于浮点数的精度和计算方式的特殊性可能会引入更多的问题而不是性能提升。 四、补充 IntegerCache 类
public static Integer valueOf(int i) {if (i IntegerCache.low i IntegerCache.high)return IntegerCache.cache[i (-IntegerCache.low)];return new Integer(i);} IntegerCache.cache 是一个长度为 256 的 Integer 数组用于缓存整数对象。 IntegerCache.low 和 IntegerCache.high 分别表示缓存的整数范围的下界和上界。 IntegerCache.cache 中存储了 -128 到 127 之间的整数对象的引用。 例如当 i 的值为 10 时表达式 IntegerCache.cache[10 (-(-128))] 等价于 IntegerCache.cache[138]表示缓存数组中索引为 138 的位置存储了整数值 10 对应的 Integer 对象。 五、章末 好了文章到这里就结束了~