Java中堆和栈的区别在什么地方?-程序员宅基地

640?wx_fmt=jpeg

堆和栈都是Java用来在RAM中存放数据的地方。

(1)Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销毁。

(2)堆的优势是可以动态地分配内存空间,需要多少内存空间不必事先告诉编译器,因为它是在运行时动态分配的。但缺点是,由于需要在运行时动态分配内存,所以存取速度较慢。 

 

(1)栈中主要存放一些基本数据类型的变量(byte,short,int,long,float,double,boolean,char)和对象的引用。

(2)栈的优势是,存取速度比堆快,栈数据可以共享。但缺点是,存放在栈中的数据占用多少内存空间需要在编译时确定下来,缺乏灵活性。

 

举例说明栈数据可以共享

String 可以用以下两种方式来创建:

String str1 = new String("abc");
String str2 = "abc";

第一种使用new来创建的对象,它存放在堆中。每调用一次就创建一个新的对象。 

第二种是先在栈中创建对象的引用str2,然后查找栈中有没有存放“abc”,如果没有,则将“abc”存放进栈,并将str2指向“abc”,如果已经有“abc”, 则直接将str2指向“abc”。

 

下面用代码说明上面的理论:

    public static void main(String[] args) {
        String str1 = new String("abc");
        String str2 = new String("abc");
        System.out.println(str1 == str2);
    }

输出结果为:false

 


 

    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";
        System.out.println(str1 == str2);
    }

输出结果为:true

    

因此,用第二种方式创建多个“abc”字符串,在内存中其实只存在一个对象而已。 这种写法有利于节省内存空间。 同时还可以提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否创建新对象。


扩展阅读

Java 堆内存溢出梗概分析

如何用JavaScript手动实现一个栈

Java 解惑:Comparable 和 Comparator 的区别


文章来源 http://www.cnblogs.com/nnngu/p/8300761.html 

文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Y0Q2T57s/article/details/82880907

智能推荐

项目一报错解决(500)-程序员宅基地

解决办法:在**ServeiceImpl上加入 @Service@Transactional转载于:https://www.cnblogs.com/ly133333333333333/p/7562696.html

oracle impdp 分区,IMPDP导入范围分区中最旧最小的分区_惨痛教训_杜恽诚的博客-程序员宅基地

ESB_MSG_LOG表按范围分区,删除历史分区时,多删了201707分区通过备份再异机恢复并导出201707分区expdp system/manager TABLES=esbadmin.ESB_MSG_LOG:ESBLOG201707 directory=DATA_PUMP_DIR dumpfile=ESBLOG201707.dmp本机再导入ESB_MSG_LOG现在还有201708、20170..._impdp导入指定分区

C#错误异常列表_c#错误信息列表-程序员宅基地

C#错误异常列表_c#错误信息列表

普通程序员如何转型深度学习?-程序员宅基地

