一,Java中的数据存储的区域
- 在程序运行,有五个不同的地方可以存储数据:
-
寄存器(register)。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。
-
栈(stack)。位于通用RAM((random-access memory )随机访问在存储器)中,但通过堆栈指针可以从处理器哪里获得直接支持。栈中主要存放基本类型的变量数据和对象的引用(方法)
-
堆(heap)。一种通用的内存池也位于RAM区,用于存放所有的Java对象。堆不同于栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间,所以在分配空间的时候毕竟灵活,但用堆进行存储分配比用堆栈进行存储存储需要更多的时间
- 栈的优势:存取速度比堆要快,仅次于直接位于CPU中的寄存器。缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。
- 堆的优势:是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。缺点:由于要在运行时动态分配内存,存取速度较慢 。
-
常量存储:常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。
-
非RAM存储:非RAM存储,如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。两个基本例子(流对象和持久化对象)
二,关于继承的笔试题
- 初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数
- 子类继承父类时的初始化顺序:
-
首先初始化父类的static变量和块,它们的级别是相同的,按照代码中出现的顺序初始化
-
初始化子类的static变量和块,它们的级别是相同的,按照代码中出现的顺序初始化
-
初始化父类的普通成员变量,调用父类的构造函数
-
初始化子类的普通成员变量,调用子类的构造函数
三,Java中的2个高精度类
BigInteger和BigDecimal:这两个类包含的方法、提供的操作与对基本类型所能执行的操作相似,只不过是以方法调用方式取代运算符方式来实现。等于是用速度换取了精度。
BigInteger支持任意精度的整数,在运算中可以准确地表示任何大小的整数值,而不会丢失任何信息。BigDecimal支持任何精度的定点数,可以用它进行精确的货币计算。
它们都扩展Number类且实现Comparable接口,可以使用new BigInteger(String)或new BigDecimal(String)来创建实例,使用add(加),substract(减),multiple(乘),divide(除)和remainder(%)方法完成算数运算,使用compareTo方法比较两个大数字。