zoukankan      html  css  js  c++  java
  • 关于两个字符串用加号连接

    String s1="sss";
    String s2="aaa";
    String s3=s1+s2;
    String s4="sss"+"aaa";

    问题一

    System.out.println(s4=="sssaaa");//false

    问题二

    System.out.println(s3=="sssaaa");//true

    有一个东西叫做常量折叠,是一种编译器优化技术。

    常量折叠有什么条件?
    必须是编译期常量之间进行运算才会进行常量折叠。
    编译期常量就是“编译的时候就可以确定其值的常量”,而且这个认定比较严格。
    首先:字面量是编译期常量。(数字字面量,字符串字面量等)
    其次:编译期常量进行简单运算的结果也是编译期常量,如1+2,"a"+"b"。
    最后:被编译器常量赋值的 final 的基本类型和字符串变量也是编译期常量。

    对于问题(一)
     都是字符串字面量相加,都是编译期常量,都会被编译器进行常量折叠。

    对于问题(二)
     s3却是两个非 final 的变量相加,所以不会进行常量折叠。
    而是根据 String 类特有的 + 运算符重载,变成类似这样的代码
    String s3 = new StringBuffer(a).append(b).toString(); 
    

    这里toString()会生成新的String变量,显然用 == 运算符比较是会返回 false。

  • 相关阅读:
    C++ std::map::erase用法及其陷阱
    写在分类之首-----to do list!
    Gradle系列教材(译)
    Android进阶-UIL分析
    ArrayList源码解析
    Android进阶-MVP
    高质量代码-树的子结构
    高质量代码-并和链表
    高质量代码-翻转链表
    高质量代码-链表中倒数第k个结点
  • 原文地址:https://www.cnblogs.com/feng--fan/p/8027904.html
Copyright © 2011-2022 走看看