定义

栈内存:存放基本类型的变量、对象的引用(引用变量)。(如何回收?)

在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间:当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

堆内存:存放new创建的对象和数组。(GC垃圾回收)

GC垃圾回收:https://blog.csdn.net/sinat_41144773/article/details/89420619

在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量(引用变量),这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象。数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因

1、基本类型变量的引用和值都存在栈内存,“引用”指向“值”。栈内存的一个特点是数据共享,这样设计是为了减小内存消耗。i=1,i和1都在栈内存内,如果再定义一个j=1,此时将j放入栈内存,然后查找栈内存中是否有1,如果有则j指向1。如果再给j赋值2,则在栈内存中查找是否有2,如果没有就在栈内存中放一个2,然后j指向2。

2、String通过new产生的对象,会先去常量池中查找是否已经有了”word”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”word”对象的拷贝对象。由此,String s1 = new String(“word”)会产生几个对象?如果常量池中原来没有”word”,就会产生两个对象!

3、基本类型常量(public static final)存放在常量池中

寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制
栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)
堆:存放所有new出来的对象。
静态域:存放静态成员(static)
常量池:存放字符串常量对象和基本类型常量(public static final)

数据共享性:栈和常量池中的对象可以共享,堆中的对象不可以共享

数据的生命周期:栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。

引用:https://blog.csdn.net/LK274857347/article/details/77512555

2、“==”和equals()的区别

"=="关系操作符的作用:

1、"=="是关系操作符,只能比较两个操作数的值之间的关系

2、用于比较两个基本数据类型的变量指向是否相同,String的直接引号类型是否指向同一个字符串。

不用于比较看似相同的两个对象,对象间的比较用equals()方法

// "=="操作符的例子
public static void main(String[] args) {//基本类型数据,n1和n2在栈内存中都指向5(也在栈内存),可用==比较int n1 = 5;int n2 = 5;System.out.println(n1 == n2);//String引用类型,s1、s2都指向常量池中的“word”,可用==比较String s1 = "word";String s2 = "word";System.out.println(s1 == s2);//new对象的引用integer1和integer2在栈内存引用地址不同,在堆内存中是两个对象,不可用==比较Integer integer1 = new Integer(3);Integer integer2 = new Integer(3);System.out.println(integer1 == integer2);//String new的对象 在堆内存中是两个对象,比较不可用==比较String s3 = new String("good");String s4 = new String("good");System.out.println(s3 == s4);}//输出:
true
true
false
false

equals()的作用:

equals()是Object 中的方法,用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

// equals()的例子
public static void main(String[] args) {Integer integer3 = new Integer(3);Integer integer4 = new Integer(3);System.out.println(integer3.equals(integer4));//String new的对象 在堆内存中是两个对象,比较不可用==比较String s5 = new String("good");String s6 = new String("good");System.out.println(s5.equals(s6));}//输出:
true
true

结束。

栈内存和堆内存Java(详细实例讲解)相关推荐

  1. java中栈和堆都存哪些东西_java中栈内存与堆内存(JVM内存模型)

    java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...

  2. Java中的栈内存和堆内存

    共两篇文章 第一篇 1.Java中对象都是分配在heap(堆)中.从heap中分配内存所消耗的时间远远大于从stack产生存储空间所需的时间. (1)每个应用程序运行时,都有属于自己的一段内存空间,用 ...

  3. Java栈内存、堆内存、方法区对对象和引用的关系

    问题:Java栈内存.堆内存.方法区对对象和引用的关系 答案: 1.单个对象 如图所示: (1)首先类加载器加载要运行的类,首先将main方法加载进方法区,并进栈内存,顺序执行代码,创建对象,将对象的 ...

  4. java 内存堆和栈_java中堆内存与栈内存的知识点总结

    一.概述 在Java中,内存分为两种,一种是栈内存,另一种就是堆内存. 二.堆内存 1.什么是堆内存? 堆内存是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者 ...

  5. java 堆内存和栈内存的区别_java中栈内存和堆内存有什么区别

    栈内存和堆内存的区别: 1.栈内存用来存放基本类型的变量和引用变量,堆内存用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在堆内存中. (视频教程推荐:java视频 ...

  6. 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类

    目录 栈内存 ,堆内存区别 C++ 动态内存 == 与equal区别 复合函数奇偶性 三角函数转换公式: 虚函数和纯虚函数: C++ 中的运算符重载 数据封装,数据抽象 C++ 接口(抽象类): #和 ...

  7. python释放变量内存_Python尚学堂高淇|1113引用的本质栈内存,堆内存,内存的示意图,标识符,变量的声明初始化,垃圾回收机制...

    011-引用的本质-栈内存和堆内存-内存的示意图在Python当中,变量也成为:对象的引用,因为,变量的存储就是对象的地址变量通过地址引用了对象变量位于堆内存(压栈,出栈等细节,后续再介绍)对象位于: ...

  8. java堆内存_java堆内存详解

    http://www.importnew.com/14630.html java堆的特点 <深入理解java虚拟机>是什么描述java堆的 Java堆(Java Heap)是java虚拟机 ...

  9. 栈内存和堆内存的区别

    总结: 1 栈:为编译器自动分配和释放,如函数参数.局部变量.临时变量等等 2 堆:为成员分配和释放,由程序员自己申请.自己释放.否则发生内存泄露.典型为使用new申请的堆内容. 除了这两部分,还有一 ...

最新文章

  1. ESXI配置TPM-Bitlocker
  2. ETL工具箱 5提交维表
  3. 你现在的CSS水平处于什么等级?
  4. Android的应用程序结构分析:HelloActivity 第二部分【转】
  5. Oracle游标的使用
  6. 做产品必须知道的:从产品助理到产品总监的职业进阶
  7. 插入排序算法C++代码实现
  8. 【JSP】JSP的运行原理
  9. 通用的日志处理类(分享)
  10. JS 基础知识点及常考面试题(二)
  11. 生意场逃不开三个关键词:留存、转化、数据
  12. 阅读之大量数据访问机器的架构优化
  13. HIT 软件构造 软件维护 设计原则
  14. java压缩图片大小不改变图片分辨率
  15. 微信小游戏跳一跳外挂辅助程序
  16. Hadoop-Spark企业应用实战
  17. introduction与related work
  18. 【15】蓝桥杯之史丰收速算(程序填空题)
  19. python的key函数_由 sort 中 key 的用法浅谈 python
  20. 人工智能专业好就业吗?AI就业前景

热门文章

  1. html 定义函数调用函数,HTML function函数怎么定义和调用?
  2. STM32_ADC模块及针对芯片MAX40056FAUA/V+的使用
  3. javascript 面向对象-面试题实例
  4. python raise的用法
  5. 利用Java编写手机应用程序PalmOS基础篇
  6. 2020双11:看阿里背后的黑科技!
  7. 程序员的数学【结城浩】学习笔记(1-3章)0的故事,逻辑,余数
  8. Linux基础知识及系统管理(一):Linux常用命令
  9. 巧用历史记录画笔给美女去斑
  10. VUE(10)--添加背景图片以及背景图片自适应