今年春招,各大公司和一众创业公司,对AI人才展开了近乎白热化的抢夺大战。这种场景,也曾发生在 2011 年,当年对应的技术是 iOS。iOS人才奇缺的年代,不少人抓住了新技术的机遇,跨越了学历、专业门槛,获得了弯道超车的人生机会。 现在,技术人或多或少都能感知到 AI 技术的机会,但是面对新的技术机会时,非科班出身,如何高效、系统进入人工智能技术领域,成为领域的早期大众( E

PHP session有效期session.gc_maxlifetime的设置方法-程序员宅基地

PHP中的session有效期默认是1440秒(24分钟)【weiweiok 注:php5里默认的是180分】,也就是说,客户端超过24分钟没有刷新,当前session就会失效。很明显,这是不能满足需要的。一个已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存储到数据库,这样可以通过SQL语句来删除所有过期的se..._session.gc_maxlifetime

Java算法——7把链表相邻元素翻转(交换值法、就地逆序)-程序员宅基地

文章目录题目描述方法一:交换值法方法二:就地逆序算法性能分析题目描述把链表相邻元素翻转,如给定链表为1→2→3→4→5→6→7,则翻转后的链表为2→1→4→3→6→5→7方法一:交换值法最容易想到的方法就是交换相邻两个结点的数据域,这种方法由于不需要重新调整链表的结构,因此比较容易实现,但是这种方法并不是考官所期望的解法方法二:就地逆序主要思路:通过调整结点指针域的指向来直接调换相邻的两个结点。如果单链表恰好有偶数个结点,那么只需要将奇偶结点对调即可,如果链表有奇数个结点,那么只需要将除了最后一

随便推点

碰到了好几次的问题Oracle(Oracle日志文件被误删除导致的问题解决(ora-01033,ORA-00313,ORA-00312))_oracle数据库归档日志莫名被删除怎么办-程序员宅基地

由于使用了一个未经验证的清除垃圾文件的程序,导致Oracle数据库的两个日志文件被非法删除(Redo01,Redo02),导致Oracle无法连接(能启动),系统报错: ora-01033:oracle initializationg or shutdown in progress最开始知道问题是由于文件被误删导致的,但不知道是日志文件被删除,由于数据库应用能启动,因此决定做一_oracle数据库归档日志莫名被删除怎么办

Android开发 设计模式(一、Singleton(单例模式))-程序员宅基地

总体来说,Java中的设计模式可以分为三种类型:创建型模式,结构型模式和行为型模式。今天就先谈谈创建型模式创建型模式,共五种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。一、Singleton(单例模式)单例模式:能够保证一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、串口、缓存、日志对象、对话框、

计算机网络(一):网络基础知识_电路交换存在静默期_A.iguodala的博客-程序员宅基地

文章目录1. 什么是因特网1.1 服务描述1.2 协议2. 网络边缘2.1 接入网2.2 物理媒体3. 网络核心3.1 分组交换3.2 电路交换3.3 分组交换与电路交换的对比4. 分组交换网中的时延、丢包和吞吐量5. 协议层次5.1 OSI 参考模型5.2 TCP / IP 参考模型5.3 五层参考模型5.4 封装1. 什么是因特网我们可以从两个角度来回答这个问题:一种是描述组成它的软硬件;另一种是将其视为为分布式应用提供基础服务的联网设施来描述。其实,第一种角度,是从它的组成来描述,第二种角度是从它_电路交换存在静默期

内存条玄学之四槽插满就这么难么?_b350 内存识别问题_代码狂魔v的博客-程序员宅基地

内存条玄学之四槽插满就这么难么?背景最近准备折腾下虚拟机搭OpenShift集群,内存不够使了,本来是两条8G共16G,想要扩展到32G,于是咸鱼入手了2根8G,频率也是2400(其中一根是宽版,颗粒和窄版不相同),情况如下1和2我自己的能组成双通道,一共16G;3和4我咸鱼上入手的能组成双通道,一共也是16G,唯一的不同是第4条颗粒不同,是宽版的,直观感受下四槽插满指的是主板上的四个槽位插满,即4 * 8G =32G,其他信息如下主板:华硕 B350 PLUSCPU:AMD 2600X系统:_b350 内存识别问题

赢者树WinnerTree - C语言-程序员宅基地

写WinnerTree实在是一件烧脑的事情。。。相关概念如下:赢者树:对于 n名选手,赢者树是一棵包含n个外部节点,n-1个内部节点的完全二叉树。其中每个内部节点记录了相应赛局的赢家。最大赢者树即每次都是值大的胜出;最小赢者树每次都是值小的胜出。赢者树采用数组公式化描述,最核心的是如何根据外部节点的序号计算内部节点的序号,公式如下:内部节点inner_index = (外部节点outer_inde...

mysql ddl 进度_MySQL DDL详情揭露-程序员宅基地

前言:MySQL中DDL语句,即数据定义语言,用于创建、删除、修改、库或表结构,对数据库或表的结构操作。常见的有create,alter,drop等。这类语句通常会耗费很大代价,特别是对于大表做表结构变更。本篇文章会揭露各类DDL语句执行的详细情况。1.Online DDL简介在MySQL的早期版本中,DDL操作因为锁表会和DML操作发生锁冲突,大大降低并发性。在早期版本中,大部分DDL操作的执行...