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

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

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

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

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

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

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

相关·内容

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

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

1.5K10

Thinking In Java第二章笔记

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

37910
  • 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 参数列表 方法的参数列表指定要传递给方法什么样的信息。 参数列表中必须指定每个所传递对象的类型和名字。

    33420

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

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

    75880

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

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

    32420

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

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

    32620

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

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

    37320

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

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

    29510

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

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

    21810

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

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

    49320

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

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

    75570

    Java中的堆栈内存

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

    1.2K10

    和栈的区别

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

    1.3K90

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

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

    1.1K20

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

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

    85420

    基础一:一切都是对象

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

    35630

    HotSpot 虚拟机对象探秘

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

    49930

    编程思想 之「对象漫谈」

    「语言导论」中,我们曾提到过「万物皆对象」,事实,也确实如此。面向对象编程的世界中,我们创建对象、操作对象、销毁对象,我们所做的一切动作都离不开对象。...堆栈。它位于 RAM(Random Access Memory,随机访问存储器),通过堆栈指针分配内存空间,指针下移,分配内存;指针移,释放内存。...堆栈的处理速度仅次于寄存器,但编译器必须知道存储堆栈中内容的确切生命周期,这造成了一定的限制。一般来说,基本数据类型,存储堆栈中。 。...一种通用的内存池,也位于 RAM 中,它的处理速度稍慢于堆栈,用于存储所有的 Java 对象,更确切的说,所有new出来的对象都存在中。 常量存储。...对于基本数据类型的存储,则稍有不同:正常来说,我们通过new来创建对象,但当我们创建比较小的、简单的对象的时候,通过new来创建对象并不是很有效,因此 Java 直接这将种对象的值存储堆栈中,基本数据类型正是如此

    1.1K190
    领券