Java中"abc"和new String("abc")有什么区别?

互联网 19-3-22

本篇文章给大家带来的内容是关于Java中"abc"和new String("abc")有什么区别?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

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

正文

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

现在有一个类,定义入下

public class A01 {     public static void main(String ... args){         String a = "123";         String c = new String("123");     } }

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

Compiled from "A01.java" public class javap.A01 {   public javap.A01();     Code:        0: aload_0        1: invokespecial #1                  // Method java/lang/Object."<init>":()V        4: return    public static void main(java.lang.String...);     Code:        0: ldc           #2                  // String 123        2: astore_1        3: new           #3                  // class java/lang/String        6: dup        7: ldc           #2                  // String 123        9: invokespecial #4                  // Method java/lang/String."<init>":(Ljava/lang/String;)V       12: astore_2       13: return }

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

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

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

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

本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的Java教程视频栏目!

以上就是Java中"abc"和new String("abc")有什么区别?的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: java
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:java批量修改文件后缀的方法介绍

相关资讯