1.存储到什么地方?
1.寄存器:这是存储最快的存储区,因为它位于不用于其他存储区的地方–处理器内部。但是寄存器的数量极其有限,所以寄存器根据需要进行分配,你不能直接控制,也不能在程序中感觉到寄存器的存在的任何迹象(另一方面,C和C++允许您向编译器建议寄存器的分配方式)
2.堆栈:位于通用RAM(随机访问存储器)中,但是通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动就是分配新的内存,若向上移动,则释放那些内存,这是一种快速有效的分配存储方式,仅次于寄存器。创建程序时吗Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。这一个约束限制了程序的灵活性,所以虽然某些Java数据存储于堆栈中–特别时Java对象的引用,但是Java对象不是存于其中。
3.堆:一种通用的内存池(位于RAM区),用于存放Java中所有的对象。对不同于堆栈的好处时:编译器不需要知道存储的数据在堆里的存活多长时间。因此在堆里分配内存有很大的灵活性。当需要一个对象时,只需要用new写一行简单的代码,当执行代码的时,会自动在堆里进行存储分配。用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间。
4.常量存储:常量值通常直接存放在程序代码中,这样做很安全,因为他们永远不会被改变。有时在嵌入式系统中,常量本身会和其他部分隔离开,所以在这种情况,可以选择将其存放在ROM(只读存储器)中
5.非RAM存储:如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没用运行的时候也可以存在(流对象和持久化对象)。
特例: Java中的基本数据类型的变量直接存储“值”,并置于堆栈中,因此更加高效。
2.基本数据类型
boolean类型所占的存储空间没有明确指定,仅定义为能够去字面值 true或false
基本数据类型 | 存储空间大小 | 包装类型 |
---|---|---|
boolean | – | Boolean |
byte | 1byte | Byte |
char | 2byte | Character |
short | 2byte | Short |
int | 4byte | Integer |
float | 4byte | Float |
double | 8byte | Double |
long | 8byte | Long |
void | – | Void |
3.JAVA中的数组
在C和C++中使用数组时很危险的,因为C和C++中的数据就是内存块,如果一个程序要访问其自身内存块之外的数组,或在数据初始化前使用内存,都会产生难以预料的后果。
Java中不会出现如此问题是因为:Java确保数据会被初始化,而且不能在它的范围之外访问。这种范围检查,是以每个数组上少量的内存开销及运行时下标检查位代价的。当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化成一个特定的值,该值拥有自己的关键字null。
高精度数据
BigInteger 支持任意精度的整数,可以精确的表示任何大小的整数值
BigDecimal 支持任何精度的定点数,例如精确的货币计算
作用域
作用域决定了其内定义的变量名的可见性和声明周期
在作用域里定义的变量只可作用于作用域结束之前
对象的作用域
Java对象不具备和基本类型一样的生命周期
public static void main(String[] args){}
args并未用到,但是Java编译必须这么做,因为args要用来存储命令行参数。