zoukankan      html  css  js  c++  java
  • String中字符串==分析

    String中字符串==分析

    new String

    new String都是在堆上创建字符串对象。
    在这里插入图片描述

    intern()

    调用intern()方法时,编译器会将字符串添加到常量池中(StringTable维护),并返回指向该常量的引用。
    在这里插入图片描述

    String str2 = new String("str")+new String("01");
    str2.intern(); //将常量池中的引用地址返回给str2
    String str1 = "str01";
    System.out.println(str2==str1);  //返回为true
    
    String str2 = new String("str")+new String("01");
    String str1 = "str01";
    str2.intern(); //可以这里理解,当字符串常量池中已经有了str01字符串,那么此条没有做什么操作
    System.out.println(str2==str1);  //返回false
    

    通过字面量赋值

    如:String str = "twn";时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串;若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串。
    在这里插入图片描述

    常量字符串 “+”

    常量字符串的 “+”操作,编译阶段直接会合成为一个字符串。如string str=”JA”+”VA”,在编译阶段会直接合并成语句String str=”JAVA”,于是会去常量池中查找是否存在”JAVA”,从而进行创建或引用。

    对于final字段

    对于final字段,编译期直接进行了常量替换(而对于非final字段则是在运行期进行赋值处理的)。
    final String str1=”ja”;
    final String str2=”va”;
    String str3=str1+str2;
    在编译时,直接替换成了String str3=”ja”+”va”,根据上面的规则,再次替换成String str3=”JAVA”

    变量和常量字符串拼接

    常量字符串和变量拼接时(如:String str3=baseStr + “01”;)会调用stringBuilder.append()在堆上创建新的对象。

    参考博客

    几张图轻松理解String.intern():https://blog.csdn.net/soonfly/article/details/70147205

  • 相关阅读:
    有一个双重模板化的错误实现
    非类型模板参数
    C++模板
    初始化列表initializer_list
    C++类型转换
    const引用和constexpr
    逆元
    卡特兰数
    最短路问题
    Android打印机效果的闪屏
  • 原文地址:https://www.cnblogs.com/liuligang/p/10619502.html
Copyright © 2011-2022 走看看