int和interger的区别(续)
原始数据类型为⼋⼤类
我们先复习⼀下我们学过的
int :基本数据类型,不⽤声明直接使⽤java valueof
interger:是int的封装类。需要声明,但是JAVA给其⾃动装箱开箱(抽象为类,new ⼀个对象)的功能,让其可以⾃由像int⼀样⾃由赋值
interger的值缓存,java5提供了静态⼯⼚⽅法valueof
但是有valueof的限制,调⽤⼀个缓存机制,interger取值范围在-128—127之间,且只能在这个范围内⽐较
问题1:编译阶段、运⾏时,⾃动装箱/⾃动拆箱是发⽣在什么阶段?
⾃动装箱和开箱其实是⼀种语法糖,Java平台⾃动为我们进⾏了⼀些转换,保证在编译时⽣成的字节码是⼀致的。
javac⾃动把装箱转换成了Interger.valueOf(),把开箱转换成了Interger.intValue(),装箱的时候调⽤了⽅法,肯定也应⽤到了缓存机制
问题2:使⽤静态⼯⼚⽅法valueof会使⽤缓存机制,那么⾃动装箱的时候,缓存机制其作⽤吗?
上⼀题已经回答了
这⼀种缓存机制并不是interger独有,同样存在其他基本类型的包装类:
如:1.Boolean,缓存了true/false对应实例,确切说,只会返回两个常量实例Boolean.TRUE/FALSE
2.Short,同样缓存了-128—127之间的数值
3.Byte 数值有限,所以全部被缓存
4.Character,缓存范围’\u0000’—’\u007F’
⾃动装箱和开箱很酷,有什么需要注意的吗?
原则上尽量避免⽆意识的开箱装箱,尤其是性能敏感的场合,创建10万个java对象是相对于创建10万个整数的是⾼量级,不管是内存占⽤还是处理时速度都会变慢
问题3:为什么我们需要原始数据类型,Java的对象似乎也很⾼效,应⽤中具体会产⽣哪些差异?
使⽤原始数据类型,数组甚⾄本地代码实现。在性能极度敏感的场景,⽤其替换掉包装类,动态数组
问题4:阅读过Interger源码吗?分析下类或者某些⽅法的设计要点
虽然interger的默认缓存值为-128-127,但是我们也可以根据需要调整,调整代码为:
-XX:AutoBoxCacheMax=N
这些都体现在java.lang.Interger的静态代码初始块⾥
**Interger等包装类,定义了SIZE或者BYTES这样的常量,**这样的设计考虑是因为在32或者64位中JDK中,不需要移植⼯作。
原始类型线程安全
java原始数据类型和引⽤类型局限性
原始数据类型并不能和泛型⼀起使⽤
java的对象都是引⽤类型,如果⼀个原始数据类型数组,它在内存⾥是⼀段连续的内存,⽽对象数组则不然,往往分散于存储堆的不同位置,这种设计虽然带了极⼤的灵活性,也导致了数据操作的低效。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。