在程序运行的过程中,对象的放置安排,内存的分配机制需要我们去了解。
(1)寄存器:
最快的存储区,位于处理器的内部,寄存器的数量极其有限,寄存器会根据需求来进行分配,我们无法直接控制,也无法再程序内部感到寄存器存在的任何迹象。
(2)堆栈:
位于通用RAM(随机访问存储器)中,可以通过堆栈指针从处理器获得直接支持,当堆栈指针向下移动时,分配新的内存;向上移动时,释放内存。分配的速度仅次于寄存器。当创建程序时,必须知道在堆栈中的所有项的确切生命周期,以便上下移动指针,对象引用存放在堆栈中但对象并不存储在其中。
(3)堆:
一种通用的内存池,也位于RAM中,用于存放JAVA中的所有对象,编译器并不需要知道存储数据在堆中存活的时间,在堆内分配存储有很大的灵活性。需要对象时用“new”关键字写一行代码,执行代码时,自动在堆内进行存储分配,用堆进行存储分配和清理要比堆栈需要更多的时间。
(4)常量存储:
常量值通常直接存放于程序的代码内部,它们永远不会被改变。在嵌入式系统中,常量本身会和其它部分分离开来,可以将其放置在ROM(只读存储器)中。
(5)非RAM存储:
若数据完全活在程序外部,不依赖于程序时,它可以不受程序的任何控制,即使程序未运行依然可以存在,比如流对象和持久化对象。对于流对象来说,对象转化为字节流,发送给另一台机器;对于持久化对象来说,通常存放于磁盘上,即使程序终止,仍可以保持自己的状态。此存储方式的技巧在于:把对象转化为可以存放在任何其它媒介的事物上,在需要时,恢复为常规的、基于RAM的对象。
在程序设计的过程中,经常需要用到一系列类型,也就是基本数据类型,它们需要特殊对待,由于用“new”创建小的,简单的变量时并不十分有效,所以JAVA创建一个并非是引用的自动变量,此变量直接存储值,并置于堆栈中,JAVA中每种基本数据类型所占据的存储空间大小不会随机器硬件架构的变化而变化,这也是JAVA的可移植性比其它语言好的一项重要原因。
JAVA中提供了两个用于高精度计算的类:BigInteger和BigDecimal。虽然也属于包装器类,但二者并没有对应的基本类型,能够作用于int和float的操作,也同样可以作用于BigInteger和BigDecimal,但必须以方法调用的方式取代运算符的实现。运算速度会变慢,是一种以速度换精度的方式。
BigInteger支持任何精度的整数,可以准确表示任何大小的整数值而不丢失任何信息。
BigDecimal支持任何精度的定点数,可以用它进行精确的货币运算。
在JAVA中创建一个数组对象时,实际上是创建了一个引用数组,并且每个引用都自动被初始化为一个特定值,即NULL,一旦JAVA看到NULL,则认为此引用并未指向某个特定对象,在使用任何引用之前,都必须为其指定一个对象,否则编译器报错。