对象存储
数据存储
在Java中,有五个不同的地方可以存储数据: - 寄存器: - 最快的存储区域,位于CPU内部 - 但是数量有限,因此寄存器会根据需求分配 - 对于寄存器,我们没有直接的控制权,也无法在自己的程序里找到寄存器存在的踪迹 - 栈内存: - 存在于常规内存RAM区域中,可以通过栈指针获得处理器的直接支持 - 这是一种仅次于寄存器的非常快速有效的分配存储方式 - 创建程序时,Java系统必须知道栈内保存的所有项的生命周期 - 虽然栈内存上存在一些Java数据,但Java对象本身的数据却是保存在堆内存中 - 堆内存: - 一种通用的内存池,所有的Java对象都存储在这里 - 与栈内存不同,编译器不需要知道对象必须在堆内存上停留多长时间,因此,使用堆内存保存数据更具灵活性 - 使用new命令实例化一个对象时,会自动在堆中进行内存分配 - 常量存储: - 常量值通常直接放在程序代码中 - 如需严格保护,可以考虑将他们置于只读存储器ROM中 - 非RAM存储: - 数据完全存在于程序之外,在程序未运行以及脱离程序控制后依然存在 - 两个主要的例子: - 序列化对象:对象被转化为字节流,通常被发送到另一台机器 - 持久化对象:对象被放置在磁盘上,即使程序终止,数据依然存在 - 这些存储方式都是将对象转存到另一个介质中,并且在需要时恢复成常规的、基于RAM的对象
基本类型的存储
- 在Java中,基本类型的创建并不是通过new关键字来产生
通常new出来的对象都是保存在堆内存中,以此方式创建小而简单的变量往往时不划算的
- 对于基本类型的创建方法,Java令其位于占内存中(与C/C++)一致
数组的存储
- 在Java中,数组使用前需要被初始化,并且不能访问数组长度以外的数据
这种范围检查,是每个数组上少量内存开销及运行时检查下表的额外时间为代价的,但一次换来的安全性和效率的提高是值得的
- 当我们创建对象数组时,实际上是创建了一个引用数组,并且每个引用的初始值都为null
- 我们还可以创建基本类型数组,编译器通过将数组的内存全部置零来保证初始化