1 . java中5个存放数据或对象的地方:
(1).寄存器(Registers):位于CPU内部,是速度最快的存储区,但是数量和容量有限。在java中不能直接操作寄存器。
(2).栈(Stack):栈位于通用随机访问存储器 (General random-access memory,RAM,内存) 中,通过处理器的栈指针访问,栈指针从栈顶向栈底分配内存,从栈底向栈顶释放内存。栈是仅次于寄存器的速度第二快的存储器,在java程序中,一般的8种基本类型数据和对象的引用通常存放在栈内存中,不通过new关键字的字符串对象也是存放在栈的字符串池中。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
(3).堆(Heap):也是位于通用随机访问存储器 (General random-access memory,RAM,内存) 中的共享内存池。Java的堆是一个运行时数据区,类的对象从中分配空间,凡是通过new关键字创建的对象都存放在堆内存中,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
(4).常量存储器(Constant storage):java中的常数值通常直接置于程序代码内部(final修饰),或存放在系统内嵌的只读存储器中(read-only memory,ROM)的,更严格.
(5).非随机存储器(Non-RAM storage):对于流对象和持久化对象,对于流式对象,对象会变成字节流,通常会发给另一台机器。持久化对象通常存放在程序外的存储器,如硬盘。
2.特例:基本类型
new一个对象存储在堆里,因此用new创建一个对象——特别是小的,简单的变量往往不是很有效的。
对于这些类型,Java采取不用new来创建变量,而是创建一个并非是引用的自动变量(直接存储值,并且存储在堆栈中)。
Java语言对于每种基本类型所占存储空间大小是固定的,不像其他语言随机器硬件架构的变化而变化。(可移植性更高)
/**
* 基本类型创建的不是引用,而是一个自动变量,直接存储值,并且存储在栈中,性能更高
* 基本类型都有相对应的包装器类,能在堆中创建一个非基本对象,用来表示相对应的基本类型。
* 如果是用包装类型(Integer,Character)会放入堆中
*/
//基本类型
int i = 5;
//包装类型
Integer integer = new Integer(i);
//Java SE5自动包装
Integer integer1 = 4;
//反向转换
int i1 = integer1;
2.1 高精度数字
Java 1.1 增加了两个类,用于进行高精度的计算:BigInteger 和BigDecimal。尽管它们大致可以划分为
“封装器”类型,但两者都没有对应的“主类型”。这两个类都有自己特殊的“方法”.
运算需要调用方法才行,计算速度慢些,但换来高精度.
3. 数组
创建对象数组时,实际创建的是一个引用数组。而且每个引用都会自动初始化成一个特殊值,并带有自己的
关键字:null(空)。一旦Java 看到null,就知道该句柄并未指向一个对象。正式使用前,必须为每个引用都分配一个对象
4. Java只处理public和protected访问控制权限成员的文档注释,private和默认的包访问控制权限成员的文档注释将被忽略。