Java精粹:String与StringBuffer的深度解析

需积分: 10 1 下载量 45 浏览量 更新于2024-10-09 1 收藏 1.22MB DOC 举报
"Java精华,包括Java SE的学习重点,特别是关于String类和StringBuffer类的深入理解,以及如何逐行读取键盘输入的程序示例。" 在Java编程语言中,掌握核心API是非常重要的,尤其是那些位于基础包`java.lang`中的类。`String`类和`StringBuffer`类是Java中处理文本数据的两个关键工具,它们在日常开发中被广泛使用。 `String`类代表不可变的字符串,一旦创建,其内容就不能修改。这意味着每次尝试修改`String`对象时,实际上都会创建一个新的`String`对象。例如,`String x = "a" + 4 + "c"` 在编译时会被优化为使用`StringBuffer`或`StringBuilder`来拼接字符串,以提高性能。这是因为字符串连接操作在循环或其他大量拼接情况下会更高效。 ```java String x = new StringBuffer().append("a").append(4).append("c").toString(); ``` 上述代码展示了如何使用`StringBuffer`进行字符串的动态构建,避免了创建多个中间`String`对象。 相反,`StringBuffer`(在多线程环境中)或`StringBuilder`(在单线程环境中)是可变的,允许在现有字符串基础上添加、插入或删除字符,而不会生成新的对象。它们提供了许多方法,如`append()`、`insert()`和`delete()`,用于操作字符串内容。 字符串常量在Java中是特殊的,它们存储在常量池中。因此,两个引用相同文字的`String`变量,如`String s1 = "hello"; String s2 = "hello";`,实际上会指向同一个对象,所以`s1 == s2`会返回`true`。但当使用`new`关键字创建`String`对象时,即使内容相同,也会创建两个不同的对象,因此`s1 != s2`。 在处理用户输入时,经常需要逐行读取。以下是一个简单的Java程序,演示如何使用`System.in.read()`逐行读取键盘输入,直到遇到特定的结束字符串(这里为"bye"): ```java public class ReadLine { public static void main(String[] args) { String strInfo = null; int pos = 0; byte[] buf = new byte[1024]; // 字节数组,用于存放字符 int ch = 0; // 读入的字符 System.out.println("Please input a string:"); while (true) { try { ch = System.in.read(); // 读取一个字节 } catch (Exception e) { } switch (ch) { case '\r': // 回车,不做处理 break; case '\n': // 换行,将数组内容放入字符串 strInfo = new String(buf, 0, pos); if (strInfo.equals("bye")) { // 如果字符串内容为"bye",则退出程序 return; } else { // 不是"bye",输出并清空pos,准备下一次读取 // 输出处理 pos = 0; } } } } } ``` 这段代码展示了如何处理不同操作系统下的换行符(`\r\n`在Windows,`\n`在Unix),并且如何通过`System.in.read()`读取字符,直到找到特定的终止条件。注意,这个示例仅适用于简单的输入处理,实际应用中可能需要考虑异常处理、错误恢复和更复杂的输入解析。