当前位置:首页 > 青鸟知识 > java

java中的栈与堆的特点及区别

来源:长沙北大青鸟 发布日期:2017-04-10

  栈的容量小、速度快、适合存放小型数据;如基本数据类型和对象类型的引用;在栈中变量直接指向存放变量值的空间;对于对象引用则存放对象在堆中的内存地址。堆的特点和栈相反,因此适合存放对象本身。

  栈与堆都是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的情况

1.gif

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

2.gif

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

3.gif

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


拒绝套路 试听有礼

数据已加密保证您的信息安全