美文网首页
String 和 JVM

String 和 JVM

作者: 互联网混凝土瞬移师 | 来源:发表于2020-05-27 18:30 被阅读0次

String 常见的创建方式有两种:

  • new String()
  • 直接赋值

直接赋值的方式会先去字符串常量池中查找是否已经有此值,如果有则把引用地址直接指向此值,否则会先在常量池中创建,然后再把引用指向此值;
而 new String() 的方式一定会先在堆上创建一个字符串对象,然后再去常量池中查询此字符串的值是否已经存在,如果不存在会先在常量池中创建此字符串,然后把引用的值指向此字符串,如下代码所示:

String s1 = new String("Java");
String s2 = s1.intern();
String s3 = "Java";
System.out.println(s1 == s2); // false
System.out.println(s2 == s3); // true

它们在 JVM 存储的位置,如下图所示:


小贴士:JDK 1.7 之后把永生代换成的元空间,把字符串常量池从方法区移到了 Java 堆上。

除此之外编译器还会对 String 字符串做一些优化,例如以下代码:

String s1 = "Ja" + "va";
String s2 = "Java";
System.out.println(s1 == s2);

虽然 s1 拼接了多个字符串,但对比的结果却是 true,我们使用反编译工具,看到的结果如下:

Compiled from "StringExample.java"
public class com.lagou.interview.StringExample {
  public com.lagou.interview.StringExample();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
    LineNumberTable:
      line 3: 0

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String Java
       2: astore_1
       3: ldc           #2                  // String Java
       5: astore_2
       6: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       9: aload_1
      10: aload_2
      11: if_acmpne     18
      14: iconst_1
      15: goto          19
      18: iconst_0
      19: invokevirtual #4                  // Method java/io/PrintStream.println:(Z)V
      22: return
    LineNumberTable:
      line 5: 0
      line 6: 3
      line 7: 6
      line 8: 22
}

从编译代码 #2 可以看出,代码 "Ja"+"va" 被直接编译成了 "Java" ,因此 s1==s2 的结果才是 true,这就是编译器对字符串优化的结果。

相关文章

  • String 和 JVM

    String 常见的创建方式有两种: new String() 直接赋值 直接赋值的方式会先去字符串常量池中查找是...

  • 【译】 JVM Anatomy Park #10: String

    原文地址:JVM Anatomy Park #10: String.intern() 问题 String.inte...

  • JavaSE常用API之String相关

    0x01 java.lang.String String是不可变的,且在创建String的时候,JVM会在常量池中...

  • String长度限制

    String长度有限制吗?是多少? Java中String是有长度限制的,在JVM编译中还有规范。String其实...

  • String和JVM的那些事

    1.String有两种常见方法String abc = "xxxx";String abc = new Strin...

  • jvm关于String

    先上代码 输出结果为 接下来先复制一段概念:凡是编译期能推断出值内容的字符串, 都会在编译时期编程字符串常量, 从...

  • 经典面试题:String str = new String("a

    在JVM中,会单独划分一块内存给String。字符串的分配需要消耗高昂的时间和空间,且使用又比较频繁。JVM为了提...

  • Java String 文字(Literal)和 对象(Obje

    当我们创建 String 对象的时候,如果使用new()的方式来创建一个 String 对象,JVM 将会每次都会...

  • Java基础之String漫谈(三)

    @[toc] 1. 导读 2. JVM内存模型的简介 在介绍String的常量池之前, 先插播下JVM的内存模型,...

  • Java

    1. JVM 你真的了解String类的intern()方法吗? Java虚拟机架构 内存管理和垃圾回收 浅谈JV...

网友评论

      本文标题:String 和 JVM

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