原始数据类型有8种
让我们先复习一下我们学到的东西
int :基本数据类型,不声明而直接使用
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,缓存范围’\ u 0000’—’_ 007 f’
自动装箱和开箱很酷,有什么需要注意的吗?
原则上,尽量避免无意识的开箱。 特别是对性能敏感的情况下,创建10万个java对象比创建10万个整数更高级,而且内存消耗和处理时间都更慢
问题3:为什么我们需要原始数据类型,Java的对象似乎也很高效,应用中具体会产生哪些差异?
使用原始数据类型、数组甚至本地代码实现。 在性能极为敏感的场景中,替换包类、动态数组
问题4:阅读过Interger源码吗?分析下类或者某些方法的设计要点
interger的缺省缓存值为-128-127,但您也可以根据需要调整代码。
-XX:AutoBoxCacheMax=N
所有这些都出现在java.lang.Interger静态代码的初始块中
包类如**Interger )定义了常量如SIZE和BYTES )。 **之所以会考虑这样的设计,是因为32位和64位中的JDK不需要移植。
原始类型线程安全
java原始数据类型和引用类型局限性
原始数据类型不能与泛型类型一起使用
java中的所有对象都是引用类型。 对于原始数据类型数组,它是内存中的连续内存;而对于对象数组,它往往分布在存储堆栈的不同位置。 这样的设计非常灵活,但会带来数据操作的低效率。