核心内容摘要
GPT之父Alec Radford新作:从文档级到Token级,重塑大模型数据过滤范式
先明确基础前提StringBuffer和StringBuilder的 API几乎完全一致仅StringBuffer方法加了synchronized因此下面会把二者归为「可变字符串类」统一讲解重点区分与StringAPI 的差异。
核心 API 详解附示例
String 核心 API不可变字符串String的方法均返回新的 String 对象原对象不会被修改以下是高频使用的方法方法签名功能说明示例代码char charAt(int index)获取指定索引的字符索引从 0 开始String str hello; char c str.charAt(
; // c eint length()获取字符串长度str.length(); // 5boolean isEmpty()判断字符串是否为空长度为 0 .isEmpty(); // trueString concat(String str)拼接字符串等价于 “”返回新对象String s str.concat( world); // s hello worldString substring(int begin)截取从 begin 到末尾的子串str.substring(
; // lloString substring(int begin, int end)截取 [begin, end) 区间的子串左闭右开str.substring(1,
; // ellboolean equals(Object obj)比较字符串内容是否相等区分大小写hello.equals(Hello); // falseboolean equalsIgnoreCase(String str)忽略大小写比较内容Hello.equalsIgnoreCase(hello); // trueint indexOf(String str)查找子串首次出现的索引无则返回 -1str.indexOf(l); // 2int lastIndexOf(String str)查找子串最后出现的索引无则返回 -1str.lastIndexOf(l); // 3String replace(char old, char new)替换所有指定字符str.replace(l, x); // hexxoString replaceAll(String regex, String replacement)正则替换a1b2c
replaceAll(\\d, *); // a*b*c*String[] split(String regex)按正则分割字符串为数组a,b,c.split(,); // [a,b,c]String toUpperCase()转大写str.toUpperCase(); // HELLOString toLowerCase()转小写str.toLowerCase(); // helloString trim()去除首尾空白字符JDK11 可用strip()支持全角空白 hello .trim(); // helloboolean startsWith(String prefix)判断是否以指定前缀开头str.startsWith(he); // trueboolean endsWith(String suffix)判断是否以指定后缀结尾str.endsWith(lo); // true
StringBuilder / StringBuffer 核心 API可变字符串二者方法完全一致核心是直接修改原对象返回值为this支持链式调用高频方法如下方法签名功能说明示例代码以 StringBuilder 为例构造方法StringBuilder()空构造初始容量 16 字符StringBuilder sb new StringBuilder();StringBuilder(String str)用指定字符串初始化容量 16 str.length()StringBuilder sb new StringBuilder(hello); // 容量 21StringBuilder(int capacity)指定初始容量避免频繁扩容优化性能StringBuilder sb new StringBuilder(
; // 初始容量 100核心修改方法StringBuilder append(任意类型)拼接任意类型数据int、String、char[] 等最常用sb.append( world).append(
; // hello world123StringBuilder insert(int offset, 任意类型)在指定索引插入数据sb.insert(5, ,); // hello, world123StringBuilder delete(int start, int end)删除 [start, end) 区间的字符sb.delete(5,
; // hello world123StringBuilder deleteCharAt(int index)删除指定索引的字符sb.deleteCharAt(
; // hello world23StringBuilder replace(int start, int end, String str)替换指定区间字符sb.replace(6,11, java); // hello java123StringBuilder reverse()反转字符串sb.reverse(); // 321avaj olleh辅助方法int length()获取当前字符长度实际字符数sb.length(); // 11int capacity()获取当前数组容量底层 char[] 长度sb.capacity(); // 21初始 21未扩容时void ensureCapacity(int min)手动扩容确保容量 ≥ minsb.ensureCapacity(
; // 容量变为 50void setLength(int newLength)设置字符串长度不足补 ‘\0’超出截断sb.setLength(
; // hellochar charAt(int index)获取指定索引字符同 Stringsb.charAt(
; // evoid setCharAt(int index, char c)修改指定索引的字符sb.setCharAt(1, x); // hxlloString toString()转为不可变的 String 对象最终输出/存储时用String result sb.toString(); // hxllo
关键 API 对比易混点操作场景String 方法可变字符串方法核心差异拼接字符串concat()/ “”append()String 造新对象可变类改原对象替换字符replace()返回新对象replace()改原对象前者无区间替换后者支持区间截取字符串substring()返回新对象无直接截取方法可先 delete 再 toStringString 更便捷反转字符串需手动实现如循环reverse()可变类原生支持效率高
API 实战示例综合场景场景 1单线程拼接海量字符串用 StringBuilderpublicclassStringBuilderDemo{publicstaticvoidmain(String[]args){// 初始化时指定容量避免扩容StringBuildersbnewStringBuilder(
;// 循环拼接 10 万次效率远高于 Stringfor(inti0;i100000;i){sb.append(用户ID).append(i).append(状态正常\n);}// 插入表头sb.insert(0, 用户列表 \n);// 替换指定内容sb.replace(0,11, 最新用户列表 );// 转为 String 输出Stringresultsb.toString();System.out.println(result.substring(0,
);// 打印前 100 个字符}}场景 2多线程拼接用 StringBufferpublicclassStringBufferDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{StringBuffersbfnewStringBuffer();// 10 个线程每个拼接 1000 次for(inti0;i10;i){newThread(()-{for(intj0;j1000;j){sbf.append(数据).append(j).append(;);}}).start();}Thread.sleep(
;// 等待线程执行完毕System.out.println(最终拼接长度sbf.length());// 稳定输出线程安全System.out.println(最后 100 字符sbf.substring(sbf.length()-
);}}场景 3String 高频 API 组合使用publicclassStringApiDemo{publicstaticvoidmain(String[]args){Stringstr 张三,25,男;李四,30,女;王五,28,男 ;//
去除首尾空白strstr.trim();//
按分号分割为用户字符串数组String[]usersstr.split(;);//
遍历处理每个用户for(Stringuser:users){//
按逗号分割用户信息String[]infouser.split(,);Stringnameinfo[0];intageInteger.parseInt(info[1]);Stringgenderinfo[2];//
拼接并输出格式化信息System.out.printf(姓名%s年龄%d性别%s%n,name,age,gender);}//
查找是否包含李四booleanhasListr.contains(李
;System.out.println(是否包含李四hasLi);// true//
替换所有性别为男的为男性StringnewStrstr.replaceAll(男,男性);System.out.println(替换后newStr);// 张三,25,男性;李四,30,女;王五,28,男性}}
总结String API核心是「查询/只读」所有修改方法均返回新对象适合字符串常量、少量拼接、内容查询场景StringBuilder/StringBuffer API核心是「修改/写入」append()/insert()/reverse()等方法直接修改原对象支持链式调用StringBuilder单线程优先StringBuffer多线程使用性能优化使用可变字符串时提前指定初始容量new StringBuilder(容量)可避免频繁扩容大幅提升效率。
记住核心用法查用 String改单线程用 StringBuilder改多线程用 StringBuffer。