`
supportopensource
  • 浏览: 521727 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java堆和栈的区别 经典总结(转载)

阅读更多
栈与堆都是Java用来在Ram中存放数据的地方。

与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

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

堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢

栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性

栈中主要存放一些基本类型的变量(int、short、 long、byte、float、double、boolean、char)和对象句柄。注意包装类数据,如Integer、String、Double等将相应的基本数据类型包装起来的类。这些不是在栈上的。

栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
int a = 3;
int b = 3; 
编译器先处理int a = 3; 
首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。
这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

String是一个特殊的包装类数据。可以用:
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有放"abc",
如果没有,则将"abc"存放进栈,并令str指向"abc",如果已经有"abc" 则直接令str指向"abc"。

比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。

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");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。

另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。

由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。
分享到:
评论

相关推荐

    JAVA中堆和栈的概念

    声明变量是在栈空间开辟了一个位置,实例化之后才会开辟一个堆空间 被赋予空值的话则是将栈空间地址指向一个新的堆空间位置

    Java中堆内存与栈内存分配浅析

    ### Java中堆内存与栈内存分配浅析 #### 一、引言 在Java编程语言中,内存管理是一项至关重要的技术。程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的...

    Java中堆和栈的区别

    以下代码片段展示了如何在Java中使用栈和堆内存: ```java String a = "abc"; String b = "abc"; String c = new String("abc"); System.out.println(a == b); // true System.out.println(a.equals(b)); // true ...

    Java堆、栈和常量池详解

    易混点完美解析

    java中堆和栈的区别.pdf

    Java中堆和栈的区别 Java是一种面向对象的编程语言,它的内存管理机制是自动化的,程序员不需要手动地分配和释放内存。Java中堆和栈是两个重要的概念,它们都是Java用于在RAM中存放数据的地方。 栈(Stack)是一块...

    java中堆(heap)和堆栈(stack)有什么区别

    "Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,...了解堆栈(stack)和堆(heap)的区别对于 Java 编程非常重要,可以帮助我们更好地理解 Java 的内存管理机制。

    java中堆和栈的区别分析

    总结来说,理解Java中的堆和栈以及它们之间的区别,有助于编写更高效、更稳定的代码,减少不必要的内存开销,并避免潜在的性能问题。在实际编程中,合理利用堆和栈的特点,可以优化程序的运行效率和内存使用。

    Java中堆和栈的区别详解

    总结来说,Java中的堆和栈在内存管理上各有特点:栈内存速度快但容量有限,主要用于存储基本类型和对象引用;堆内存容量大,用于存储对象实例,且支持多线程共享。理解这些区别对于编写高效、稳定的Java程序至关重要...

    Java中堆内存和栈内存详解

    为了更好地理解和使用Java,必须清楚地了解堆内存与栈内存的区别及其工作原理。本文将深入探讨Java中堆内存与栈内存的概念、特点以及它们之间的关系,并通过具体的例子来帮助读者理解这些概念。 #### 二、栈内存 栈...

    Java中的堆和栈[定义].pdf

    Java 中的堆和栈 Java 中的堆和栈是 Java 语言中两个重要的内存区域,它们扮演着不同的角色,管理着 Java 程序中的内存分配和释放。...理解堆和栈的区别和特点非常重要,可以帮助我们更好地编写高效的 Java 程序。

    Java堆、栈和常量池——内存剖析

    ### Java堆、栈和常量池——内存剖析 #### 寄存器 寄存器作为最快的存储区域之一,由编译器自动管理分配与回收,它位于CPU内,用于存储临时变量,例如局部变量和一些操作数。由于寄存器的数量有限且由编译器自动...

    java经典问题总结java经典问题总结

    java经典问题总结java经典问题总结java经典问题总结java经典问题总结java经典问题总结java经典问题总结java经典问题总结java经典问题总结java经典问题总结java经典问题总结java经典问题总结java经典问题总结java经典...

    java中堆与栈的区别

    在Java编程语言中,了解堆与栈的区别对于理解和管理程序的内存使用至关重要。本文将详细解释Java中的堆和栈的概念,以及它们之间的区别。 #### 二、Java堆 Java堆是Java虚拟机(JVM)在运行时用于存储对象实例的主要...

    java 内存中 堆、栈、常量池、方法区的总结

    在Java内存管理中,堆(Heap)、栈(Stack)、常量池(Constant Pool)和方法区(Method Area)是四个核心概念,它们在Java程序运行时扮演着不同的角色。 首先,方法区是用来存放类的信息、常量、静态变量等数据的...

    堆和栈的区别

    ### 堆和栈的区别 在计算机编程领域中,“堆”和“栈”是两种非常重要的内存管理方式,它们在程序运行过程中起着至关重要的作用。对于初学者来说,理解这两种概念之间的区别是非常必要的,这有助于更好地掌握内存...

    Java中的堆和栈.pdf

    Java的内存分为两个主要区域:栈(Stack)和堆(Heap)。理解这两个区域的区别和工作原理对于编写高效、无内存泄漏的代码至关重要。 栈内存主要用来存储基本类型(如int、float、boolean等)的变量和对象的引用。当...

    Java中堆与栈的内存分配.pdf

    Java中的内存分配策略有三种:静态存储分配、栈式存储分配和堆式存储分配。静态存储分配是在编译时就能确定每个数据目标在运行时刻的存储空间需求的。栈式存储分配是由一个类似于堆栈的运行栈来实现的,程序对数据区...

    java 栈和堆区别详细介绍

    总结来说,Java栈和堆的不同点主要在于: - 栈内存是由线程私有的,用于存放局部变量和方法调用的内存空间,垃圾回收机制不会对其进行回收。 - 堆内存是线程共享的内存区域,用于存放所有通过new关键字创建的对象...

    Java中栈内存和堆内存详解

    Java中栈内存和堆内存详解,非常容易理解

    java sip 协议栈实现客户端和服务

    Java Sip 协议栈是用于实现VoIP(Voice over IP)和其他实时通信服务的核心组件。SIP(Session Initiation Protocol)是一种应用层控制协议,主要用于建立、修改和终止多媒体会话,如语音通话、视频会议等。在这个...

Global site tag (gtag.js) - Google Analytics