内容提要
本文介绍Java字符串基础:字符与整数可通过ASCII码互转,字符字面量用单引号,字符串用双引号。String不可修改,每次拼接都会新建对象,常用方法包括length、split、indexOf、equals、substring、toCharArray等。输入使用Scanner的next和nextLine,输出可用println或printf。频繁修改字符串应使用StringBuilder或StringBuffer,前者更快,后者线程安全。
延伸解读
字符与整数的转换细节
文章指出字符与整数可通过ASCII码互转,但需注意负整数目前没有对应字符。常用字符范围如'A'-'Z'对应65-90,'a'-'z'对应97-122,'0'-'9'对应48-57。字符参与算术运算时会被当作整数处理,例如'B'-'A'得到1。这些细节有助于理解字符在Java中的底层表示。
String不可变性的影响
String对象一旦创建就不能修改,每次拼接或修改都会生成新对象。例如执行a += "World"会构造一个新字符串。因此,在需要频繁修改字符串的场景下,直接使用String会导致大量临时对象,影响性能。文章建议改用StringBuilder或StringBuffer。
StringBuilder与StringBuffer的选择
两者都用于可变字符串,但StringBuffer线程安全,速度较慢;StringBuilder非线程安全,速度更快。在单线程环境下,通常优先选择StringBuilder以获得更好的性能。文章还提到StringBuilder支持append、setCharAt、reverse等常用操作,方便进行字符串修改。
输入输出中的常见陷阱
使用Scanner时,next()读取到空白符停止,而nextLine()读取整行,以换行符结束。如果混合使用next()和nextLine(),可能会因残留的换行符导致nextLine()读到空行。输出时,println直接打印,printf支持格式化输出,如%s表示字符串。理解这些差异有助于正确读取和输出数据。
Q&A
Java中字符和整数如何通过ASCII码互相转换?
在Java中,字符和整数可以通过强制类型转换互相转换。例如,将字符转换为整数:`(int)'a'` 得到97;将整数转换为字符:`(char)66` 得到'B'。常用字符的ASCII值范围:'A'-'Z'是65-90,'a'-'z'是97-122,'0'-'9'是48-57。
Java中String为什么是不可变的?修改字符串时会发生什么?
Java中的String是不可变的,一旦创建就不能修改。每次对String进行修改(如拼接`+`)都会创建一个新的String对象,而不是修改原对象。例如:`String a = "Hello "; a += "World";` 会构造一个新的字符串。
Java中String有哪些常用的方法?
String常用方法包括:`length()`返回长度;`split(String regex)`分割字符串;`indexOf`和`lastIndexOf`查找字符或子串;`equals()`比较内容;`compareTo()`按字典序比较;`startsWith()`和`endsWith()`检查前缀后缀;`trim()`去除首尾空白;`toLowerCase()`和`toUpperCase()`转换大小写;`replace()`替换;`substring(int beginIndex, int endIndex)`截取子串;`toCharArray()`转换为字符数组。
Java中Scanner的next()和nextLine()有什么区别?
`next()`读取一个字符串,遇到空白符(如空格或换行)停止;`nextLine()`读取整行,空格不会停止输入,但换行会停止。例如:`sc.next()`读取到空格前的部分,`sc.nextLine()`读取整行包括空格。
Java中StringBuilder和StringBuffer有什么区别?如何选择?
StringBuilder和StringBuffer都用于频繁修改字符串。StringBuffer是线程安全的,但速度较慢;StringBuilder不是线程安全的,但速度更快。因此,在单线程环境下推荐使用StringBuilder,多线程环境下使用StringBuffer。
Java中如何遍历字符串并修改其中的字符?
由于String不可修改,可以使用StringBuilder或StringBuffer来遍历并修改字符。例如:`StringBuilder sb = new StringBuilder("Hello"); for (int i = 0; i < sb.length(); i++) { sb.setCharAt(i, (char)(sb.charAt(i) + 1)); }` 这样可以读取和写入字符。