Java中堆和栈的区别

堆和栈都是Java用来在RAM中存放数据的地方。


(1)Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销毁。

(2)堆的优势是可以动态地分配内存空间,需要多少内存空间不必事先告诉编译器,因为它是在运行时动态分配的。但缺点是,由于需要在运行时动态分配内存,所以存取速度较慢。


(1)栈中主要存放一些基本数据类型的变量(byte,short,int,long,float,double,boolean,char)和对象的引用。

(2)栈的优势是,存取速度比堆快,栈数据可以共享。但缺点是,存放在栈中的数据占用多少内存空间需要在编译时确定下来,缺乏灵活性。

举例说明栈数据可以共享


String 可以用以下两种方式来创建:

String str1 = new String("abc");String str2 = "abc";

第一种使用new来创建的对象,它存放在堆中。每调用一次就创建一个新的对象。

第二种是先在中创建对象的引用str2,然后查找栈中有没有存放“abc”,如果没有,则将“abc”存放进栈,并将str2指向“abc”,如果已经有“abc”, 则直接将str2指向“abc”。

下面用代码说明上面的理论:

public static void main(String[] args) {       String str1 = new String("abc");       String str2 = new String("abc");       System.out.println(str1 == str2);   }

输出结果为:false

public static void main(String[] args) {       String str1 = "abc";       String str2 = "abc";       System.out.println(str1 == str2);   }

输出结果为:true

因此,用第二种方式创建多个“abc”字符串,在内存中其实只存在一个对象而已。这种写法有利于节省内存空间。同时还可以提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否创建新对象。

(0)

相关推荐

  • java中String str=""与new String()的区别

    常量池: 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据.它包括了关于类.方法.接口等中的常量,也包括字符串常量. 在常量池中存储字符串常量的 ...

  • C#值类型与引用类型

    概要: C#中将数据类型分为值类型(value type)和引用类型(reference type) 值类型: 值类型变量直接包含其本身的数据.在定义一个值类型变量后,将直接为该变量分配空间,可以直接 ...

  • java中AWT和SWing的区别与联系

    AWT和Swing都是java中的包. AWT(Abstract Window Toolkit):抽象窗口工具包,早期编写图形界面应用程序的包. Swing :为解决 AWT 存在的问题而新开发的图形 ...

  • Java中treeset和hashset的区别

    treeset和hashset的区别首先我们来说一下HashSet. HashSet有以下特点 不能保证元素的排列顺序,顺序有可能发生变化 不是同步的 集合元素可以是null,但只能放入一个null ...

  • java中堆栈(stack)和堆(heap)

    (1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...

  • 堆、栈和堆栈的区别

    堆(heap):堆是一种经过排序的树形数据结构,每个结点都有一个值. 栈(stack):它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取.(PS:颇有砌墙的砖--后来者居上的赶脚 ...

  • java中equals,hashcode和==的区别

    java中equals,hashcode和==的区别 1.== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 byte,short,char,int,long,float,d ...

  • java中XML元素和节点的区别

    一.概念 1.元素是一个小范围的定义,必须是含有完整信息的结点才是一个元素. 一个元素一定是一个结点,但是一个结点不一定是一个元素. 2.什么是node? NODE是相对TREE这种数据结构而言的.T ...

  • Java中 a+=b和a=a+b有什么区别?

    在java语言中,a+=b和a=a+b的主要区别是在运算的精度上.类似的有"-= . *= ./= .%= ",这里以a+=b 与 a=a+b 举例说明一下. 1.    下面是一 ...

  • C++中之a[5](栈区)和int a=new int[5](堆区)有什么区别

    C++中之a[5](栈区)和int a=new int[5](堆区)有什么区别