龙空技术网

码农必备Java基础之数字装箱

博文小火柴 65

前言:

目前大家对“java拆箱装箱”可能比较关切,同学们都想要知道一些“java拆箱装箱”的相关知识。那么小编也在网上汇集了一些关于“java拆箱装箱””的相关内容,希望我们能喜欢,小伙伴们快快来了解一下吧!

一、概念

(一)装箱:Java 中,将原始数字类型转换为对应的 Number 对象的机制叫作装箱。

(二)拆箱:Java 中,将 Number 对象转换为对应的原始类型的机制叫作拆箱。

装箱和拆箱是自动完成的,例如:

List<Integer> list = new ArrayList<>();for(int i=0;i<10 ;i++){   //自动装箱 Integer.valueOf(i)   list.add(i);}

int 被装箱成 Integer,在性能方面是要付出些许代价的,装箱的本质就是将原始类型包裹起来,并保存在堆里。

因此装箱后的值需要更多的内存,其对象需要从堆中获取,进而再获得原始值,有一定性能消耗。

int 等原始类型的变量会放到栈中,由专有的字节码操纵,性能较高,这一点可以参考堆和栈操作。

:用来存储程序中的一些对象,比如你用new关键字创建的对象,它就会被存储在堆内存中,但是这个对象在堆内存中的首地址会存储在栈中。

:在jvm中栈用来存储一些对象的引用、局部变量以及计算过程的中间数据,在方法退出后那么这些变量也会被销毁。它的存储比堆快得多,只比CPU里的寄存器慢。

栈默认内存:1M。

JDK 为了避免每次 int 类型装箱需要创建一个新的 Integer 对象,内部使用了缓存,保存了一定范围的 int 装箱对象,代码如下:

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 是一个 Integer 数组,默认保存了 int 值从-128 到 127 的所有 Inte对象:

private static class IntegerCache {   static final int low = -128;   static final int high;   static final Integer cache[];}

high 的值默认是 127,可以通过-XX:AutoBoxCacheMax=来调整。

装箱对性能的影响并不是很大,但创建过多的对象会加大垃圾回收的负担。有很多开源工具提供了避免自动装箱的 int 专有集合类,比如著名的开源工具 Jodd,提供了 IntHashMap 类、 IntArrayList 类。

JDK 提供了 IntStream,用于 int 操作,提供了通常的 int 求和、平均值、排序等操作。

//返回 6int sum = IntStream.of(1, 2, 3).sum();//返回 3int sum1 = IntStream.builder().add(1).add(2).build().sum();//创建一个 1 到 5(不包含 5)的 int 序列,返回 10int sum2 = IntStream.range(1, 5).sum();

部分内容摘自《高性能Java系统权威指南》第二章

李家智 著

本书特点:

内容上,总结作者从事Java开发20年来在头部IT企业的高并发系统经历的真实案例,极具参考意义和可读性。

对于程序员和架构师而言,Java 系统的性能优化是一个超常规的挑战。这是因为 Java 语言和 Java 运行平台,以及 Java 生态的复杂性决定了 Java 系统的性能优化不再是简单的升级配置或者简单的 “空间换时间”的技术实现,这涉及 Java 的各种知识点。

本书从高性能、易维护、代码增强以及在微服务系统中编写Java代码的角度来描述如何实现高性能Java系统,结合真实案例,让读者能够快速上手实战。

风格上本书的风格偏实战,读者可以下载书中的示例代码并运行测试。读者可以从任意一章开始阅读,掌握性能优化知识为公司的系统所用。

本书适合:

中高级程序员和架构师;

以及有志从事基础技术研发、开源工具研发的极客阅读;

也可以作为 Java 笔试和面试的参考书。

标签: #java拆箱装箱