首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

对象列表是应该存储在堆还是堆栈上?

对象列表应该存储在堆上。

在编程语言中,堆和堆栈是两种不同的内存分配方式。堆是用于存储动态分配的对象,它的大小可以在运行时改变。堆栈是用于存储局部变量和函数调用的临时数据。

对象列表是一种动态数据结构,其大小在运行时可能会改变。因此,将对象列表存储在堆上是更好的选择。这是因为堆上的内存是可以动态分配和释放的,而堆栈上的内存是静态分配的,不适合存储动态大小的数据结构。

总之,对象列表应该存储在堆上,而不是堆栈上。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

堆栈与堆(Stack vs Heap):有什么区别?一组图片给你讲清楚!

代码中的全局和代码段(未显示堆和堆栈段) 需要强调的是,管理堆栈和堆段对于代码的性能和效率起着重要作用,使其成为编程的一个重要方面。因此,程序员在深入研究它们的差异之前应该充分理解它们。...堆栈帧存储与局部变量、参数和函数的返回地址相关的信息。该内存是在堆栈段上创建的。 在上面的代码实例中,我们创建了一个名为 的函数add。该函数采用两个参数作为输入整数并返回它们的sum....堆内存:动态存储 堆内存,也称为动态内存,是内存分配的野孩子。程序员必须手动管理它。堆内存允许我们在程序执行期间随时分配和释放内存。它非常适合存储大型数据结构或大小事先未知的对象。...这是通过使用驻留在堆栈内存中的指针或引用变量来完成的: int* ptr在C++中。 Java 中的一个Integer对象ptr。 ptrPython 中包含单个元素的列表。 然后打印存储在堆上的值。...尽管如此,我们还是应该注意内存使用模式以避免出现问题。 结论 对于任何寻求编写高效且优化的代码的程序员来说,了解堆栈内存和堆内存之间的差异至关重要。 堆栈内存最适合临时存储、局部变量和函数参数。

2K10

Thinking In Java第二章笔记

2.堆栈 位于通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获取直接支持。堆栈指针下移则分配新的内存,上移则释放内存。这是一种快速有效的存储方法,仅次于寄存器。...3.堆 一种通用的内存池(也在RAM区),用于存放所有的JAVA对象。 堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里活多长时间。因此,在堆里分配存储有很大的灵活性。...当需要一个对象的时候,只需要new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。这种灵活性的代价是:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多时间。...--将对象转换成可以存储在其他介质上的食物,在需要时可以恢复成常规的,基于RAM的对象。...因为new将对象存储在堆中,故用new创建一个对象--特别是晓得,简单的变量,往往不是很有效。java针对这些类型,创建了一个并非是引用的“自动”变量。

