存储的地方
在Java中有五个不同的地方可以存储数据:
- 寄存器,这是最快的存储区,它位于处理器的内部,是最高效也是最少量的存储区。在Java中不能直接控制,也不能在程序中感受到寄存器的存在,它都是由系统自动分配的。
- 堆栈,位于通用的RAM中,通过堆栈指针就可以实现对堆栈的操控,若指针向下移动则分配新的内存,向上移动则释放内存。这是一种快速有效的存储方式,仅次于寄存器。但是,在分配堆栈空间时,必须向系统提供堆栈所有项的生命周期,以便上下移动指针,否则堆栈将会溢出。这一约束限制了程序的灵活性,虽然Java的一些数据存储在堆栈中,但Java对象并存储在这其中。
- 堆,也是位于RAM中,用于存放所有的Java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多久,因此,在堆里分配存储有很大的灵活性,但这种灵活性要付出相应的代价:用堆进行储存分配和清理可能比用堆栈进行存储分配需要更多的时间(这也就是Java的性能不如C++的主要原因)。
- 常量存储,常量值通常直接放在程序代码的内部,这样做比较安全,因为它永远也不会改变,也可以把它放在ROM(只读存储器)中
- 非RAM存储,数据完全存活在程序之外,不受程序控制,在程序没有运行时也能存活。一般指持久化对象(数据库等)和流对象,在流对象中,对象转化成字节流,发送到另一个机器中。在持久化对象中,对象放在磁盘上。在需要时,把对象转化成基于RAM的对象。
基本类型
基本类型 | 大小 | 最大值 | 最小值 | 包装类型 |
---|---|---|---|---|
boolean | 1bit | - | - | Boolean |
char | 16bit | Unicode0 | Unicode2^16-1 | Character |
byte | 8bit | -128 | +127 | Byte |
short | 16bit | -2^15 | +2^15-1 | Short |
int | 32bit | -2^31 | +2^31-1 | Integer |
long | 64bit | -2^63 | +2^63-1 | Long |
float | 32bit | IEEE754 | IEEE754 | Float |
double | 64bit | IEEE754 | IEEE754 | Double |
Java提供了两个用于高精度计算的类:BigInteger和BigDecimal,一个用于整型,另一个用于浮点型。
通常,表达式中出现最大的数据类型决定了表达式最终结果的数据类型,如float和double相加,最终结果为double;如果要使最终结果变成其他的数据类型,则要用到类型转换,但这有可能会导致数据的丢失。