[ Java学习 ] 其他知识总结(重要)

   这些总结,来自老师发给我们的资料,我做了重点的高亮,和一些细小的修改工作。

  

   我只能算是资料的搬运工,整理出来,让有需要的人能够找到看到,同时也是方便自己日后的复习和查阅。

我后来找了一下,真正的原创的博主的博客地址(这篇文章里有些是超链接,可直接点击),但是有时,如果找到多个博客,比较难分辨究竟谁才是原创,这种情况,我就没有标明地址了

 ----------------------------------------------------------------------------------------------------------------------------------------------

Java的存储区

来源:常量池、栈、堆的比较

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.

2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)

3. 堆:存放所有new出来的对象。

4. 静态域:存放静态成员(static定义的)

5. 常量池:存放字符串常量和基本类型常量(public static final)。

6. RAM存储:硬盘等永久存储空间

我们主要关心栈,堆和常量池。

    栈和常量池中的对象可以共享, 堆中的对象不可以共享。

栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。

堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。

  字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

对于通过new产生一个字符串(假设为”china”)时,会先去常量池中查找是否已经有了china”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此china”对象的拷贝对象。

这也就是有道面试题:String s = new String(xyz);产生几个对象?一个或两个,如果常量池中原来没有”xyz,就是两个。

对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。

 

对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化

形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。

成员变量存储在堆中的对象里面,由垃圾回收器负责回收

Javaprintprintfprintln的区别

来源:

javaprintfprintprintln,区别及用法详解

print将它的参数显示在命令窗口

printf主要是继承了C语言的printf的一些特性,可以进行格式化输出

print就是一般的标准输出,但是不换行print将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后。

println("test")相当于print("test ")就是一般的输出字符串。println 将它的参数显示在命令窗口,并在结尾加上换行符,将输出光标定位在下一行的开始。

System.out.printf("the number is: %d",t);
参照JAVA API的定义如下:
'd' 整数 结果被格式化为十进制整数
'o' 整数 结果被格式化为八进制整数
'x', 'X' 整数 结果被格式化为十六进制整数
'e', 'E' 浮点 结果被格式化为用计算机科学记数法表示的十进制数
'f' 浮点 结果被格式化为十进制数
'g', 'G' 浮点 根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。
'a', 'A' 浮点 结果被格式化为带有效位数和指数的十六进制浮点数

java中内存主要包含4

来源: java对象在内存中的分配

java中内存主要包含4块,即heap(堆内存)stack(栈内存)data segment(静态变量或是常量存放区)codesegment(方法区).


堆内存中存放的是new出的对象new出的对象只包含成员变量
栈内存中:存放的是局部成员变量对于基本的数据类型存放的是基本变量的值,而对于对象变量,存放的是堆内存的地址。 
静态、常量区:存放的是静态变量(类变量)或是常量
方法区:存放的是对象的方法。因此即使new出多个对象也是只是存在一个方法

Java 中保存数据6个位置

来源:关于Java重要的基础知识

有六个地方都可以保存数据:

(1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹

(2) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中

(3) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间

(4) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间

(5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器ROM)。

(6) RAM存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给另一台机器。而对于固定对象对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变

对于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将它们恢复成普通的、基于RAM的对象Java 1.1提供了对Lightweight persistence的支持。未来的版本甚至可能提供更完整的方案

原文地址:https://www.cnblogs.com/mofushaohua/p/7789367.html