38410
  • C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)

    值类型和引用类型在赋值(或者说复制)的时候也是有区别的。值类型数据在赋值的时候是直接复制值到新的对象中,而引用类型则只是复制对象的引用。 最后,值类型存在堆栈上,引用类型存储在托管堆上。...接下来我们来看看堆和栈吧。 栈(Stack)和堆(Heap) Stack是指堆栈,Heap是指托管堆,在C#中的叫法应该是这样的。 1、堆栈stack:堆栈中存储值类型。   ...为了在托管堆中找到一个存储新Cat对象的存储位置,.NET运行库会在堆中搜索一块连续的未使用的32字节的空间,假定其起始地址是1000。而在堆栈中的内存地址的四个字节为:1996到1999。...在实例化cat之前应该是这样的。 ? cat实例化,给Cat对象分配空间之后,内存变化为  cat在堆栈中使用1996到1999的内存地址,然后对Cat对象分配空间之后。 ?...但使用托管堆,就只需要读取堆指针的值,而不用搜索整个链接地址列表,来查找一个地方放置新数据。   因此在.NET下实例化对象要快得多,因为对象都被压缩到堆的相同内存区域,访问对象时交换的页面较少。

    1.1K10

    C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)

    值类型和引用类型在赋值(或者说复制)的时候也是有区别的。值类型数据在赋值的时候是直接复制值到新的对象中,而引用类型则只是复制对象的引用。 最后,值类型存在堆栈上,引用类型存储在托管堆上。...接下来我们来看看堆和栈吧。 栈(Stack)和堆(Heap) Stack是指堆栈,Heap是指托管堆,在C#中的叫法应该是这样的。 1、堆栈stack:堆栈中存储值类型。   ...为了在托管堆中找到一个存储新Cat对象的存储位置,.NET运行库会在堆中搜索一块连续的未使用的32字节的空间,假定其起始地址是1000。而在堆栈中的内存地址的四个字节为:1996到1999。...在实例化cat之前应该是这样的。 ? cat实例化,给Cat对象分配空间之后,内存变化为  cat在堆栈中使用1996到1999的内存地址,然后对Cat对象分配空间之后。 ?...但使用托管堆,就只需要读取堆指针的值,而不用搜索整个链接地址列表,来查找一个地方放置新数据。   因此在.NET下实例化对象要快得多,因为对象都被压缩到堆的相同内存区域,访问对象时交换的页面较少。

    1.2K41

    Java编程思想读书笔记(二)【一切都是对象】

    ; 2.2 必须由你创建所有对象 2.2.1 存储在什么地方 存储数据的五个地方: 1)寄存器。这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。 2)堆栈。...创建程序时,Java程序必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。 3)堆。一种通用的内存池也位于RAM区,用于存放所有的Java对象。...堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多久时间。 当需要一个对象时,只需用new写一行简单的代码。 用堆进行存储分配和清理可能要比用堆栈进行存储分配需要更多的时间。...这句话之前一直都不理解,因为大学学习的数据结构中,栈底就是在底部,栈顶就是在顶部,所以堆栈指针向下移动的话,应该是释放内存的,所以这句话错了?当然不是!...2.5.1 参数列表 方法的参数列表指定要传递给方法什么样的信息。 在参数列表中必须指定每个所传递对象的类型和名字。

    34520

    并发编程2:认识并发编程的利与弊

    堆中包含在 Java 程序中创建的所有对象,无论是哪一个线程创建的。 一个对象的成员变量随着这个对象自身存放在堆上。不管这个成员变量是基本类型还是引用类型。...这一约束限制了程序的灵活性,所以虽然某些JAVA数据存储在堆栈中——特别是对象引用,但是JAVA对象不存储其 中。...堆(heap) 一种通用性的内存池(也存在于RAM中),用于存放所以的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区 域,也不必知道存储的数据在堆里存活多长时间。...因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行 这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。...用堆进行存储分配比用堆栈进行存储存储需要更多的时间。 静态存储(static storage) 这里的“静态”是指“在固定的位置”。静态存储里存放程序运行时一直存在的数据。

    78380

    Java虚拟机:Java内存区域及对象

    尽管在今天,对内存的读写速度已经很快了,但是由于寄存器是在CPU上的,所以对于内存的读写速度和对于寄存器的读写速度上还是有几个数量级的差距。...首先堆栈不是一个概念,而是两个概念,堆和栈是两块不同的内存区域,简单理解的话,堆是用来存放对象而栈是用来执行程序的。...(2)METHOD AREA,方法区 这块区域用于存储虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,虚拟机规范是把这块区域描述为堆的一个逻辑部分的,但实际它应该是要和堆区分开的。...意思是虚拟机维护了一个列表,记录上哪些内存块是可用的,再分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的内容。...在Java虚拟机规范中只是一个指向对象new Object()的引用obj,并没有规定obj应该通过何种方式去定位、访问堆中对象的具体位置,所以对象访问方式也是取决于虚拟机而定的。

    33820

    Java 虚拟机 2 : Java 内存区域及对象

    尽管在今天,对内存的读写速度已经很快了,但是由于寄存器是在CPU上的,所以对于内存的读写速度和对于寄存器的读写速度上还是有几个数量级的差距。...首先堆栈不是一个概念,而是两个概念,堆和栈是两块不同的内存区域,简单理解的话,堆是用来存放对象而栈是用来执行程序的。...(2)METHOD AREA,方法区 这块区域用于存储虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,虚拟机规范是把这块区域描述为堆的一个逻辑部分的,但实际它应该是要和堆区分开的。...意思是虚拟机维护了一个列表,记录上哪些内存块是可用的,再分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的内容。...在Java虚拟机规范中只是一个指向对象new Object()的引用obj,并没有规定obj应该通过何种方式去定位、访问堆中对象的具体位置,所以对象访问方式也是取决于虚拟机而定的。

    33120

    Java虚拟机:Java内存区域及对象

    尽管在今天,对内存的读写速度已经很快了,但是由于寄存器是在CPU上的,所以对于内存的读写速度和对于寄存器的读写速度上还是有几个数量级的差距。...首先堆栈不是一个概念,而是两个概念,堆和栈是两块不同的内存区域,简单理解的话,堆是用来存放对象而栈是用来执行程序的。...(2)METHOD AREA,方法区 这块区域用于存储虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,虚拟机规范是把这块区域描述为堆的一个逻辑部分的,但实际它应该是要和堆区分开的。...意思是虚拟机维护了一个列表,记录上哪些内存块是可用的,再分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的内容。...在Java虚拟机规范中只是一个指向对象new Object()的引用obj,并没有规定obj应该通过何种方式去定位、访问堆中对象的具体位置,所以对象访问方式也是取决于虚拟机而定的。

    38120

    吃人的那些 Java 名词:对象、引用、堆、栈

    参考链接: 用Java创建对象的不同方法 作为一个有着 8 年 Java 编程经验的 IT 老兵,说起来很惭愧,我被 Java 当中的四五个名词一直困扰着:对象、引用、堆、栈、堆栈(栈可同堆栈,因此是四个名词...最近,和沉默王二技术交流群(120926808)的群友们交流后,Java 中那四五个会吃人的名词:对象、引用、堆、栈、堆栈,似乎在脑海中也清晰了起来,尽管疑惑有时候仍然会在阴云密布时跑出来——正鉴于此,...以上代码在运行时就会创建两个对象——“我是对象张三"和"我是对象李四”;现在,该怎么操作他们呢?  去过公园的同学应该会见过几个大爷,他们很有一番本领——个个都能把风筝飞得老高老高,徒留我们眼馋的份!...我这里有几招武功秘籍,你们尽管拿去一睹为快:  1)以后再看到堆、栈、堆栈三个在一起打牌的时候,直接把“堆栈”踢出去;这仨人不适合在一起玩,因为堆和栈才是老相好;你“堆栈”来这插一脚算怎么回事;这世界上只存在...之所以特殊对待,是因为 new 将对象存储于“堆”中,故用 new 创建一个对象──特别小、简单的变量,往往不是很有效。

    30310

    JVM垃圾回收机制【简单介绍】

    垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象的引用计数为 0 时,就释放其占用的空间。 ​ 引用计数常用来说明垃圾收集的工作方式,但似乎从未被应用于任何Java虚拟机的实现中。...缺点: 虽然管理引用计数开销不大,但这种开销在整个程序的生命周期中是持续发生的。...)的垃圾回收技术,依据的思想:**对于任何“活着”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。...“标记-清扫” ​ 从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象;每当找到一个存活对象,便会给对象设一个标记。只有全部标记工作完成时候,才会开始清理动作。...之前的“复制-回收”要求在释放旧有对象之前,必须将所有存活对象从旧堆复制到新堆中,这会导致大量的内存复制行为;有了块之后,我们可以往废弃或闲置的块中复制对象。 ​ 那如何判断某个块是不是闲置的呢?

    22610

    “吃人”的那些Java名词:对象、引用、堆、栈

    作为一个有着8年Java编程经验的IT老兵,说起来很惭愧,我被Java当中的四五个名词一直困扰着:对象、引用、堆、栈、堆栈(栈可同堆栈,因此是四个名词,也是五个名词)。...我这里有几招武功秘籍,你们尽管拿去一睹为快: 1)以后再看到堆、栈、堆栈三个在一起打牌的时候,直接把“堆栈”踢出去;这仨人不适合在一起玩,因为堆和栈才是老相好;你“堆栈”来这插一脚算怎么回事;这世界上只存在...所以,我建议这位和尚在缸上贴个标签——保质期90天,过期饮用,后果自负! 还是记不住,看下图: ?...不是的,因为Java在编译程序时,必须明确的知道存储在栈里的东西的生命周期,否则就没法释放旧的内存来开辟新的内存空间存放引用——空间就那么大,前浪要把后浪拍死在沙滩上啊。 现在清楚堆、栈和堆栈了吧?...之所以特殊对待,是因为new将对象存储于“堆”中,故用new创建一个对象──特别小、简单的变量,往往不是很有效。

    50420

    终结 finalize()和垃圾回收(garbage collection)

    那么在finalize()中释放对象是否正确呢?不!如果JVM 并未面临内存耗尽的情形,它是不会浪费时间在回收垃圾上的。...在某些Java虚拟机中,堆的实现方式就像一个传送带,你每分配一个新对象,它就往前移动一格,这意味着对象存储空间的分配速度非常快。...垃圾回收器会在含有全部对象的列表上,当发现某个对象的引用技术为0时,就释放其占有的空间。...这种方式是:遍历所有对象的引用,这个引用可能会穿过数个对象层次,并最终追溯到其存活在堆栈或静态存储区之中的引用,如果对象之间存在循环利用的话,遍历追溯到最后会发现寻找的是本身的对象,因此这些对象根本不会被发现...而stop-and-copy方式意味着先暂停程序的运行,然后将所有存活的对象从当前堆复制到另外一个堆,没有被复制的全部都是垃圾,当对象被复制到新堆时,他们是一个挨着一个的。所以新堆保持紧凑排列。

    77370

    堆和栈的区别

    2.5堆和栈中的存储内容  栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量...bbbbbbbbbbb是在编译时就确定的;  但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。 ...GlobalAlloc() 和 LocalAlloc() 建立在同一堆上,是存取每个进程堆的通用机制。...减少需要的小对象的数量减少堆分配程序的负载。例如,我们在服务器的关键处理路径上使用五个不同的对象,每个对象单独分配和释放。...id=172835 我在学习对象的生存方式的时候见到一种是在堆栈(stack)之中,如下   CObject  object;   还有一种是在堆(heap)中  如下   CObject*  pobject

    1.3K90

    Java中的堆栈和堆内存

    大家好,我是小面。今天将给大家介绍一下Java中的堆栈和堆内存。 Java数据类型在执行期间存储在两种不同形式的内存中:堆栈和堆。它们通常由运行Java虚拟机(JVM)的底层平台维护。...由于每个线程都维护一个私有的JVM堆栈,因此它用于存储与其静态内存分配相关的变量。我们在代码中声明和使用的特定于方法的原始变量实际上存储在堆栈区域中。...此外,对实际存储在堆内存中的对象的引用也存储在堆栈区域中。因此,本地分配的任何内存都存储在堆栈中。 可以使用JVM参数-Xss更改堆栈内存的默认大小。...什么是Java中的堆内存 堆是一个内存区域,它在JVM启动时就创建,并一直存在,直到JVM被销毁。与堆栈不同,堆栈是单个线程的属性(因为每个线程都有自己的堆栈),堆实际上是由JVM自身管理的全局存储。...遇到main()方法时,将创建堆栈。 局部变量x和y存储在堆栈中。 字符串greet分配在堆的StringPool区域中。 Date对象在堆区域中分配,而其引用d存储在堆栈中。

    1.2K10

    这些题都不会,面试你怎么可能过?

    这也是为何程序员求职者应该向面试官展示出已经透彻理解了数据结构知识。 几乎所有的面试问题都要求求职者表现出已经熟练掌握数据结构,不管你是刚毕业的应届生还是工作了多年的老手,都是这样。...什么是数据结构? 简单说,数据结构就是一个容器,以某种特定的布局存储数据。这个“布局”使得数据结构在某些操作上非常高效,在另一些操作上则不那么高效。...其思路就是,按照最后的状态排列在先的顺序将工作的先前状态(限于特定数字)存储在内存中。这只用数组是无法实现的,因此堆栈就有了用武之地。 可以把堆栈看作一堆垂直排列的书籍。...常见的字典树面试问题: 计算字典树中的总字数 打印存储在字典树中的所有单词 使用字典树对数组的元素进行排序 使用字典树从字典中形成单词 构建一个T9字典 哈希表 散列是一个用于唯一标识对象并在一些预先计算的唯一索引...因此,对象以“键值”对的形式存储,这些项的集合被称为“字典”。可以使用该键值搜索每个对象。有多种不同的基于哈希的数据结构,但最常用的数据结构是哈希表。 哈希表通常使用数组实现。

    1.1K20

    Java内存大家都知道,但你知道要怎么管理Java内存吗?

    堆栈 堆栈内存负责保存对堆对象的引用和存储值类型(在Java中也称为基元类型),值类型保存值本身而不保存对堆中对象的引用。 此外,堆栈上的变量具有一定的可见性,也称为作用域。...因此,每次一个线程被创建和启动时,它都有自己的堆栈内存,并且不能访问另一个线程的堆栈内存。 堆 堆内存将实际对象存储在内存中。这些对象被堆栈中的变量引用。...字符串是不可变的,这意味着每次使用字符串执行操作时,实际上都会在堆上创建另一个对象。对于字符串,Java在内存中进行字符串池管理。这意味着Java会尽可能地存储和重用字符串。对于字符串文字,更是这样。...比方说,所有红色的对象都符合被垃圾回收器的条件。 你可能会注意到堆上有一个对象,它对同一堆上的其它对象进行了强引用(例如,可能是引用了自己项的列表,或者是具有两个引用类型字段的对象)。...所呈现的图片实际上是一个Java 8的应用程序。在Java 8之前的版本,内存的结构有点不同。元空间实际上称为PermGen. 区。例如,在Java 6中,此空间还为字符串池存储了内存。

    85820

    基础一:一切都是对象

    一般来讲,引用存放在堆栈中,Java对象并不存储在其中。 堆 一种通用的内存池(也位于RAM中),用于存放所有的Java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。...因此在堆里分配存储有很大的灵活性。这种灵活性必须付出相应的代价:比用堆栈进行分配存储需要更多的时间 常量存储 常量值通常存放在程序代码内部,永远不会被改变。...之所以特殊对待,是因为new将对象存储在“堆”中,故用new创建一个对象–特别是小的、简单的变量,往往不是很有效。...从数值上比较两个 BigDecimal 值时,应该使用 compareTo() 而不是 equals()。...如下: objectName.methodName(arg1,arg2,arg3); 参数列表 像java中任何传递对象的场合一样,这里传递的实际上也是引用(对于基本类型是一个类外。

    36230

    HotSpot 虚拟机对象探秘

    Mark Word在32位JVM中的长度是32bit,在64位JVM中长度是64bit。Mark Word在不同的锁状态下存储的内容不同,在32位JVM中是这么存的: ?...空闲列表 如果 Java 堆中内存并不规整,已使用的内存和空闲内存交错(说明采用的是标记-清除法,有碎片),此时没法简单进行指针碰撞, VM 必须维护一个列表,记录其中哪些内存块空闲可用。...分配之时从空闲列表中找到一块足够大的内存空间划分给对象实例。这种方式称为“空闲列表”。 初始化 分配完内存后,为对象中的成员变量赋上初始值,设置对象头信息,调用对象的构造函数方法进行初始化。...至此,整个对象的创建过程就完成了。 对象的访问方式 所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配的。...也就是说在建立一个对象时两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。那么根据引用存放的地址类型的不同,对象有不同的访问方式。

    51330

    java堆、栈、堆栈,常量池的区别,史上最全总结

    对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。...这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。...堆(heap):一种通用性的内存池(也存在于RAM中),用于存放所有的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区 域,也不必知道存储的数据在堆里存活多长时间。...因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行 这行代码时,会自动在堆里进行存储分配。...当然,为这种灵活性必须要付出相应的代价,用堆进行存储分配比用堆栈进行存储存储需要更多的时间。 4. 静态存储(static storage):这里的“静态”是指“在固定的位置”。

    3.6K30
    领券