StringBuilder
- StringBuilder代表可变字符串对象,相当于是一个容器,它里面装的字符串是可以改变的,就是用来操作字符串的。
- 好处:StringBuilder比String更适合做字符串的修改操作,效率会更高,代码也会更简洁。
构造器 | 说明 |
public StringBuilder() | 创建一个空白的可变的字符串对象,不包含任何内容 |
public StringBuilder(String str) | 创建一个指定字符串内容的可变字符串对象 |
以上都可以在API文档中查找到,列出的方法是比较常用的。
具体用法:
构造器
public class Test { public static void main(String[] args) { StringBuilder s = new StringBuilder(); //空白字符 StringBuilder str = new StringBuilder("User"); } }
拼接内容
public class Test { public static void main(String[] args) { StringBuilder s = new StringBuilder(); //空白字符 StringBuilder str = new StringBuilder("User"); //1.拼接内容 str.append(12); str.append("ok"); str.append(true); System.out.println(str); } }
运行结果:
append是支持链式编程的,也就是:
public class Test { public static void main(String[] args) { StringBuilder s = new StringBuilder(); //空白字符 StringBuilder str = new StringBuilder("User"); //链式编程 s.append("汪汪").append("of").append("road"); System.out.println(s); } }
运行结果:
反转操作
public class Test { public static void main(String[] args) { StringBuilder s = new StringBuilder(); //空白字符 StringBuilder str = new StringBuilder("User"); //链式编程 s.append("汪汪").append("of").append("road"); System.out.println(s); System.out.println(); //2.反转操作 s.reverse(); System.out.println(s); } }
运行结果:
其他操作
public class Test { public static void main(String[] args) { StringBuilder s = new StringBuilder(); //空白字符 StringBuilder str = new StringBuilder("User"); //链式编程 s.append("汪汪").append("of").append("road"); System.out.println(s); //3.返回字符串长度 System.out.println(s.length()); //4.把StringBuilder对象又转换成String类型 String rs = s.toString(); System.out.println(rs); } }
运行结果:
为什么操作字符串建议使用StringBuilder,而不是用原来学过的String呢?
- 对于字符串相关的操作,如频繁的拼接、修改等,建议用StringBuidler,效率更高!
- 注意:如果操作字符串较少,或者不需要操作,以及定义字符串变量,还是建议用String。
也就是像这种频繁的修改和拼接的操作,用String效率非常低:
public class Test { public static void main(String[] args) { String s = ""; for (int i = 0; i < 1000000; i++) { s = s + "abc"; } System.out.println(s); } }
(运行时间仅作为参考)
运行时间:
用StringBuilder之后:
public class Test { public static void main(String[] args) { StringBuilder s = new StringBuilder(); for (int i = 0; i < 1000000; i++) { s.append("abc"); } System.out.println(s); } }
运行时间:
接下来学习StringBuffer,
StringBuffer
案例展示
StringBuffer与StringBuilder
- StringBuffer的用法与StringBuilder是一模一样的
- 但StringBuilder是线程不安全的,StringBuffer是线程安全的。(线程安全是Java后面的内容)
用一个需求来展示一下StringBuffer的具体用法:
需求:
设计一个方法,用于返回任意整型数组的内容,要求返回的数组内容格式如:[ 11,22,33 ]
public class Test { public static void main(String[] args) { System.out.println(getArrayData(new int[]{11, 22, 33})); } public static String getArrayData(int[] arr){ //第一步先要判断arr是否为null if(arr == null){ return null; } //开始按需求格式输出 StringBuffer s = new StringBuffer(); s.append("["); for (int i = 0; i < arr.length; i++) { if ((i == arr.length - 1)) { s.append(arr[i]); } else { s.append(arr[i]).append(", "); } } s.append("]"); return s.toString(); } }
运行结果:
我们发现,用String实现频繁的拼接效率极低,虽然用StringBuffer来实现效率提高了但是仍旧不够方便,对于一些格式化的输出,还是需要多次判断,不够方便。
StringJoiner就可以解决这个问题:
StringJoiner
- JDK8开始才有的,跟StringBuilder一样,也是用来操作字符串的,也可以看成是一个容器,创建之后里面的内容是可变的。
- 好处:不仅能提高字符串的操作效率,并且在有些场景下使用它操作字符串,代码会更简洁。
构造器及常用方法
案例展示
我们用StringJoiner去实现上一个案例,
需求:
设计一个方法,用于返回任意整型数组的内容,要求返回的数组内容格式如:[ 11,22,33 ]
public class Test { public static void main(String[] args) { System.out.println(getArrayData(new int[]{11, 22, 33})); } public static String getArrayData(int[] arr){ //第一步先要判断arr是否为null if(arr == null){ return null; } //开始按需求格式输出 StringJoiner s = new StringJoiner(",","[","]"); for (int i = 0; i < arr.length; i++) { String rs = Integer.toString(arr[i]); //将基本类型的数据转换成字符串类型 s.add(rs); //添加该字符串数据并返回对象 //或者使用自动类型转换 //s.add(arr[i] + ""); } return s.toString(); } }
运行结果是一样的:
END