`

堆栈区别

 
阅读更多

 

原文:http://www.iteye.com/topic/634530

 

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间

这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
如以下代码:

Java代码  收藏代码
  1. String s1 =  "china" ;  
  2. String s2 = "china" ;  
  3. String s3 = "china" ;  
  4. String ss1 = new  String( "china" );  
  5. String ss2 = new  String( "china" );  
  6. String ss3 = new  String( "china" );  
	String s1 = "china";
	String s2 = "china";
	String s3 = "china";
	String ss1 = new String("china");
	String ss2 = new String("china");
	String ss3 = new String("china");


这里解释一下黄色这 3 个箭头,对于通过 new 产生一个字符串(假设为 ”china” )时,会先去常量池中查找是否已经有了 ”china” 对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此 ”china” 对象的拷贝对象。这也就是有道面试题: String s = new String(“xyz”); 产生几个对象?一个或两个,如果常量池中原来没有 ”xyz”, 就是两个。



对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。
如以下代码:

Java代码  收藏代码
  1. int  i1 =  9 ;  
  2. int  i2 =  9 ;  
  3. int  i3 =  9 ;   
  4. public   static   final   int  INT1 =  9 ;  
  5. public   static   final   int  INT2 =  9 ;  
  6. public   static   final   int  INT3 =  9 ;  
	int i1 = 9;
	int i2 = 9;
	int i3 = 9;	
	public static final int INT1 = 9;
	public static final int INT2 = 9;
	public static final int INT3 = 9;




对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。
形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。
成员变量存储在堆中的对象里面,由垃圾回收器负责回收。
如以下代码:

Java代码  收藏代码
  1. class  BirthDate {  
  2.     private   int  day;  
  3.     private   int  month;  
  4.     private   int  year;      
  5.     public  BirthDate( int  d,  int  m,  int  y) {  
  6.         day = d;   
  7.         month = m;   
  8.         year = y;  
  9.     }  
  10.     省略get,set方法………  
  11. }  
  12.   
  13. public   class  Test{  
  14.     public   static   void  main(String args[]){  
  15. int  date =  9 ;  
  16.         Test test = new  Test();        
  17.            test.change(date);   
  18.         BirthDate d1= new  BirthDate( 7 , 7 , 1970 );         
  19.     }    
  20.   
  21.     public   void  change1( int  i){  
  22.         i = 1234 ;  
  23.     }  
class BirthDate {
    private int day;
    private int month;
    private int year;    
    public BirthDate(int d, int m, int y) {
        day = d; 
        month = m; 
        year = y;
    }
    省略get,set方法………
}

public class Test{
    public static void main(String args[]){
int date = 9;
        Test test = new Test();      
		   test.change(date); 
        BirthDate d1= new BirthDate(7,7,1970);       
    }  

    public void change1(int i){
    	i = 1234;
    }



}


对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化:
1. main方法开始执行:int date = 9;
date局部变量,基础类型,引用和值都存在栈中。
2. Test test = new Test();
test为对象引用,存在栈中,对象(new Test())存在堆中。
3. test.change(date);
i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。
4. BirthDate d1= new BirthDate(7,7,1970); 
d1 为对象引用,存在栈中,对象(new BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。 day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。
5.main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(),new BirthDate()将等待垃圾回收。

分享到:
评论

相关推荐

    C-C++中堆栈的区别

    理解这两者的区别对于优化程序性能和避免内存管理问题至关重要。 首先,栈(Stack)是程序运行时由编译器自动管理的内存区域。栈上的内存分配遵循“后进先出”(LIFO)原则,这与数据结构中的栈类似。栈主要用于...

    堆栈内存区别

    ### 堆栈内存区别详解 在计算机编程与运行环境中,堆栈(Heap vs Stack)是两种关键的数据存储区域,它们各自拥有独特的属性与管理方式,对于程序的性能与资源管理有着深远的影响。本文将深入解析堆栈的区别,探讨...

    C51堆栈构成与空间需求分析

    这与硬件堆栈有所区别,硬件堆栈是指单片机内置的系统堆栈,它在内部RAM中,并且大小有限。模拟栈的概念对于设计中需要重入函数的应用场景来说,非常重要。 标签中的"C51堆栈"是一个关键词,指出了本文主题的具体...

    线性表、堆栈、队列

    线性表、堆栈和队列是数据结构与算法中的基础概念,它们在计算机科学中扮演着重要角色。本文将详细讲解这三个概念以及C++实现的相关知识点。 首先,线性表是一种最基本的数据结构,它是由n(n>=0)个相同类型元素...

    java 堆栈的演示程序

    4. 深入理解JVM的内存模型,特别是堆栈和堆的区别,以及垃圾回收对堆的影响。 总之,这个"java 堆栈的演示程序"为我们提供了一个实践和学习Java内存管理的绝佳机会,无论是对于初学者还是经验丰富的开发者,都能...

    堆栈的区别

    #### 三、堆栈区别总结 1. **内存分配方式**: - 堆内存支持动态分配,而栈内存则是在程序执行前就已经确定大小。 2. **生命周期**: - 堆内存分配的对象生命周期不确定,直到被垃圾回收;栈内存中的数据随着...

    教你识别背照式和堆栈式摄像头元件的区别

    【摄像头元件】是现代智能手机摄像头的关键组成部分,主要分为两种类型:背照式传感器和堆栈式传感器。这两种传感器的设计差异显著影响了它们的性能和成像质量。 **背照式传感器(Backside Illumination Sensor)**...

    操作系统中的堆栈的经典解释

    本文将深入探讨操作系统层面的堆栈概念及其区别,并结合具体的代码实例进行说明。 #### 一、基本概念 **1. 堆栈(Stack)** - **定义**: 堆栈是一种后进先出(Last In First Out, LIFO)的数据结构,在内存中表现...

    JVM堆栈性能分析

    Thread Dump 是非常有用 Java应用问题的工具。每一个 Java 虚拟机 都有及时生成所有线程在某...照,及JVM 中所有 Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名 及所执行的方法,如果可能的话还有源代码的行数。

    堆栈的名词解释

    #### 四、堆栈之间的区别 1. **内存分配方式**: - 堆:手动分配与释放,使用`new`或`malloc`等函数。 - 栈:自动分配与释放,由编译器管理。 2. **内存分配效率**: - 堆:分配和释放开销大。 - 栈:分配和...

    MCS-51单片机的堆栈及其应用

    - 需要注意子程序调用与中断之间的区别,特别是在处理中断返回时。 - 通常情况下,子程序与中断服务程序不宜混用,因为中断返回指令(RETI)还会重新启用之前被禁用的中断功能。 - 在编写中断服务程序时,需要考虑中断...

    关于堆栈的详细介绍

    通过对堆栈的基本概念及其在数据结构与程序内存管理两个维度的深入探讨,我们不仅了解了堆栈各自的特点和应用场景,还掌握了它们之间的主要区别。对于C/C++程序员而言,深入理解这些概念有助于提高编程效率,避免...

    队列 堆 栈 堆栈的区别

    ### 队列、堆、栈与堆栈的区别 #### 队列 队列是一种遵循先进先出(First In First Out, FIFO)原则的数据结构。这意味着最先加入队列的元素将会是最先被移除的元素。队列常用于处理需要按照顺序执行的任务集合,...

    栈和堆栈的区别.doc

    ### 栈和堆栈的区别详解 #### 一、程序的内存分配 在深入探讨栈和堆的区别之前,我们首先需要了解程序在运行时是如何管理内存的。程序在运行时主要可以划分为以下几部分: 1. **栈区(Stack)**: - 分配与释放...

    数据结构 堆栈和队列

    * 另设一个标志位以区别队列是满还是空。 堆栈和队列是两种基本的数据结构,它们在计算机科学中有广泛的应用。理解堆栈和队列的实现原理和特点是非常重要的,才能更好地应用它们来解决实际问题。

    编程中堆栈的区别

    以下是对堆和栈区别的详细解释: 1. **预备知识:程序内存分配** - **栈区(Stack)**:栈是用于存放函数参数值和局部变量的地方,由编译器自动分配和释放。它的特点是后进先出(LIFO),类似数据结构中的栈。 - ...

    java堆栈的区别 -- 详解

    ### Java堆栈的区别详解 #### 一、预备知识—程序的内存分配 程序在运行时,根据不同的数据类型和用途,会被分配到不同的内存区域。这些区域包括: 1. **栈区(Stack)**:这部分内存由编译器自动管理,主要用于...

    栈和堆栈的区别和联系

    标题和描述中的核心知识点主要集中在计算机科学领域中的数据存储机制,特别是栈(stack)和堆(heap)的区别和联系。为了深入理解这些概念,我们不仅需要掌握它们的基本定义,还要了解它们在实际编程中的应用以及与其他...

    C++中堆和栈的区别

    "C++中堆和栈的区别" C++中堆和栈是两种不同的内存分配方式,它们在编程中扮演着重要的角色。理解堆和栈的区别是非常必要的,因为它关系到程序的正确性、效率和可靠性。 堆(Heap)是一种动态内存分配方式,它是由...

    什么是堆栈

    堆栈是编程语言中非常重要的概念,今天我们将深入剖析堆栈的概念,并详细解释堆和栈的区别。 首先,让我们来了解堆栈的五个内存分区。在 C++ 中,内存被分成五个区:堆、栈、自由存储区、全局/静态存储区和常量存储...

Global site tag (gtag.js) - Google Analytics