高新手机网站建设公司,谷歌手机版下载安装,个人网站主题,义乌做网站公司在JAVA中#xff0c;有六个不同的地方可以存储数据#xff1a;
1.寄存器#xff1a;最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈#xff1a;存放基本类型的变量数据和对象的引用#xff0c;但对象本身不存放在栈中#xff0c;而是存放在堆有六个不同的地方可以存储数据
1.寄存器最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈存放基本类型的变量数据和对象的引用但对象本身不存放在栈中而是存放在堆new 出来的对象或者常量池中字符串常量对象存放在常量池中。 3. 堆存放所有new出来的对象。 4. 静态域存放静态成员static定义的 5. 常量池存放字符串常量和基本类型常量publicstatic final。 6. 非RAM存储硬盘等永久存储空间
这里我们主要关心栈、堆对于 栈和常量池中的对象可以共享对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的当没有引用指向数据时这个数据就会消失。堆中的对象的由垃圾回收器负责回收因此大小和生命周期不需要确定 具有很大的灵活性。 对于字符串其对象的引用都是存储在栈中的如果是 编译期已经创建好(直接用双引号定义的)的就存储在常量池中如果是运行期new出来的才能确定的就存储在堆中 。对于equals相等的字符串在常量池中永远只有一份在堆中有多份。
newString(“China”); 对于通过new产生一个字符串 假设为”china”时会先去常量池中查找是否已经有了”china”对象如果没有则在常量池中创建一个此字符串对象然后堆中再创建一个常量池中此”china”对象的拷贝对象。这也就是有道面试题Strings new String(“xyz”);产生几个对象一个或两个如果常量池中原来没有”xyz”,就是两个。 局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。(形式参数是局部变量) 成员变量存储在堆中的对象里面由垃圾回收器负责回收 Java内存分配中的栈
在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时Java在栈中为这个变量分配内存空间当该变量退出其作用域后Java会自动释放掉为该变量所分配的内存空间该内存空间可以立即被另作他用。栈的优势是存取速度比堆要快仅次于寄存器栈数据可以共享。但缺点是存在栈中的数据大小与生存期必须是确定的缺乏灵活性。
栈有一个很重要的特殊性就是存在栈中的数据可以共享。假设我们同时定义 int a 3; int b 3 编译器先处理int a 3首先它会在栈中创建一个变量为a的引用然后查找栈中是否有3这个值如果没找到就将3存放进来然后将a指向3。接着处理int b 3在创建完b的引用变量后因为在栈中已经有3这个值便将b直接指向3。这样就出现了a与b同时均指向3的情况。这时如果再令a4那么编译器会重新搜索栈中是否有4值如果没有则将4存放进来并令a指向4如果已经有了则直接将a指向这个地址。因此a值的改变不会影响 到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的因为这种情况a的修改并不会影响到b, 它是由编译器完成的它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态会影响到另一个对象引用变量。 什么是引用变量 引用变量就相当于是为数组或对象起的一个名称以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。 回过头再来看代码
实际上里面分解成了四个步骤。
Case cc; 在栈内存里面开辟了空间给引用变量cc这时ccnull
ccnew Case();1. new Case()在堆内存里面开辟了空间给Case类的对象这个对象没有名字
2. Case()随即调用了Case类的构造函数
3. 把对象的地址在堆内存的地址给引用变量cc这样我们就明确了 Java中这里的“”并不是赋值的意思而是把对象的地址传递给变量 对象创建出来其实连名字都没有因此必须通过引用变量来对其进行操作。
Java内存分配中的堆
堆内存用来存放由new创建的对象和数组。在堆中分配的内存由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后还可以在栈中定义一个特殊的变量让栈中这个变量的取值等于数组或对象在堆内存中的首地址栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或者对象起的一个名称。 引用变量是普通的变量定义时在栈中分配引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外数组和对象本身占据的内存不会被释放数组和对象在没有引用变量指向它的时候才变为垃圾不能在被使用但仍然占据内存空间不放在随后的一个不确定的时间被垃圾回收器收走释放掉。这也是 Java 比较占内存的原因。堆的优势是可以动态地分配内存 大小生存期也不必事先告诉编译器因为它是在运行时动态分配内存的Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是由于要在运行时动态分配内存存取速度较慢。
实际上栈中的变量指向堆内存中的变量这就是Java中的指针