🍪
cookielau
  • Introduction
  • Machine Learning
    • Distributed
      • Bookmarks
    • NLP
      • Transformers
    • MLC
      • Tensor Program Abstraction
      • End-to-End Module Execution
  • Framework
    • PyTorch
      • Bookmarks
      • Model
      • Shared
      • Miscellaneous
    • Tensorflow
      • Bookmarks
      • Model
      • Shared
      • Miscellaneous
    • CUDA
      • Bookmarks
    • DeepSpeed
    • Bagua
      • Model
      • Optimizer
    • Others
      • Bookmarks
  • About Me
    • 2022-04-28
  • Random Thoughts
  • Archives
    • CPP
      • Bookmarks
      • Container
      • Algorithm
      • FILE CONTROL
      • Virtual Table
      • Assembly
      • Key Words
      • Problems
      • Others
    • JAVA
      • String Container
      • Maps
    • PYTHON
      • Bookmarks
      • Python Tools
        • Batch Rename
        • Combine Excel
        • Excel Oprations
        • Read Write Excel
        • Rotate PDF
      • Library
        • Pandas Notes
        • Numpy Notes
        • Json Notes
      • Spider
        • Selenium Install
        • Selenium Locating
        • Selenium Errors
        • Selenium Basics
      • Django
        • Start Up
      • Others
    • LINUX
      • Installation
      • Cli Tools
      • WSL
      • Bugs
    • JUNIOR2
      • Economics
        • Chapter 0x01 经济管理概述
        • Chapter 0x02 微观市场机制分析
        • Chapter 0x03 生产决策与市场结构
        • Chapter 0x04 宏观经济市场分析
        • Chapter 0x05 管理的职能
        • Chapter 0x06 生产系统结构与战略
        • Chapter 0x0b 投资项目经济评价
        • Chapter 0x0f 投资项目经济评价
      • Computer Network
        • 概述
        • 分层模型
        • 物理层
        • 数据链路层
        • 网络层
        • 传输层
        • 应用层
        • HTTP(s)实验
        • [Practice]
      • Software Engineering
        • Introduction
        • Demand Analysis
        • Task Estimation
        • Presentation
      • Network Security
        • Chapter 0x01 概述
        • Chapter 0x02 密码学
        • Chapter 0x03 公钥体制
        • Chapter 0x04 消息认证
        • Chapter 0x05 密钥管理
        • Chapter 0x06 访问控制
        • Assignments
      • x86 Programming
        • Basic Knowledge
        • Program Design
        • System Interruption
        • Frequently used functions
    • MD&LaTex
      • Markdown
      • LaTex
    • NPM
      • NPM LINK
    • MyBlogs
      • 2020BUAA软工——“停下来,回头看”
      • 2020BUAA软工——“初窥构建之法”
      • 2020BUAA软工——“上手软件工程,PSP初体验!”
      • 2020BUAA软工——“深度评测官”
      • 2020BUAA软工——“并肩作战,平面交点Pro”
    • SC
      • PAC 2022
        • Lectures
      • OpenMP & MPI
        • MPI Overview
        • Message Passing Programming
        • OpenMP Overview
        • Work Sharing Directives
        • Annual Challenge
        • Future Topics in OpenMP
        • Tasks
        • OpenMP & MPI
    • Hardware
      • Nvidia GPU
        • Frequent Error
        • Memory Classification
        • CUDA_7_Streams_Simplify_Concurrency
        • Optimize_Data_Transfers_in_CUDA
        • Overlap_Data_Transfers_in_CUDA
        • Write_Flexible_Kernels_with_Grid-Stride_Loops
        • How_to_Access_Global_Memory_Efficiently
        • Using_Shared_Memory
      • Intel CPU
        • Construction
        • Optimization
        • Compilation
        • OpenMP
    • English
      • Vocab
      • Composition
    • Interview
      • Computer Network
Powered by GitBook
On this page

Was this helpful?

  1. Archives
  2. JAVA

String Container

Feb 10th, 2020 - Now

字符串拼接

  1. '+' :直接相加,内部实现是创造新的 stringBuilder 然后进行 append 操作然后再 toString() 返回字符串

     String a = "abc";
     String b = a + "efg";
  2. concat 方法:先将所有的字符放到一个新的 char[] 中,然后再创建新的 String

     String a = "abc";
     String b = a.concat(",").concat(a);
  3. StringBuilder :容纳可变长的字符串加减变化,扩容通过继续申请连续的空间,直接将接入的字符串拷贝到自己原先维护的内部 char[] 中

     StringBuilder a = new StringBuilder("init");
     String b = "abc";
     a = a.append(b);
     StringBuilder c = a.append("end"); // c="initabcend"
  4. StringBuffer :带有 synchronized 的 StringBuffer,其是线程安全的,可以保证多线程中的并发访问

     // 查看 StringBuffer 的 append 方法:
     public synchronized StringBuffer append(String str) {
         toStringCache = null;
         super.append(str);
         return this;
     }
  5. StringUtils.join() :将数组或集合 以某种拼接符拼接到一起,传入的是一个集合和自定的 separator,内部也是使用 StringBuilder 实现

     String []list = {"abc", "def", "ghi"};
     String a = StringUtils.join(list, "-"); // a="abc-def-ghi"
  6. StringJoiner :JDK8 中的新特性,可以自定义拼接符,前缀和后缀,更重要的是支持流处理,内部也是使用 StringBuilder 实现

     // Java Doc 的介绍
     // A StringJoiner may be employed to create formatted output 
     //      from a Stream using Collectors.joining(CharSequence)
    
     // 构造函数
     StringJoiner(CharSequence delimiter);
     StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix);
    
     // 普通操作
     StringJoiner sj = new StringJoiner("COOKIE"); // 注意这里是分隔符不是初始值
     sj.add("abc");
     sj.add("def");
     System.out.println(sj.toString()); // abcCOOKIEdef
    
     StringJoiner sj1 = new StringJoiner("-","begin:",":end");
     sj1.add("abc").add("def");
     System.out.println(sj1.toString()); // begin:abc-def:end
    
     // 流操作
     List<String> list = ImmutableList.of("abc","def","ghi");
     list.stream().collect(Collectors.joining("-")); // "abc-def-ghi"
    
     // 上面的 Collectors.joining() 源码
     public static Collector<CharSequence, ?, String> 
         joining(CharSequence delimiter,CharSequence prefix,CharSequence suffix) {
         return new CollectorImpl<>(
                 () -> new StringJoiner(delimiter, prefix, suffix),
                 StringJoiner::add, StringJoiner::merge,
                 StringJoiner::toString, CH_NOID);
     }

使用的选择: 1. 简单的拼接用 '+' 或者 concat 都可以 2. for 循环的相加用 StringBuilder 或者 StringBuffer(主要是考虑线程安全),严格不用 '+',性能太差 (From Ali Java Manual) 3. 通过一个集合(如: List)进行字符串的拼接,可以考虑使用 StringJoiner 或 StringUtils.join() 4. 如果对一组数据进行拼接或有前缀后缀分隔符的要求,可以考虑转换为Stream,并使用 StringJoiner 处理

PreviousJAVANextMaps

Last updated 5 years ago

Was this helpful?

Reference 1. 2.

Hollis | Java 8中字符串拼接新姿势:StringJoiner
Hollis | 为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接