美文网首页
jvm关于String

jvm关于String

作者: 冉桓彬 | 来源:发表于2019-06-02 23:25 被阅读0次

先上代码

public class Test   {
    public void test(){
        String a = "a";
        String b = "b";
        String c = "ab";
        String d = a + b;
        String e = "a"+"b";
        Log.v("AndroidTest","c==d:"+(c==d));
        Log.v("AndroidTest","c==e:"+(c==e));
    }
}

输出结果为

06-02 22:22:46.043 1779-1779/? V/AndroidTest: c==d: false
06-02 22:22:46.043 1779-1779/? V/AndroidTest: c==e: true

接下来先复制一段概念:
凡是编译期能推断出值内容的字符串, 都会在编译时期编程字符串常量, 从而享有上面代码中提到的共享对象的待遇, 而运算中间插入了变量, 让编译器认为只有运行时才能判断其内容的字符串, 则会在运行时产生新的对象.

编译期优化(复制粘贴java语言规范里面的内容)

  • 1、通过常量表达式运算得到的字符串是在编译时计算得出的, 并且之后会将其当作字面常量对待.
  • 2、在运行时通过连接运算得到的字符串是新创建的, 因此会区别对待.
  • 3、如果显示地限定运算得到的字符串, 得到的结果与任何之前存在的具有相同内容的字面常量字符串是相同的字符串.

针对上面的结论打开Test.java编译之后得到的Test.class文件

package androidtest.myapplication;
import android.util.Log;
public class Test {
    public Test() {}
    public void test() {
        String a = "a";
        String b = "b";
        String c = "ab";
        // a+b在编译成字节码时, 会通过StringBuilder.append的方式, 然后再通过toString()获取
        // 对应的字符串结果, 而StringBuilder.toString又是使用new String方式创建了字符串.
        String d = (new StringBuilder()).append(a).append(b).toString();
        // 对应上面代码, 可以看出在编译成字节码文件时, 进行了编译优化, e直接被合并成了"ab",
        // 也就是说在实际运行时, c在字符串常量池中创建一个"ab"的字符串常量, 然后e会直接从字
        // 符串常量池中获取已有的常量"ab".
        String e = "ab";
        Log.v("AndroidTest", (new StringBuilder()).append("c==d:").append(c == d).toString());
        Log.v("AndroidTest", (new StringBuilder()).append("c==e:").append(c == e).toString());
    }
}

StringBuilder.toString

@Override
public String toString() {
    // 创建新的字符串, 并没有复用字符串常量池中已有的"ab".
    return new String(value, 0, count);
}

相关文章

  • jvm关于String

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

  • String源码分析

    概述 在分析String的源码之前,打算先介绍一点关于JVM的内存分布,这样有助于我们更好地去理解String的设...

  • 【译】 JVM Anatomy Park #10: String

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

  • 精彩的博客

    计算机网络 简析TCP的三次握手与四次分手 jvm java中的String 这篇文章详细讲述了关于String在...

  • JavaSE常用API之String相关

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

  • String长度限制

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

  • String 和 JVM

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

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

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

  • Java基础之String漫谈(三)

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

  • 字符串比较案例

    代码 分析 String类是final修饰的,以字面量的形式创建String变量时,jvm会在编译期间就把该字面量...

网友评论

      本文标题:jvm关于String

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