首先理解一下Java中内存的管理方法,Java把内存划分为两种,堆内存和栈内存。

堆内存是用来储存数组和对象的内存空间,栈内存是用来存放基本数据类型和对象的引用。栈内存中信息会在生命周期结束时自动释放,而堆内存中的信息则需要当栈中变量没有对该对象的引用,且垃圾回收站开始回收空间时才会释放。

或许上面一段话比较容易理解,但是参考以下实例,或许会有更深的体会:

1.两个字符串的比较。

这种写法可能是我们平时最常见到的写法(为了方便,这里在每行代码前加了序号)

1

String s1="China";

2

  String s2="China";

3

  System.out.println("s1 == s2 :"+(s1==s2));

4

  System.out.println("s1 equals s2 :"+(s1.equals(s2)));

根据我们的经验,第四行的代码应该没有问题,因为equals方法是调用Comparable接口中的compareTo方法,而String中的实现是对两个对象内容的比较,因此,第四行代码打印结果应该为true,那么第三行代码呢?第三行代码是对两个对象的比较,比较两个对象是否为同一个对象,也就是要比较s1和s2是否指向同一个String对象,或许多数朋友以为第三行代码的结果应该为false,但是意外的是,第三行代码同样为true。这是因为Java在执行的过程中,当遇到第一行代码时,会先到堆内存中是否有一个China的字符串对象,如果有,则会在栈中新建一个引用指向该对象,否则,就会在堆中新建一个China的字符串对象,然后在栈中新建一个堆该对象的引用,由此可知,其实在前两行代码中,只建立了一个字符串对象,那么第三行代码就容易理解了,其实s1和s2的比较只是指向同一个对象的两个引用的比较,所以结果同样是true。

因此上面代码的最终运行结果为:

s1 == s2 : true

s1 equals s2 : true

2.对上面的代码稍做修改,如下:

1

String s1=new String("China");

2

  String s2=new String("China");

3

  System.out.println("s1 == s2 :"+(s1==s2));

4

  System.out.println("s1 equals s2 :"+(s1.equals(s2)));

简单在定义两个字符串变量时添加一个new关键字,如大家所料,这次的运行结果是:

s1 == s2 : false

s1 equals s2 : true

很明显,调用new关键字时,JVM不会去判断堆中是否已经存在了该对象,而是直接再新建一个对象,然后在栈中新建该对象的引用。

java中的堆和栈_实例理解Java中的堆和栈相关推荐

  1. java compareto方法怎么排序的_深入理解Java中Comparable和Comparator排序

    本文有牛旦教育原创,头条首发,转载注明来源. 如何为需要的排序算法选择正确的接口?通过本文的分析讲解,我们会找到答案参考答案. 程序员经常需要将数据库中的元素排序为集合.数组或映射.在Java中,我们 ...

  2. java虚拟机和内存的关系_深入理解java虚拟机(linux与jvm内存关系)

    本文转载自美团技术团队发表的同名文章 https://tech.meituan.com/linux-jvm-memory.html 一, linux与进程内存模型 要理解jvm最重要的一点是要知道jv ...

  3. java内存分配和垃圾回收_深入理解java虚拟机(二)垃圾收集器与内存分配策略...

    垃圾收集器与内存分配策略 垃圾收集,三个步骤 什么时候收集,收集那些,怎么收集 1.收集那些 我们会将一些不使用的对象进行收集,进行回收内存空间,我们怎么知道呢 1.引用计数法 如果这个实例被其他地方 ...

  4. java实例化类之后如何赋值_深入理解Java对象的创建过程:类的初始化与实例化...

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

  5. java的跨平台特性是指_如何理解JAVA的跨平台特性

    1.java的跨平台,是指java在运行时是凌驾于os之上,是在jvm中运行的,跟os没有直接联系. 2.java跨平台主要是由java的编译方式决定的,因为java是通过jvm先编译再执行,它编译的 ...

  6. python中继承是什么意思_如何理解Python中的继承?python入门

    如何理解Python中的继承?如今,python编程语言深受企业和个人的喜爱.python开发工程师是近年来互联网行业非常热门的职业岗位之一.学习python的人除了零基础的,还有一部分是在职运维.在 ...

  7. 简述java中的注释以及用法_怎样理解 Java 注解和运用注解编程?

    正好最近在公众号(BetterAndroid)发了一篇关于注解的文章,贴在这里吧,希望对题主有帮助. 一.什么是注解 我们都知道在Java代码中使用注释是为了提升代码的可读性,也就是说,注释是给人看的 ...

  8. java中线程调度遵循的原则_深入理解Java多线程核心知识:跳槽面试必备

    多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲.在平时工作中如若使用不当会出现数据错乱.执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关 ...

  9. Java基本数据类型的自动转换_彻底理解Java中的基本数据类型转换(自动、强制、提升)...

    说基本数据类型转换之前,先了解下 Java 中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围,如下图所示. 重新温故了下原始数据类型,现在来解释下它们之间的转换关系. 自动类型转换 自 ...

  10. java装箱与拆箱原理_深入理解Java中的装箱和拆箱

    前言 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 若有不 ...

最新文章

  1. c语言程序设教材计 乌云高娃,C语言程序设计教学课件作者第3版乌云高娃演示文稿C语言程序设计教学课件作者第3版乌云高娃演示文稿演示文稿第1章C语言程序设计基础课件.ppt...
  2. python安装docx库_linux 环境下的python 安装 docx 的过程
  3. identifyTask练习
  4. Java知识整理——容器
  5. 计算机网络第一二三章计算题,计算机网络第3章习题及答案
  6. linux 获取本机的所有IP地址
  7. 有了SDS,硬件还重要吗?
  8. 【BZOJ 1036】 树的统计count
  9. 使用springboot遇到的的异常
  10. 云存储是否能拯救数据泛滥
  11. Alex 的 Hadoop 菜鸟教程: 第18课 用Http的方式访问HDFS - HttpFs 教程
  12. 微星主板节能模式怎么关闭_微星正设计一套易用化BIOS 根据散热器自动调节性能释放_笔记本新闻...
  13. Unity SRP自定义渲染管线学习1.1:初步搭建
  14. DTCC2019 中国数据库技术大会见证实录(PPT 下载,来了!)
  15. 光吹牛可不行 无人驾驶何时才能实现真正无人? | 观察
  16. python百度unit_Python——在调用Baidu的unit接口时,如何设置意向置信度,使其始终返回第一个say,实现,百度,UNIT,意图,总是...
  17. vue 中 keep-alive,activated,deactivated
  18. 基于PaddleGAN项目人脸表情动作迁移学习(五)图像补帧上色与超分修复
  19. 颜色表大全 | HTML Color Table
  20. java实现商品sku_jquery实现商品sku多属性选择功能(商品详情页)

热门文章

  1. java监听键盘事件(控制台输出按键信息)
  2. JetBrains:更改webstrom、IDEA等主题
  3. LeetCode:每日一题(2020.4.7)
  4. mysql中的编号怎么自动加_MySQL中实现ID编号自动增加的方法
  5. 深度学习笔记_基本概念_Depthwise卷积与Pointwise卷积
  6. opencv图像分析与处理(12)-逆滤波、维纳滤波、约束最小二乘方滤波和几何均值滤波
  7. 关于wait、notify在火车售票战的实例
  8. 图像增强算法效果评价指标及实现
  9. sim3相较于se3的好处
  10. 堆排序(C++实现,非常简洁明了)