Java中“abc"和新的字符串(“abc")有哪些区别

  介绍

这篇文章将为大家详细讲解有关Java中“abc"和新的字符串(“abc")有哪些区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

Java工程师面试官偏爱的问题之一,就是“abc"和新的字符串(“abc")的区别是什么?回答的比较好的会带出Java堆、栈,常量池,引用等概念。但今天不止如此,我们从指令的角度,去看这个问题。

正文

我们知道,Java类编译后的字节码是个二进制文件,不是给人而是给机器阅读的。但是Java有一个javap的指令,可以把字节码翻译成人类能看懂的东西。

javap是Java类文件分解器,可以反编译(即对javac编译的文件进行反编译),也可以查看Java编译器生成的字节码。用于分解类文件。

现在有一个类,定义入下

公共类A01 {   公共静态void main(字符串…args) {   字符串a=?23”;   字符串c=新的字符串(“123”);   }   }

先用javac A01。java编译成字节码,再使用javap - c A01。类进行反编译。得到入下文本

编制从“A01.java"   公共类程序。A01 {   公共javap.A01 ();   代码:   0:aload_0   方法1:invokespecial # 1//java/lang/对象!”& lt; init>“: V ()   4:返回      公共静态孔隙主要(以…);   代码:   123年0:ldc # 2//字符串   2:astore_1   3:新# 3//java/lang/String类   6:dup   7:ldc 123 # 2//字符串   9:invokespecial # 4//方法干净自己的java/lang/String; & lt; init>“: (Ljava/lang/String;) V   12:astore_2   13:返回   }

我们主要看下面这段关于主方法的文本,里面涉及的指令不多,我整理了一下

ldc:将常亮加载到操作数栈
astore_1:将栈顶元素的值保存到变量1
新:为要创建的类实例开辟内存空间,并将地址压入操作数栈
dup:复制操作数栈顶值,并将其压入栈顶
invokespecial:调用方法,例子中的方法是类的构造器

现在我们结合指令和操作数栈,来模拟一次计算

 Java中“abc"和新的字符串(“abc")有哪些区别

回到最开始的问题,a=?23”;和一个=新的字符串(“123”)的区别,前者指向的是常量池的地址,后者指向的是堆中新开辟的地址。这两个==的结果,自然是不相等的.equals的结果呢?=是字符逐个比较内容,是相等的。

关于Java中“abc"和新的字符串(“abc")有哪些区别就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

Java中“abc"和新的字符串(“abc")有哪些区别