美文网首页
Java字符串在内存中的管理

Java字符串在内存中的管理

作者: everlaa | 来源:发表于2018-02-01 16:27 被阅读0次

本文总结一下关于比较字符串使用 “==” 的情况。

上来先做题: image.png 结果: image.png

怎么回事???

运行结果是不是还和上篇文章一样奇怪,是不是又想着是 Java 编译器捣的乱?打开 .class 文件:

image.png 发现编译器除了对源代码进行了简单的格式化,并没有任何额外的操作。

代码分析

那结果是怎么来的?通过上节的讲解,我们知道 .class 文件是被加载到 JVM(Java虚拟机) 中运行的。那么,是不是JVM在执行的时候做了什么额外的操作?

一句句分析代码,在 JVM 中,当代码执行到 String s1 = "100" 时,会先看 常量池 有没有刚好是 "100" 的 字符串常量对象,如果没有,则在常量池中创建该对象并将 s1 引用指向该对象。

image.png

PS:图中只是画出了 main 方法栈和相关对象在内存中的大致模拟,实际上 JVM 的内存管理比较复杂,有待深入研究。

继续执行 String s2 = "100",JVM 仍然会到常量池寻找值为 100 的字符串常量,由于执行了上句代码,发现常量池已经有了该对象,则直接将 s2 引用指向该对象,不会在常量池或堆内存创建新的对象。 image.png

因为 “==” 判断的是两个引用是否指向同一个对象,所以执行打印结果为 true。

这时候执行到了 String s3 = new String("100") ,由于代码中加了一个 new 关键字,这个关键字就是告诉 JVM,你直接在堆内存中给我开辟一块新的内存。如下图所示:

image.png

继续执行 String s4 = new String("100")

image.png
由于两个引用 s3 和 s4 指向的不是同一个对象,所以打印结果是 false 了。

结论:

由以上抛出的问题我们知道了 String 类型对象不同的声明方式在内存中展现的形式是不一样的。
当我们比较两个字符串对象的内容时,无论声明方式是怎样的,都一定要使用 equals 方法,不能使用 “==”。

原文作者:清浅池塘
原文链接:https://zhuanlan.zhihu.com/p/27570687

相关文章

  • Java内存泄漏

    Java中的内存管理 要了解Java中的内存泄漏,首先就得知道Java中的内存是如何管理的。 在Java程序中,我...

  • 说说Java内存泄漏

    Java中的内存管理 要了解Java中的内存泄漏,首先就得知道Java中的内存是如何管理的。 在Java程序中,我...

  • android 内存泄漏

    内存泄漏 内存管理 内存模型 Android原生开发以java为主。 在java中,Java内存模型,往往是指J...

  • Q:Java有几种引用类型?

    Java有几种引用类型 引自 java 知识 之 内存管理 Java 中的内存管理包括内存分配和内存回收,这些都是...

  • Java内存泄漏

    本文将会介绍: C++中的内存泄露 Java内存管理与垃圾回收 Java中的内存泄漏 一、C++中的内存泄露 在大...

  • JVM内存区域与垃圾回收

    1、JAVA内存区域与内存溢出 1.1、概述 Java中JVM提供了内存管理机制,Java虚拟机在执行Java程序...

  • JVM知识

    java字符串在内存中:存放于堆中或者字符串常量区 堆内存 堆内存分为Permanent Space(持久代) 和...

  • 1、java 内存区域及内存溢出异常

    java 内存区域和内存溢出异常是相互承接的,在java中内存是由虚拟机内存管理机制动态管理的,但在实际运行中会出...

  • 内存管理

    内容包括: C++内存管理 Java内存管理 C++内存管理 内存分配方式 在C++中,内存分成5个区,分别是栈、...

  • Java是如何管理内存

    为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放...

网友评论

      本文标题:Java字符串在内存中的管理

      本文链接:https://www.haomeiwen.com/subject/yridzxtx.html