首页 > 其他分享 >String字符串拼接原理

String字符串拼接原理

时间:2024-06-23 22:09:38浏览次数:3  
标签:String 对象 s2 s1 拼接 字符串 常量

分为三种情况

字符串常量与字符串常量

字符串常量之间的拼接操作在未加载到内存之前就已经完成了。在前端编译期间(即将.java源文件编译为.class字节码文件),会对字符串常量之间的拼接操作进行优化。

对应的指令:

可以看到对于s1和s2这两个局部变量,它们指向的是常量池中同一个对象,它们存储的都是常量池中"abc"对象的地址。所以在指向==运算时其结果为true。

字符串常量与变量

字符串拼接操作中只要其中有一个是变量,结果就在堆中。且变量拼接的原理是创建一个StringBuilder类的对象,调用其append方法,拼接完成后再调用该对象的toString()方法(该方法已经被重写了)返回一个字符串对象。

 public void test1(){
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab";
        String s4 = s1+s2;
        System.out.println(s3==s4);//结果为false
    }

对应字节码:

 0 ldc #5 <a>
 2 astore_1
 3 ldc #6 <b>
 5 astore_2
 6 ldc #7 <ab>
 8 astore_3
 9 new #8 <java/lang/StringBuilder>
12 dup
13 invokespecial #9 <java/lang/StringBuilder.<init>>
16 aload_1
17 invokevirtual #10 <java/lang/StringBuilder.append>
20 aload_2
21 invokevirtual #10 <java/lang/StringBuilder.append>
24 invokevirtual #11 <java/lang/StringBuilder.toString>
27 astore 4
29 getstatic #3 <java/lang/System.out>
32 aload_3
33 aload 4
35 if_acmpne 42 (+7)
38 iconst_1
39 goto 43 (+4)
42 iconst_0
43 invokevirtual #4 <java/io/PrintStream.println>
46 return
  1. 加载字符串常量池中的a,将a的地址存储在局部变量表1的位置,即变量s1中
  2. 加载字符串常量池中的b,将b的地址存储在局部变量表2的位置,即变是s2
  3. 加载字符串常量池中的ab,将ab的地址存储在局部变量表2的位置,即变量s3中
  4. 在对以局部变量s1和s2进行字符串拼接的时候,首先创建了一个StringBuilder对象,调用其构造器方法init().
  5. 将局部变量表中的下标为1、2的变量加载到操作数栈中,然后调用append方法添加到StringBuider对象的末尾,即实现了a、b字符串的连接
  6. 最后调用StringBuilder的toString方法生成—个新的String对象返回
    特别注意:
    StringBuilder的toString()方法调用的时String重载的构造器方法,是以字符数组为字符串实际内容进行创建的,并未直接以字面量方式进行创建String对象,即:


    由于未直接出现字面量("abc"这种,下面s1、s2、s3等号右边都直接出现了字面量,会在字符串常量池创建对应的对象),不会在字符串常量池中创建对应的对象。StringBuilder调用toString()方法创建的String对象会直接在堆中为其分配内存,常量池中不存在对应的对象
 public void test1(){
        String s1 = "a";
        String s2 = "b";
        String s3 = "ab";
        String s4 = s1+s2;
        System.out.println(s3==s4);//结果为false
    }

所以s3引用指向的时字符串常量池中的"ab"对象,而s4指向的时堆中的"ab"对象,二者指向的地址不同,所以进行==操作的结果为false。

文献参考:https://blog.csdn.net/qq_45800640/article/details/120284367

标签:String,对象,s2,s1,拼接,字符串,常量
From: https://www.cnblogs.com/shuijibaobao/p/18259813

相关文章

  • 算法训练营第六十七天 | 卡码网110 字符串接龙、卡码网105 有向图的完全可达性、卡码
    卡码网110字符串接龙这题一开始用的邻接表+dfs,不幸超时#include<iostream>#include<list>#include<string>#include<vector>usingnamespacestd;intminLen=501;boolcount(stringa,stringb){intnum=0;for(inti=0;i<a.lengt......
  • 给定一字符串,从中提取最大的数字。
    给定一字符串,包含数字、小写字母、正负号、小数点,从中提取最大的数字。/***给定一字符串,包含数字、小写字母、正负号、小数点,从中提取最大的数字*abc56dfg+78ddd-89aa89.3ggg*/publicclassMain{publicstaticvoidmain(String[]args){System.out.p......
  • elasticsearch 全文搜素 query_string 搭配其他条件
    elasticsearch全文搜素query_string搭配其他条件{"query":{"bool":{"must":[{"term":{"item_type":"question"......
  • [Java基础]String
    String常量池/运行时常量池java类编译之后生成的.class文件包含三部分信息,类的基本信息,常量池,方法的定义通过javap-vxxxx.class命令可以看到Constantpool:#1=Methodref#2.#3//java/lang/Object."<init>":()V#2=Class#4......
  • [题解]AT_arc113_c [ARC113C] String Invasion
    题意给定一个字符串\(S\),你可以选择一个\(i(1\leqi\leq|S|)\),如果\(s_i=s_{i+1}\neqs_{i+2}\),就将\(s_{i+2}\)设为\(s_i\)。问:最多能操作几次。思路我们可以用一个后缀和\(s_{i,j}\)维护\(S_i\simS_n\)中与\(j\)不同的数量。然后,我们可以发现一......
  • [题解]AT_abc343_g [ABC343G] Compress Strings
    思路首先假设有两个串\(a,b\),如果\(b\)是\(a\)的子串,且\(a\neqb\)则不需要考虑\(b\);如果\(a=b\),则如需要保留一个\(a\)。做完上述操作后,显然最终的答案是由这些串按照一定顺序拼接起来,再删掉重叠部分。例如:abbcc与ccdde拼接为abbccccdde,发现cc是重复的,所以......
  • C语言之字符串处理函数
    目录1字符串处理函数1.1输入输出1.1.1输出函数puts1.1.2输入函数gets1.2连接函数1.2.1stract1.2.2strncat1.3复制1.3.1复制strcpy1.3.2复制strncpy1.3.3复制memcpy1.3.4指定复制memmove1.3.5指定复制memset1.3.6新建复制strdup1.3.7字符串设定strset1.4比较1.4.1......
  • 2663. 字典序最小的美丽字符串
    题目如果一个字符串满足以下条件,则称其为美丽字符串:它由英语小写字母表的前k个字母组成。它不包含任何长度为2或更长的回文子字符串。给你一个长度为n的美丽字符串s和一个正整数k。请你找出并返回一个长度为n的美丽字符串,该字符串还满足:在字典序大于s的所......
  • c++中string的用法
    STL的简介一.什么是STL二.STL的六大组件2.1仿函数2.2空间配置器2.3算法2.4迭代器2.5容器2.6配置器三.string类3.1string类3.2string类的常用接口说明代码示例运行结果3.3string类对象的容量操作代码示例sizelengthcapcityemptyresizereverse3.4string类对象的访问......
  • 【广度优先搜索 深度优先搜索 图论】854. 相似度为 K 的字符串
    本文涉及知识点广度优先搜索深度优先搜索图论图论知识汇总深度优先搜索汇总C++BFS算法LeetCode854.相似度为K的字符串对于某些非负整数k,如果交换s1中两个字母的位置恰好k次,能够使结果字符串等于s2,则认为字符串s1和s2的相似度为k。给你两个字母......