博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】java中堆和栈的区别
阅读量:6325 次
发布时间:2019-06-22

本文共 1376 字,大约阅读时间需要 4 分钟。

转自:

栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

一、堆

    Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的。

优点:可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据

缺点:由于要在运行时动态分配内存,存取速度较慢。

二、栈

    当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄。

优点:存取速度比堆要快,仅次于寄存器,栈数据可以共享

缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

三、举例

1.

int a = 3;  int b = 3;    

解析:  编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况

 2.

String str = new String("abc");  String str = "abc";

解析:第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。 

而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。

3.

String str1 = "abc";  String str2 = "abc";  System.out.println(str1==str2); //true  可以看出str1和str2是指向同一个对象的。    String str1 =new String ("abc");  String str2 =new String ("abc");  System.out.println(str1==str2); // false  用new的方式是生成不同的对象。每一次生成一个。

解析:用第一种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已。这种写法有利于节省内存空间。同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。

 

其实java中也存在指针,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!理解了堆和栈的区别才能更好的分析内存。

你可能感兴趣的文章
【R】 如何获取对象中的变量
查看>>
2013第4周五最重要的J2EE实践摘录
查看>>
从win到linux的小问题集锦(不断更新中)
查看>>
【Android】 Bitmap出现 decoder->decode returned false 错误
查看>>
数据库中存储过程和函数的区别
查看>>
2、单机运行环境搭建之 --CentOS-6.5安装配置Tomcat7
查看>>
11个rsync使用实例
查看>>
设置SQLSERVER的错误日志数量和查找SQLSERVER安装错误日志
查看>>
SQL知识点(一)
查看>>
以上下文(Context)的形式创建一个共享数据的容器
查看>>
【ASP.NET 进阶】验证码的实现
查看>>
python 字符串特点
查看>>
C语言中随机数的产生
查看>>
python基础学习笔记(十)
查看>>
三种三栏网页宽度自适应布局方法
查看>>
NSubstitute完全手册(三)设置返回值
查看>>
微软受冷落:遭遇传统合作伙伴“大叛逃”
查看>>
[ubuntu] ubuntu13.04 64bit,安装FastDFS4.06过程遇到的问题和解决方案
查看>>
mysql笔记五:权限管理
查看>>
强势回归 Qt让跨平台快速迈向移动化
查看>>