当前位置: 首页 > news >正文

重庆在建项目查询windows优化大师值得买吗

重庆在建项目查询,windows优化大师值得买吗,wordpress上传的图片在,国外采购外贸交易平台目录 一、包装类概述 主要包装类及其对应关系 为什么需要包装类? 二、装箱与拆箱 装箱(Autoboxing) 拆箱(Unboxing) 案例解析 三、Integer缓存机制 什么是Integer缓存? 缓存机制实现原理 缓存范围…

目录

一、包装类概述

主要包装类及其对应关系

为什么需要包装类?

二、装箱与拆箱

装箱(Autoboxing)

拆箱(Unboxing)

案例解析

三、Integer缓存机制

什么是Integer缓存?

缓存机制实现原理

缓存范围的可配置性

深入案例

四、其他包装类的缓存机制

五、常见陷阱与最佳实践

陷阱1:空指针异常

陷阱2:比较运算符的误用

陷阱3:性能问题

六、综合应用案例

案例1:包装类在集合中的应用

案例2:方法重载与自动装箱

七、总结


一、包装类概述

在Java中,基本数据类型(如int、double、boolean等)不是对象,但有时我们需要将它们当作对象来处理。为此,Java为每个基本数据类型提供了对应的包装类(Wrapper Class)。

主要包装类及其对应关系

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

为什么需要包装类?

  1. 泛型支持:Java泛型不支持基本类型,只能使用包装类

  2. 集合框架:集合如ArrayList、HashMap等只能存储对象

  3. 提供实用方法:包装类提供了许多有用的方法(如parseInt()、toString()等)

  4. 允许null值:包装类可以表示缺失值(null),而基本类型不能

二、装箱与拆箱

装箱(Autoboxing)

装箱是指将基本数据类型自动转换为对应的包装类对象。

java

// 手动装箱(Java 5之前)
Integer intObj1 = Integer.valueOf(10);// 自动装箱(Java 5之后)
Integer intObj2 = 10; // 编译器自动转换为Integer.valueOf(10)

拆箱(Unboxing)

拆箱是指将包装类对象自动转换为对应的基本数据类型。

java

Integer intObj = Integer.valueOf(20);// 手动拆箱
int i1 = intObj.intValue();// 自动拆箱
int i2 = intObj; // 编译器自动转换为intObj.intValue()

案例解析

public class BoxingExample {public static void main(String[] args) {// 自动装箱List<Integer> list = new ArrayList<>();list.add(1); // 自动装箱为Integerlist.add(2); // 自动装箱为Integer// 自动拆箱int first = list.get(0); // 自动拆箱为int// 混合运算Integer a = 5;Integer b = 10;int sum = a + b; // 先拆箱再相加System.out.println("First element: " + first);System.out.println("Sum: " + sum);}
}

三、Integer缓存机制

什么是Integer缓存?

Java为了优化性能,对Integer对象实现了缓存机制。默认情况下,Integer会缓存-128到127之间的值。

Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true,因为使用了缓存中的同一对象Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false,超出缓存范围,创建了新对象

缓存机制实现原理

Integer类的valueOf()方法实现了缓存:

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

缓存范围的可配置性

缓存的上限可以通过JVM参数进行调整:

-XX:AutoBoxCacheMax=<size>

这将把缓存上限从127扩展到指定的size。

深入案例

public class IntegerCacheDemo {public static void main(String[] args) {// 测试缓存范围内的值Integer i1 = 100;Integer i2 = 100;System.out.println("i1 == i2: " + (i1 == i2)); // true// 测试缓存范围外的值Integer i3 = 200;Integer i4 = 200;System.out.println("i3 == i4: " + (i3 == i4)); // false// 使用new创建对象,不适用缓存Integer i5 = new Integer(100);Integer i6 = new Integer(100);System.out.println("i5 == i6: " + (i5 == i6)); // false// 比较应该使用equalsSystem.out.println("i1.equals(i2): " + i1.equals(i2)); // trueSystem.out.println("i3.equals(i4): " + i3.equals(i4)); // trueSystem.out.println("i5.equals(i6): " + i5.equals(i6)); // true}
}

四、其他包装类的缓存机制

除了Integer,其他包装类也有类似的缓存机制:

  1. Byte:缓存所有可能值(-128到127)

  2. Short:缓存-128到127

  3. Long:缓存-128到127

