点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

作者 | nnngu

来源 | cnblogs.com/nnngu/p/8300761.html

堆和栈都是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会自动根据栈中数据的实际情况来决定是否创建新对象。

往期推荐

Spring Boot 2.x基础教程:JdbcTemplate的多数据源配置

面试:你知道Java中的回调机制吗?

两种写法的效果一样,那么到底哪一种更好呢?

StackOverflow 上面最流行的 7 个 Java 问题!

MySQL百万级、千万级数据多表关联SQL语句调优

以为是行废代码,原来有这作用!

推荐关注一个以后端面试为主题的公众号

一起进大厂,每日学干货

关注我,不迷路

面试:说说Java 中堆和栈的区别?相关推荐

  1. JAVA中堆和栈的区别和联系

    一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存. 堆:主要用于储存实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. 栈 ...

  2. 让你彻底明白JAVA中堆与栈的区别

    原文地址:http://www.2cto.com/kf/201302/190704.html 简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象 ...

  3. java中堆和栈的区别!!!!

    Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放.堆是由垃圾回 ...

  4. JAVA中堆和栈的区别[面试常问点一]

    概念 堆内存:在java虚拟jvm中堆内存主要是存储数组和对象(当然数组也是对象),只要是通过new关键字创建的对象都是在堆中,而堆中存放的就是对象的实体,实体用来封装数据的,封装对象的属性,所以堆内 ...

  5. java中堆与栈的区别_java中堆和栈的区别分析

    堆和栈是Java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.an ...

  6. [Java_kaikeba]java中堆和栈的区别(对象变量的理解)

    .堆和栈都是java用来在RAM中存放数据的地方.与C++不同,java自动管理堆栈,       程序员不能直接设置堆栈. .区别       1.       .栈中存放基本数据类型变量(int. ...

  7. JAVA中堆和栈的区别

    堆:(对象) 引用类型的变量,其内存分配在堆上或者常量池(字符串常量.基本数据类型常量),需要通过new等方式来创建. 堆内存主要作用是存放运行时创建(new)的对象. (主要用于存放对象,存取速度慢 ...

  8. java中堆与栈的区别 彻底理解

    每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆.应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有 的线程共享.跟C/C++不同,Java中分配堆内存是自动初始 ...

  9. Java虚拟机:Java中堆和栈的详细区别

    一.Java中内存分配策略: 在比较堆和栈的区别之前,我们先了解下Java的内存分配策略,按照编译原理的观点,程序运行时的内存分配有三种策略,分别是:静态的,栈式的,和堆式的. (1)静态存储分配:是 ...

最新文章

  1. 如何使用Bootstrap4和ES6创建自定义确认框
  2. 代理 设置wsl_第一次使用WSL我做了什么
  3. 智源研究院发布 2020 年世界十大 AI 进展
  4. [SpringBoot]全局异常处理
  5. DPDK 大页内存原理(二十一)
  6. day15-pymysql模块的使用
  7. hdu 5813 Elegant Construction
  8. 在Log4j2中更好地执行非日志记录器调用
  9. 组个最小数C语言pta,PTA|C语言:组个最小数
  10. 邻接矩阵的深度优先遍历
  11. 施一公:让科技工作成为富有吸引力的工作
  12. javascript数组的各种操作
  13. js实现DropDownList的数据筛选
  14. java的维护_天了噜,Java 8 要停止维护了!
  15. MySQL数据类型详解
  16. 汉字常用字unicode码表
  17. MAX422与422转USB及485以及232接线方法
  18. linux命令行计算器 bc命令用法
  19. NetWorkHelper 检测网络状态
  20. 关于基线版本、基线那点事儿

热门文章

  1. linux shell 查看 cpu核数
  2. linux docker 权限划分介绍 capabilities
  3. golang new make 区别
  4. linux日志系统分析:rsyslog、syslog、klog
  5. Nmap源码分析(操作系统扫描)
  6. C++中函数指针的运用
  7. 如何放出Linux内核中的链表大招
  8. 计算机软件评测减增值税,软件产品即征即退政策依据之一
  9. php文本文件操作,PHP文本操作类
  10. linux系统编码修改