面试:说说Java 中堆和栈的区别?
点击上方蓝色“程序猿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 中堆和栈的区别?相关推荐
- JAVA中堆和栈的区别和联系
一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存. 堆:主要用于储存实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. 栈 ...
- 让你彻底明白JAVA中堆与栈的区别
原文地址:http://www.2cto.com/kf/201302/190704.html 简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象 ...
- java中堆和栈的区别!!!!
Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放.堆是由垃圾回 ...
- JAVA中堆和栈的区别[面试常问点一]
概念 堆内存:在java虚拟jvm中堆内存主要是存储数组和对象(当然数组也是对象),只要是通过new关键字创建的对象都是在堆中,而堆中存放的就是对象的实体,实体用来封装数据的,封装对象的属性,所以堆内 ...
- java中堆与栈的区别_java中堆和栈的区别分析
堆和栈是Java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.an ...
- [Java_kaikeba]java中堆和栈的区别(对象变量的理解)
.堆和栈都是java用来在RAM中存放数据的地方.与C++不同,java自动管理堆栈, 程序员不能直接设置堆栈. .区别 1. .栈中存放基本数据类型变量(int. ...
- JAVA中堆和栈的区别
堆:(对象) 引用类型的变量,其内存分配在堆上或者常量池(字符串常量.基本数据类型常量),需要通过new等方式来创建. 堆内存主要作用是存放运行时创建(new)的对象. (主要用于存放对象,存取速度慢 ...
- java中堆与栈的区别 彻底理解
每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆.应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有 的线程共享.跟C/C++不同,Java中分配堆内存是自动初始 ...
- Java虚拟机:Java中堆和栈的详细区别
一.Java中内存分配策略: 在比较堆和栈的区别之前,我们先了解下Java的内存分配策略,按照编译原理的观点,程序运行时的内存分配有三种策略,分别是:静态的,栈式的,和堆式的. (1)静态存储分配:是 ...
最新文章
- 如何使用Bootstrap4和ES6创建自定义确认框
- 代理 设置wsl_第一次使用WSL我做了什么
- 智源研究院发布 2020 年世界十大 AI 进展
- [SpringBoot]全局异常处理
- DPDK 大页内存原理(二十一)
- day15-pymysql模块的使用
- hdu 5813 Elegant Construction
- 在Log4j2中更好地执行非日志记录器调用
- 组个最小数C语言pta,PTA|C语言:组个最小数
- 邻接矩阵的深度优先遍历
- 施一公:让科技工作成为富有吸引力的工作
- javascript数组的各种操作
- js实现DropDownList的数据筛选
- java的维护_天了噜,Java 8 要停止维护了!
- MySQL数据类型详解
- 汉字常用字unicode码表
- MAX422与422转USB及485以及232接线方法
- linux命令行计算器 bc命令用法
- NetWorkHelper 检测网络状态
- 关于基线版本、基线那点事儿