  4. Character:缓存0到127

  5. Boolean:缓存TRUE和FALSE

// Boolean缓存示例
Boolean b1 = true;
Boolean b2 = true;
System.out.println(b1 == b2); // true// Character缓存示例
Character c1 = 'A';
Character c2 = 'A';
System.out.println(c1 == c2); // trueCharacter c3 = '啊';
Character c4 = '啊';
System.out.println(c3 == c4); // false

五、常见陷阱与最佳实践

陷阱1:空指针异常

Integer num = null;
int n = num; // 运行时抛出NullPointerException

解决方案:确保包装类对象不为null后再拆箱

陷阱2:比较运算符的误用

Integer a = 100;
Integer b = 100;
Integer c = 200;
Integer d = 200;System.out.println(a == b); // true
System.out.println(c == d); // false

最佳实践:比较包装类对象时总是使用equals()方法

陷阱3:性能问题

// 性能低下的代码
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {sum += i; // 发生了大量的自动装箱操作
}

优化方案:使用基本类型long

long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {sum += i;
}

六、综合应用案例

案例1:包装类在集合中的应用

public class CollectionWithWrappers {public static void main(String[] args) {// 1. List中使用IntegerList<Integer> numbers = new ArrayList<>();numbers.add(1);  // 自动装箱numbers.add(2);numbers.add(3);int sum = 0;for (Integer num : numbers) {sum += num;  // 自动拆箱}System.out.println("Sum: " + sum);// 2. Map中使用包装类Map<String, Integer> wordCount = new HashMap<>();wordCount.put("apple", 5);wordCount.put("orange", 3);// 更新值wordCount.put("apple", wordCount.get("apple") + 1); // 自动拆箱和装箱System.out.println("Updated counts: " + wordCount);}
}

案例2:方法重载与自动装箱

public class OverloadingBoxing {public static void print(int num) {System.out.println("Primitive int: " + num);}public static void print(Integer num) {System.out.println("Wrapper Integer: " + num);}public static void main(String[] args) {print(10);      // 调用print(int)print(Integer.valueOf(10)); // 调用print(Integer)// 有趣的情况print(null);    // 编译错误,歧义调用}
}

七、总结

  1. 包装类是基本数据类型的对象表示,提供了更多功能和灵活性

  2. 自动装箱和拆箱是Java的语法糖,简化了基本类型和包装类之间的转换

  3. Integer缓存机制优化了常用数值的性能,但要注意比较时的行为差异

  4. 最佳实践

    • 比较包装类对象时使用equals()而非==

    • 注意可能的NullPointerException

    • 性能敏感场景优先使用基本类型

    • 了解各包装类的缓存范围

http://www.dtcms.com/a/594446.html

相关文章:

  • 做别人一样的网站模板网站开发的评论界面怎么写
  • 备案 网站名称 重复宾馆网站模板
  • 音乐网站怎么建设icp
  • 从局部性原理到一致性模型:深入剖析缓存设计的核心权衡
  • 自己动手写深度学习框架(数值法计算梯度)
  • Linux上的curl和telnet
  • 网络科技有限公司网站建设wordpress手机分享插件
  • 河北建设厅注册中心网站首页百科类网站建设
  • 医院网站建设公司价格外贸网站增加外链方法
  • 网站认证是什么意思萝岗哪家网站建设好
  • 感悟生命:《藏在罐子里的爱》
  • Raylib 事件
  • mvc做网站前台代码景德镇做网站
  • 做纱线的网站个人建网站步骤
  • 六爻观测基础(二)——五行
  • 天山网站企业信息系统案例
  • 在vue3中实现无限向上滚动效果插件
  • 个人备案网站放什么资料制作卖东西网站
  • 免费人脉推广官方软件网站优化的方式
  • 深度学习:神经网络中的参数和超参数
  • Xilinx 参数化宏(XPM)xpm_cdc_gray
  • langchain1.0工具模块tools的基本使用
  • html5黑色网站wordpress汉化模板
  • 网站做su什么意思网店美工设计模板
  • React useMemo和redux createSelector的区别
  • 唐山网站建设阿里巴巴1688登录入口
  • C++使用TaggedPointer的方式实现高效编译时多态
  • 性能测试、负载测试、压力测试关联和区别
  • 石狮网站建设公司哪家好云南建设工程信息网站
  • 易思网站管理系统深圳网站建设专家