精华内容
下载资源
问答
  • 存栈
    2019-02-27 12:47:07

       首先说明,"java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的。

       下面让我们一起来分析一下原因:

       基本数据类型是放在栈中还是放在堆中,这取决于基本类型在何处声明,下面对数据类型在内存中的存储问题来解释一下:

       一:在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因

          在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。

             (1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在JAVA虚拟机栈中(不是栈内存

             (2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在JAVA虚拟机栈中,该变量所指向的对象是放在堆类存中的。

       二:在类中声明的变量是成员变量,也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。

           同样在类中声明的变量即可是基本类型的变量,也可以是引用类型的变量。

           (1)当声明的是基本类型的变量其变量名及其值放在堆内存中

                  ①JDK7及之前static修饰的基本类型的变量是放在方法区中。

                  ②JDK8及之后static修饰的基本类型的变量是放在放在堆内存中。因为而JDK8常量池静态成员变量迁移到了堆中。

           (2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中。

     

     

      此外,为了反驳观点" Java的基本数据类型都是存储在栈的 ",我们也可以随便举出一个反例,例如:

          int[] array=new int[]{1,2};

          由于new了一个对象,所以new int[]{1,2}这个对象时存储在堆中的,也就是说1,2这两个基本数据类型是存储在堆中,

          这也就很有效的反驳了基本数据类型一定是存储在栈中~~

          参考链接:http://bbs.csdn.net/topics/390457167

                         http://wenku.baidu.com/view/8c66da7e27284b73f2425056.html

     

    转载自:https://www.cnblogs.com/xiohao/p/4296059.html

    更多相关内容
  • 如果一个对象包含基本类型,那个基本类型是存栈还是堆? 我知道对象是在堆里的,那它的包含所有都是堆里吗?
  • Java中堆和的区别

    千次阅读 2021-03-22 17:36:37
    Java中堆与的区别有:内存存储的是局部变量而堆内存是实体,内存的更新速度高于堆内存,内存的生命周期一结束就会被释放而堆内存会被垃圾回收机制不定时回收在说堆和之前,我们需要了解JVM(虚拟机)中内存...

    8ab60c1d35c3f02cdc802ec0b6e051ab.png

    Java中堆与栈的区别有:栈内存存储的是局部变量而堆内存是实体,栈内存的更新速度高于堆内存,栈内存的生命周期一结束就会被释放而堆内存会被垃圾回收机制不定时回收

    在说堆和栈之前,我们需要了解JVM(虚拟机)中内存的划分:

    任何软件在运行时都需要空间,Java虚拟机也不例外。JVM运行时在内存中会开辟一片内存区域,启动时在自己的内存区域中进行更细致的划分,因为虚拟机中每一片内存处理的方式都不同,所以要单独进行管理。JVM内存的划分有五部分分别是:

    寄存器

    本地方法区

    方法区

    栈内存

    堆内存

    今天将要介绍的是栈内存与堆内存的区别

    栈内存

    栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。

    堆内存

    存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。

    下面将通过具体的图例来详细讲解一下堆和栈

    比如说主函数中的语句

    int [] arr=new int [3];

    主函数先进栈,在栈中定义一个变量arr,接下来为arr赋值,但是右边不是一个具体值,是一个实体。实体创建在堆里,在堆里首先通过new关键字开辟一个空间,内存在存储数据的时候都是通过地址来体现的,地址是一块连续的二进制,然后给这个实体分配一个内存地址。数组都是有一个索引,数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化(这是堆内存的特点,未初始化的数据是不能用的,但在堆里是可以用的,因为初始化过了,但是在栈里没有),不同的类型初始化的值不一样。所以堆和栈里就创建了变量和实体

    753d29ace80685111818178ab40b27e5.png

    堆和栈的联系

    上例中给堆分配了一个地址,然后把堆的地址赋给arr,arr就通过地址指向了数组。所以arr想操纵数组时,就通过地址,而不是直接把实体都赋给它。这种我们不称为基本数据类型,而叫引用数据类型。称为arr引用了堆内存当中的实体。

    3bf136ba16eb2de11b9e30df0c89ce21.png

    如果当int [] arr=null;且arr不做任何指向,null的作用就是取消引用数据类型的指向。

    当一个实体,没有引用数据类型指向的时候,它在堆内存中不会被释放,而被当做一个垃圾,在不定时的时间内自动回收,因为Java有一个自动回收机制。自动回收机制(程序)自动监测堆里是否有垃圾,如果有,就会自动的做垃圾回收的动作,但是什么时候收不一定。

    堆与栈的区别

    1.栈内存存储的是局部变量而堆内存存储的是实体;

    2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

    3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

    展开全文
  • 顺序 和链栈

    千次阅读 2020-10-18 19:07:56
    是一种特殊的线性表,因此可以用线性表的方法来存储。最简单的方法就是用一维数组来存储。由于底固定不变的,而栈顶随进出操作动态变化的,因此为了实现对的的操作,必须记住栈顶的当前位置。 顺序优...

    栈是一种特殊的线性表,因此可以用线性表的方法来存储栈。最简单的方法就是用一维数组来存储。由于栈底固定不变的,而栈顶随进出栈操作动态变化的,因此为了实现对的栈的操作,必须记住栈顶的当前位置。

    顺序栈优缺点:

    优点:简单、存储密度高。

    确定:即使栈的长度很长,也还是可能发生上溢。当栈的容量不固定时,必须设置栈的长度以使其可以容纳更多的元素,容易浪费空间。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    const int Maxsize=1000;
    typedef struct node{
        int top;///栈顶
        int elements[Maxsize];///栈的容量
    }ST;
    void SetNull(ST *S){
     S->top=-1;
    }
    bool Is_Empty(ST *S){
       if(S->top<0)
        return true;
       else
        return false;
    }
    ST *ST_Push(ST *S,int x){///入栈
        if(S->top>=Maxsize){///上溢现象
           cout<<"Stack overflow"<<endl;
           return NULL;
        }
        else{
             S->top++;
             S->elements[S->top]=x;
             return S;
        }
    }
    int  ST_Pop(ST *S){ ///根据要求设计返回值类型
    
        if(Is_Empty(S)){
            cout<<"Stack underflow"<<endl;///下溢
            return NULL;
        }
        else
        {
            S->top--;
           int element=S->elements[S->top+1];
          return element;
        }
    }
    int GET_TOP_Element(ST *S){///获取栈顶元素
         if(Is_Empty(S)){
            cout<<"Stack underflow"<<endl;///下溢
            return NULL;
        }
        else{
          int element=S->elements[S->top];
          return element;
        }
    }
    int main()
    {   int n;
        ST *S=(ST*)malloc(sizeof(ST));
        SetNull(S);
        cin>>n;
        for(int i=1;i<=n;i++)
           ST_Push(S,i);
        for(int i=3;i<=n;i++)
           cout<<ST_Pop(S)<<" ";
         cout<<endl;
        cout<<GET_TOP_Element(S)<<endl;
        return 0;
    }
    

     

    对于顺序栈来说,其实最大的缺点是:当栈的容量不固定时,必须设置栈,使其容纳最多的数据元素,这样会浪费很对存储空间,也可能产生上溢出现象,采用链式存储结构就不会产生类似的问题。

    栈的链式存储结构称为链栈,他是运算受限的单链表,其插入和删除只能在表头进行。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    typedef struct node{
         int va;
         struct node *next;
    }s,*link_ST;
    bool Set_NULL(link_ST &S){///初始化栈
         S=NULL;
    return true;
    }
    void PushL(link_ST &S,int data){///入栈
    
        link_ST p=(link_ST)malloc(sizeof(link_ST));
        p->va=data;
        p->next=S;
        S=p;
    }
    int  PopL(link_ST &S){///出栈
        if(S==NULL)
            cout<<"this if underfloor"<<endl;
        else{
           link_ST temp=(link_ST)malloc(sizeof(link_ST));
           temp->va=S->va;
           temp=S;
           S=S->next;
           return temp->va;
           free(temp);
            }
    }
    int GET_TOPelement(link_ST S){///获取栈顶元素
        if(S==NULL)
            cout<<"this is underfloor"<<endl;
        else{
            return S->va;
        }
    }
    int main()
    {
        int n,i;
        cin>>n;
        link_ST S;
        Set_NULL(S);
        for(i=1;i<=n;i++)
            PushL(S,i);
        cout<<"获取当前栈顶元素:";
        cout<<GET_TOPelement(S)<<endl;///入栈
        cout<<"依次出栈:";
        for(i=1;i<=n;i++)
            cout<<PopL(S)<<" ";//出栈
        cout<<endl;
        return 0;
    }
    

     

    展开全文
  • C++中的堆和

    千次阅读 2018-09-22 02:02:11
    在C++中,内存分为5个区:堆、、自由存储区、静态存储区(或全局存储区)和常量存储区。 堆和都是C++的内存存储区之一,下面介绍堆和对比用法: 1.管理方式和分配效率: 是机器系统提供的数据结构,是FILO...

    在C++中,内存分为5个区:堆、栈、自由存储区、静态存储区(或全局存储区)和常量存储区。
    堆和栈都是C++的内存存储区之一,下面介绍堆和栈对比用法:

    1.管理方式和分配效率:

    是机器系统提供的数据结构,是FILO(First In Last Out)结构,计算机底层对它进行了支持,栈的内存分配内置于处理器的指令集(分配了专门的寄存器存放栈的地址,压栈和出栈都有专门的指令),这也就决定了栈的分配效率较高。
    是由C/C++函数库提供的,由一套复杂的算法实现。堆中有一个记录空闲内存地址的链表,当系统收到进程的空间申请时,根据使用的分配算法找到合适的地址空间。(比如first-fit算法:遍历此链表,找到第一个空间大于申请大小的空闲内存分配给进程,从空闲链表中将此节点删除,并记录此次分配的大小,添加到已分配内存链表中,另外将多余的空闲空间添加到空闲链表中,将分配内存的首地址返回给进程使用)此后进程可以合理地使用这块空间,有时由于申请的空间太大,空闲链表中找不到合适的内存,系统会使用mmap扩展有效堆内存,以获得更多的虚拟地址空间。基于以上,堆的申请效率较低。

    2.空间特点:

    的空间较小,windows下栈的大小是一个在编译时就确定的常量,通常是1M或2M,在unbutu下一般是8M,Centos下是10M,可以通过ulimit -a查看,ulimit -s进行修改。
    栈是一块连续的空间,每次申请也是申请连续的大小。
    的空间较大,一般和系统有关,32位系统堆大小一般为4G。
    堆是由空闲内存地址链表管理,堆空间是不连续的申请,每次申请都是在空闲空间链表上找合适大小的空闲空间进行分配。

    3.内存碎片:

    由于栈是系统进行分配和释放,而且由于栈这种数据结构的特点FILO,不会出现间隔的分配,所以栈不会有产生内存碎片,而堆是由程序员手动进行分配和释放,存在碎片。

    4.分配方式:

    栈是由系统分配和释放,当申请的空间小于剩余的空间则进行分配,否则抛出stack overflow。
    栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配(alloca不具可移植性, 而且在没有传统堆栈的机器上很难实现),用完由编译器自动释放,如果手动释放会出错。
    alloca的函数具体用法:
    头文件: malloc.h
    函数原型:void * __cdecl alloca(size_t);

    #include <stdio.h>
    #include <malloc.h>
    int main()
    {	
    	int *p = (int *)alloca(sizeof(int)*10);
    	free(p); //error,空间在栈中,手动释放是报错
    	return 0;
    }
    

    堆是由程序员自己进行申请和释放,使用new和malloc等申请,对应的由delete和free进行释放。使用灵活,但容易发生内存泄露(memory leak)申请的空间可以很大。在项目很大时,难免发生内存泄露。较好的选择是重载new和delete,跟踪定位程序发生内存泄露的地方。

    5.生长方向:

    栈的生长方向是向下生长,即由内存高地址向低地址生长。
    堆的生长方向是向上生长,由内存的低地址向高地址生长。
    堆和栈之间由一层临界区,大小可以进行修改,如果栈的空间到达临界区,则会提示stack overflow。

    展开全文
  • 的存储结构和操作

    2019-04-09 17:47:46
    //栈的顺序存储结构和操作 #include<iostream> #include<stdlib.h> using namespace std; typedef int ElemType;... //① 初始化栈S为空 ... //存栈元素 int top; //存栈顶元素的下标位置 ...
  • 文档之共享

    千次阅读 2022-04-22 23:40:06
    共享是顺序的变种。利用底位置相对不变的特性,可以让两个顺序共享一个一维数组空间,将两个底分别设置在共享空间的两端,两个栈顶向共享空间的中间延申。
  • C语言数据结构之简单操作 实验: 编写一个程序实现顺序的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序 (2)插入元素 (3)删除栈顶元素 ...(1)顺序中元素用向量
  • 和队列都是特殊的线性表,是限制存取位置的线性结构;可以由顺序表实现,也可以由链表实现。 什么是 定义为:只允许在表的一端进行插入和删除的线性表。 允许进行插入和删除的一端叫做栈顶(top),而另一端叫...
  • 堆中什么?什么?

    千次阅读 2018-03-08 14:31:06
    的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在中,一个对象只对应了一个4btye的引用(堆栈分离的好处:))。为什么不把基本类型放堆中呢?因为其占用的...
  • 顺序的模板类实现

    千次阅读 2016-03-17 22:59:04
    从数据结构的角度看,也是线性表的一种,其特殊性在于其基本的操作还是依靠线性表实现的。 只允许在栈顶进行插入和删除操作。 的存储方式也分顺序和链栈两种,个人觉得既然只运行对栈顶进行操作,链栈...
  • 什么? 堆中的是 对象 。的是 基本数据类型 和 堆中对象的引用 。一个对象的大小是不可估计的,或者说是可 以动态变化的,但是在中,一个对象只对应了一个4btye的引用(堆栈分离的好处:))。 为...
  • 实验.rar,实验,队列(2),线性表(2),线性表(2).exe,线性表(2).obj,tempfile.exe,线性表(2).c,(2),(2).exe,(2).c,(1),(1).c,char.txt,(1).exe,线性表(1),线性表(1).c,线性表(1...
  • 堆和的区别 (stack and heap)一般认为在c中分为这几个存储区 1 - 有编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3全局区(静态区),全局变量和静态变量的存储...
  • 虚拟机详解

    千次阅读 2021-08-10 10:13:27
    1.1 虚拟机出现的背景 使用的优点是跨平台,指令集小,编译器容易实现。缺点是性能下降,实现同样的功能需要更多的指令。 1.2 内存中的和堆 可以大致上说:是运行时单位,而堆是储存的单位。 解决程序...
  • 顺序,利用一组地址连续的数单元依次存放自底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序中的位置,压栈、弹、获得栈顶元素、统计中元素个数、打印中元素
  • 堆,的都是啥?简单易懂

    千次阅读 2018-09-20 08:23:07
    1.:当程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的会被释放,这个中的变量也将随之释放。 2.推:存放不在当前方法中...
  • 数据结构——的详解

    千次阅读 2021-05-23 11:46:57
    和队列是两种重要的线性结构,从数据结构的角度...文章目录C语言中的栈栈的定义C语言中的基本操作的初始化判断是否为空栈判断是否为满入栈出栈C语言实现的具体代码C++中的C++中的基本操作初始化判断是...
  • Java——操作数

    千次阅读 2021-11-19 14:36:16
    文章目录Java——操作数 Java——操作数 先明确一个概念,Java(虚拟机)内存储的是栈帧,多个栈帧组成了一个虚拟机。栈帧是JVM进行方法调用使用的数据结构。 栈帧内保存包含有操作数。操作数保存了...
  • jvm之、堆,jvm默认空间大小

    千次阅读 2021-03-23 21:43:47
    jvm之、堆,jvm默认空间大小1. Java Virtual Machine​人群当中,一位叫java的小伙子正向周围一众人群细数着自己取得的荣耀与辉煌。就在此时,c老头和c++老头缓步走来,看着被众人围住的java,c老头感叹地对着...
  • Java虚拟机详解

    千次阅读 2021-01-23 22:44:38
    虚拟机也称为Java,每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame) 特点基本介绍 Java虚拟机属于线程私有,它的生命周期与线程相同(随线程而生,随线程而灭) 虚拟机说明了线程...
  • java中内存与堆内存(JVM内存模型)Java中堆内存和内存详解1 和 Java中堆内存和内存详解2 都粗略讲解了内存和堆内存的区别,以及代码中哪些变量存储在堆中、哪些存储在中。内存中的堆和到底是什么 详细...
  • RE_1

    2022-08-03 22:18:01
    1. 任何时候,左括号个数,必须大于等于 右括号个数 2. 每一层可以加一个括号 1. 下标的单调 枚举矩形的高度 2. 思想: 关于这种数组中找最大矩形,
  • 共享空间

    2013-06-24 13:12:24
    c语言创建两共享空间,在的基础上实现。
  • JVM以方法作为最基本的执行单元,栈帧则是用于支持虚拟机进行方法调用与方法执行背后的数据结构,同样它也是JVM运行时数据区中的虚拟机元素。
  • 、堆、方法区分别存储什么内容

    千次阅读 2021-03-07 21:49:48
    中保存基本数据类型的值和对象以及基础数据的引用;堆中存储的全部是对象,每个对象都包含一个与之对应的class的信息;方法区被所有的线程所共享,方法区包含所有的class和static变量。堆区:1、存储的全部是对象...
  • 内存和堆内存的区别:1、内存用来存放基本类型的变量和引用变量,堆内存用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在堆内存中。(视频教程推荐:java视频)2、内存归属...
  • 用户和内核

    2020-04-16 07:27:27
    介绍&目的 1、 介绍 在程序执行过程中,一旦调用到系统调用,就需要进入...其中,内核是和进程运行有关系的。相关的成员变量有 struct thread_info thread_info; void *stack; 嗯,先上图 2、 目的 以下整理...
  • 和队列经典面试题

    千次阅读 多人点赞 2022-03-31 14:14:23
    目录 1、括号匹配问题 ...2、用队列实现 3、用实现队列 4、设计循环队列 1、括号匹配问题 链接直达: 有效的括号 题目: 思路: 2、用队列实现 3、用实现队列 4、设计循环队列 ...
  • 讲人话就是:就是有一个栈顶指针,指向了一个单链表,单链表数据,栈顶指针取,放数据。 每日一遍,心情愉悦 (图片是博主在家拍的,其实还有一个非常带感的视频,上传不了,有机会给网友看一下) 1.理解逻辑,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 177,953
精华内容 71,181
关键字:

存栈