3.6.5 构建字符串
使用 String 用循环语句不断对字符串进行拼接时,因为 String 是不可变类,每次拼接,都产生了新的对象,效率比较低;因此 Java 提供了 StringBuilder 和 StringBuffer 来解决这个问题。
public class Main {public static void main(String[] args){
final int SIZE = 1000;
System.out.println("String拼接效率测试:");
long t1 = System.nanoTime();
String s = "";
for(int i = 0; i < SIZE; i++){
s = s+i;
}
System.out.println(s);
long t2 = System.nanoTime();
System.out.println("String拼接耗时:");
System.out.println((t2-t1)+"ns");
System.out.println("StringBuilder拼接效率测试:");
long t3 = System.nanoTime();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < SIZE; i++){
sb.append(i);
}
System.out.println(sb.toString());
long t4 = System.nanoTime();
System.out.println("StringBuilder拼接耗时:");
System.out.println((t4-t3)+"ns");
System.out.println("StringBuffer拼接效率测试:");
long t5 = System.nanoTime();
StringBuffer sf = new StringBuffer();
for(int i = 0; i < SIZE; i++){
sf.append(i);
}
System.out.println(sf.toString());
long t6 = System.nanoTime();
System.out.println("StringBuffer拼接耗时:");
System.out.println((t6-t5)+"ns");
}
}
执行结果如图,String 的效率明显低于 StringBuffer ,而 StringBuffer 在单线程情况下,效率低于 StringBuilder。
StringBuilder
名称
含义
个人评价
int length()
字符长度(注意是字符长度,不是代码点数目)
很常用
StringBuilder append(String str)
追加字符串
最常用
StringBuilder delete(int startIndex,int endIndex)
删除范围内的字符串
一般,比较常用的是删除后缀deleteCharAt()
StringBuilder deleteCharAt(int index)
删除指定字符
常用,进行字符串拼接时,经常要删除最后一个字符,比如"a,b,c"这种格式,往往拼接完会多一个逗号"a,b,c,d",最后一个逗号需要删掉
String toString()
转成字符串
最常用,否则用这个类没有意义
StringBuilder reverse()
字符串反转,比如"abc",经过反转后变"cba"
一般,需要的话会很方便
3.7 输入与输出
3.7.1 读取输入
Scanner 用法
1. import java.util.*;
2. 创建 Scanner 对象
3. 调用 Scanner 合适的输入类型,获取输入内容
import java.util.*;public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);//构造Scanner对象
System.out.println("What's your name?");
String name = sc.nextLine();//读取控制台的一行输入
System.out.println("How old are you?");
int age = sc.nextInt();//读取一个数字
System.out.println("Your are "+name+","+age+" years old.");
}
}
BufferedReader 用法(补充)
1. import java.io.*;
2. 抛出IOException
3. 创建 BufferedReader 对象
4. 调用 readLine() 获取整行输入内容
import java.io.*;public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputContent = br.readLine();
System.out.println(inputContent);
}
}
Scanner
名称
含义
个人评价
String nextLine()
读取一行输入
最常用,通用
String next()
读取下一个单词,以空格作为分隔
如果前面有next()输入,不建议连续使用,会造成输入混乱
int nextInt()
读取下一个输入的整数
一般,用了不能先做类型检查,输入错误会直接抛出异常
3.8 补充知识
个人补充
问:String 和 StringBuilder 和 StringBuffer 的区别是什么?
答:String 是 不可变类,String 中产生的字符串,各个类之间可以共享;String 本身进行字符串拼接时,会产生新的 StringBuilder 对象和 String 对象,效率比较低。显式的使用StringBuilder/StringBuffer 可以减少字符串拼接过程产生的对象,因此效率较高。其中 StringBuilder 是线程不安全,StringBuffer 是线程安全的。不需要线程安全处理的情况下,使用 StringBuilder 效率要高于 StringBuffer 。
作者补充
问:如何从控制台读取密码,而不直接显示在控制台?
答:使用Console类。特别说明,使用此类,不能使用 IDE 工具。
如果使用 IDE 则失败:
进入包的根目录,使用控制台执行得到正确效果。
public class Main {public static void main(String[] args){
Console console = System.console();
String username = console.readLine("User name:");
String password = new String(console.readPassword("Password:"));
System.out.println("User name is "+username+".");
System.out.println("Password is "+password+".");
}
}
系列内容:
《Java 核心技术 卷1》 笔记:第一章 Java程序设计概述
《Java 核心技术 卷1》 笔记:第二章 Java程序设计环境
《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(1)
《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(2)
《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(3)
喜欢的话,点个赞吧~!平时做题,以及笔记内容将更新到公众号。
关注公众号,互相学习:钰娘娘知识汇总