• String+变量”的操作是在运行时进行


    “String+变量”因为编译时无法进行优化(为什么无法进行优化),所以这一条语句的操作是在运行时进行的,且会产生新的对象,而不是直接从jvm的string池中获取。 那么新的对象是保存在哪里呢?是堆中吗?
    如下代码:
    1. String a = "ab"; 
     
    2. String bb = "b"; 
     
    3. String b = "a" + bb; 
     
    System.out.println((a == b));
    java中String的+运算符编译后其实是转换成了这样的代码:
    3. String b = new StringBuilder().append("a").append(bb).toString();
    看下StringBuilder的toString方法,使用new String(...);来构造一个String对象。

    String有两种构造方法,一种是new String,在jvm堆中分配,一种是String a="ab"这种方式,这种特殊的方式过程是这样的:JVM会先在string pool中去查找是否存在"ab"这样的字符串,如果存在就把引用地址返回,如果不存在,则构造一个并把它放到string pool中。

    很明显3的构造方法是使用了new来构造的,因此在jvm中的引用地址跟a肯定是不一样,你使用==来比较,比较的是它们的引用地址,它们肯定不相等,当然是false了。
    “+”这个连接符在编译后是String b = new StringBuilder().append("a").append(bb).toString();不能说
    String b = "a" + bb;
    在运行中等效于
    String b = new String("ab");
    。如果说都是在堆中分配这个意思的话,那就是等效的。
  • 相关阅读:
    C# Task ContinueWith的实现
    C# Task 是什么?返回值如何实现? Wait如何实现
    C# ExecutionContext 实现
    C# Barrier 实现
    C# CountdownEvent实现
    C# SemaphoreSlim 实现
    C# ManualResetEventSlim 实现
    C# Monitor实现
    C# SpinLock实现
    C# SpinWait 实现
  • 原文地址:https://www.cnblogs.com/chenlong-50954265/p/5632275.html
Copyright © 2020-2023  润新知