首页 > 其他分享 >String的不可变,StringBuilder.append方法和String.concat

String的不可变,StringBuilder.append方法和String.concat

时间:2024-02-16 15:11:08浏览次数:37  
标签:String StringBuilder length append 数组 concat

String.concat

对String字符串进行拼接的方法,我们通常用的“+”拼接字符串,效率相比concat更低,其内部实现方式类似于new StringBuilder().append,每次拼接都会创建一个StringBuilder对象。

concat方法的核心逻辑:创建长度为str.length+str2.length的char数组,通过Arrays.copyOf创建,该方法可以指定一个初始字符数组,选择为str.toCharArray,然后通过System.arraycopy方法将第二个字符数组填到初始字符数组中,最后通过new String将字符数组返回为String

1 joinStr.concat(joinStr2);
2 int otherLen = joinStr2.length();
3 int len = joinStr.length();
4 char buf[] = Arrays.copyOf(joinStr.toCharArray(), len + otherLen);
5 System.arraycopy(joinStr2.toCharArray(), 0, buf, len, joinStr2.length());
6 System.out.println("joinStr3:"+new String(buf));

 StringBuilder.append

append核心逻辑:通过Arrays.copyOf创建长度为sb1.length+sb2.length的新字符数组,再通过String.getChars将sb2塞入到新字符数组中,再将当前StringBuilder的count变量改为扩展后的长度,最后直接return this,并没有通过new String返回

1 value = Arrays.copyOf(value, newCapacity(minimumCapacity));
2 str.getChars(0, len, value, count);
3 count += len;

为什么String.concat需要new String返回新创建的char数组,而StringBuilder.append不需要,看源码可以看到String内部的char数组,也就是value,被private final修饰了,StringBuilder内部的没有,这代表String的value为一个私有的不可变的常量(反射可破坏),所以每次修改都需要new String对象,而StringBuilder.append每次都是修改的当前对象值。

由于Sting拼接字符串每次都创建新对象,所以效率低于append,在数据量小的情况下可以使用String,比较方便直接,而在大量数据的情况下需要使用append。StringUtils的join将列表拼成字符串,内部也是通过append实现的,也比较推荐。

标签:String,StringBuilder,length,append,数组,concat
From: https://www.cnblogs.com/zeevy/p/18017182

相关文章

  • StringUtils使用与源码分析
    在apache的lang3包中有个StringUtils工具类,该工具类为开发中常用的字符串处理工具类 非空判断,isBlank和isEmpty这俩方法的形参都是charSequence字符序列。isEmpty判断这个字符序列是否为null,还有长度是否为0,如果是,则返回true,反之返回falseisBlank在isEmpty之上还有一个,如果长度......
  • Go 100 mistakes - #25: Unexpected side effects using slice append
        ......
  • [LeetCode] 2108. Find First Palindromic String in the Array
    Givenanarrayofstringswords,returnthefirstpalindromicstringinthearray.Ifthereisnosuchstring,returnanemptystring"".Astringispalindromicifitreadsthesameforwardandbackward.Example1:Input:words=["abc&quo......
  • 字符串Stringjoiner
    不能添加数字,只能添加字符串......
  • 字符串StringBulider
    ......
  • 【C++】STL string类例题新思路记录(编写一个程序,告诉用户输入的句子包含多少个元音字
    题干:编写一个程序,告诉用户输入的句子包含多少个元音字母。 方案一:1、创建一个普通函数,依次传入5个元音字母对查找字符串进行检测。2、函数通过依次传入的单个元音字母,循环查找整个字符串最后返回统计值。1#include<string>2#include<iostream>3usingnamespace......
  • CF316G3 Good Substrings
    题意简述有一个字符串\(s\)和\(n\)条限制,每条限制给出字符串\(t_i\)和两个整数\(l_i,r_i\),要求一个字符串要满足在\(t_i\)中的出现次数要在\([l_i,r_i]\)之间。求\(s\)有多少本质不同的子串满足所有限制。\(|s|,\max|t|\le5\times10^4,n\le10\)分析“本质不同......
  • B. Following the String
    题解我们从左向右构建字符串。每种数字我们都从a开始取,接下来我们用一个数组来存储对应数字下一次要取的字母。Code #include<bits/stdc++.h>usingnamespacestd;constintN=2e5+5;intb[N],a[N];intmain(){intt;cin>>t;while(t--){strin......
  • Java中String、StringBuffer、StringBuilder的区别以及使用场景总结
    Java中,String、StringBuffer和StringBuilder都用于处理字符串,但在功能和性能上有显著的区别。了解这些区别有助于选择最适合特定情境的类型。在选择使用String、StringBuffer或StringBuilder时,应根据字符串操作的性能需求和线程安全要求来做出决定。1、String、StringBuffer、......
  • mysql插入数据出现java.sql.SQLException Create breakpoint : Incorrect string valu
    问题图片如下:  如果出现这个问题,就是当前的mysql设置的字符集和当前业务的需求符合;前:当前我需要在mysql中存入的内容中包括了表情等信息,如下:问题分析:因为我在docker中搭建的mysql设置的默认编码为utf-8,下面是我的my.cnf文件[client]default_character_set=utf8[my......