深入理解JAVA:String与StringBuffer的较量

需积分: 16 0 下载量 163 浏览量 更新于2024-07-24 收藏 1.27MB DOC 举报
"JAVA精华讲解,涵盖了深入JAVAAPI,特别是对Lang包中的String类和StringBuffer类进行了详尽的解析,同时提供了一个实用的逐行读取键盘输入的示例代码。" 在Java编程语言中,理解和掌握String类与StringBuffer类是非常重要的。它们都是用来表示和操作字符串,但在不同场景下各有优势。 String类是Java中最常用的类之一,位于java.lang包中,因此在使用时无需显式导入。String类的特点是它的内容一旦创建就不可更改。这意味着,每次对String对象进行修改(如拼接、替换字符等),都会创建一个新的String对象。例如,`String x = "a" + 4 + "c"` 在编译时会被优化为 `String x = new StringBuffer().append("a").append(4).append("c").toString();` 这样的形式,以避免不必要的对象创建。值得注意的是,由于字符串常量池的存在,当创建两个引用相同的字符串字面量(如`Strings1 = "hello"; String s2 = "hello";`),s1和s2实际上是相等的(`s1 == s2`),因为它们都指向了池中的同一对象。然而,如果通过`new`关键字创建不同的实例,即使内容相同,两个对象也是不相等的(`s1 != s2`)。 相比之下,StringBuffer类是为了支持字符串的可变性而设计的。它允许在现有字符串基础上进行添加、删除或替换字符的操作,而不会每次都创建新的对象。这在需要频繁修改字符串的场合非常有用,可以显著提高性能。例如,`StringBuffer sb = new StringBuffer("hello"); sb.append("world");` 会在原有的"hello"后面添加"world",而不会创建新的对象。 在输入/输出方面,Java提供了从标准输入(键盘)逐行读取数据的能力。以下是一个简单的示例代码,它会读取用户输入,直到遇到"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 { // 否则,输出并清零pos,准备下次存储 // 输出代码... pos = 0; } } // 其他处理逻辑... } } } ``` 这段代码利用`System.in.read()`方法逐字节读取输入,遇到回车(`\r`)或换行(`\n`)时处理数据。当读到"bye"时,程序结束。这种逐行读取的方式在处理用户交互或命令行输入时非常常见。 理解并熟练运用String和StringBuffer以及如何处理键盘输入是Java开发的基本技能。它们在日常编码中扮演着重要角色,尤其是在处理文本数据和用户交互时。