【Java】字符串处理 —— String、StringBuffer 与 StringBuilder
由于String类是final类型的,所以使用String定义的字符串是一个常量,因此它一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,则只能创建新的字符串。为了便于对字符串进行修改,在JDK中提供了一个StringBuffer类(也称字符串缓冲区)来操作字符串。
String类的初始化
表1 String类的常用构造方法
方法声明 | 功能描述 |
String() | 创建一个内容为空的字符串 |
String(String value) | 根据指定的字符串内容创建对象 |
String(char[] value) | 根据指定的字符数组创建对象 |
String类的常见操作
表1 String类的常用方法
方法声明 | 功能描述 |
int indexOf(int ch) | 返回指定字符在此字符串中第一次出现处的索引 |
int lastIndexOf(int ch) | 返回指定字符在此字符串中最后一次出现处的索引 |
int indexOf(String str) | 返回指定子字符串在此字符串中第一次出现处的索引 |
int lastIndexOf(String str) | 返回指定子字符串在此字符串中最后一次出现处的索引 |
char charAt(int index) | 返回字符串中index位置上的字符,其中index的取值范围是:0~(字符串长度-1) |
boolean endsWith(String suffix) | 判断此字符串是否以指定的字符串结尾 |
int length() | 返回此字符串的长度 |
boolean equals(Object anObject) | 将此字符串与指定的字符串比较 |
boolean isEmpty() | 当且仅当字符串长度为0时返回true |
boolean startsWith(String prefix) | 判断此字符串是否以指定的字符串开始 |
boolean contains(CharSequence cs) | 判断此字符串中是否包含指定的字符序列 |
String toLowerCase() | 使用默认语言环境的规则将String中的所有字符都转换为小写 |
String toUpperCase() | 使用默认语言环境的规则将String中的所有字符都转换为大写 |
static String valueOf(int i) | 返回 int 参数的字符串表示形式 |
char[] toCharArray() | 将此字符串转换为一个字符数组 |
String replace(CharSequence oldstr, CharSequence newstr) | 返回一个新的字符串,它是通过用newstr替换此字符串中出现的所有oldstr得到的 |
String[] split(String regex) | 根据参数regex(regex是一个正则表达式,用来限定分隔规则)将字符串分割为若干个子字符串 |
String substring(int beginIndex) | 返回一个新字符串,它包含从指定的beginIndex起始角标处开始,直到此字符串末尾的所有字符 |
String substring(int beginIndex, int endIndex) | 返回一个新字符串,它包含从指定的beginIndex起始角标处开始,直到索引endIndex-1角标处的所有字符 |
String trim() | 返回一个新字符串,它去除了原字符串首尾的空格 |
1.字符串的基本操作
public class Example02 {public static void main(String[] args) {String s = "abcabcbacdba"; // 初始化字符串System.out.println("字符串的长度为:" + s.length());System.out.println("字符串中第一个字符:" + s.charAt(0));System.out.println("字符c第一次出现的位置:" + s.indexOf('c'));System.out.println("字符c最后一次出现的位置:" + s.lastIndexOf('c'));System.out.println("子字符串第一次出现的位置:" + s.indexOf("ab"));System.out.println("子字符串最后一次出现的位置:" + s.lastIndexOf("ab"));}}
2.字符串的转换操作
public class Example03 {public static void main(String[] args) {String str = "java"; char[] charArray = str.toCharArray(); // 字符串转换为字符数组System.out.print("将字符串转为字符数组后的遍历结果:");for (int i = 0; i < charArray.length; i++) {if (i != charArray.length - 1) {// 如果不是数组的最后一个元素,在元素后面加逗号System.out.print(charArray[i] + ",");} else {// 数组的最后一个元素后面不加逗号System.out.println(charArray[i]);}}System.out.println("将int值转换为String类型之后的结果:" + String.valueOf(12));System.out.println("将字符串转换成大写之后的结果:" + str.toUpperCase());}}
3.字符串的替换和去除空格操作
public class Example04 {public static void main(String[] args) {String s = " http :// localhost : 8080 ";// 字符串去除空格操作System.out.println("去除字符串两端空格后的结果:" + s.trim());// 字符串替换操作System.out.println("去除字符串中所有空格后的结果:" + s.replace(" ", ""));}}
4.字符串的判断操作
public class Example05 {public static void main(String[] args) {String s1 = " Starter"; // 声明一个字符串String s2 = "St";System.out.println("判断是否以字符串St开头:" + s1.startsWith("St"));System.out.println("判断是否以字符串er结尾:" + s1.endsWith("er"));System.out.println("判断是否包含字符串ar:" + s1.contains("ar"));System.out.println("判断字符串是否为空:" + s1.isEmpty());System.out.println("判断两个字符串是否相等" + s1.equals(s2));}}
在程序中可以通过“==”和equals()两种方式对字符串进行比较,但这两种方式有显著的区别。equals()方法用于比较两个字符串中的字符值是否相等,“==”方式用于比较两个字符串对象的内存地址是否相同。
5.字符串的截取和分割
public class Example06 {public static void main(String[] args) {String str = "2018-01-24";// 下面是字符串截取操作System.out.println("从第6个字符截取到末尾的结果:" + str.substring(5));System.out.println("从第6个字符截取到第7个字符的结果:" +str.substring(5, 7));// 下面是字符串分割操作System.out.print("分割后的字符串数组中的元素依次为:");// 通过横线连接符“—”将字符串转换为字符串数组String[] strArray = str.split("-");// 循环输出数组中的元素for (int i = 0; i < strArray.length; i++) {if (i != strArray.length - 1) {// 如果不是数组的最后一个元素,在元素后面加顿号System.out.print(strArray[i] + "、");} else {// 数组的最后一个元素后面不加顿号System.out.println(strArray[i]);}}}}
StringBuffer类
StringBuffer类和String类最大的区别在于它的内容和长度都是可以改变的。StringBuffer类似一个字符容器,当在其中添加或删除字符时,所操作的都是这个字符容器,因此并不会产生新的StringBuffer对象。
表1 StringBuffer类常用方法
方法声明 | 功能描述 |
StringBuffer append(char c) | 添加字符到StringBuffer对象中末尾 |
StringBuffer insert(int offset,String str) | 在StringBuffer对象中的offset位置插入字符串str |
StringBuffer deleteCharAt(int index) | 移除StringBuffer对象中指定位置的字符 |
StringBuffer delete(int start,int end) | 删除StringBuffer对象中指定范围的字符或字符串 |
StringBuffer replace(int start,int end,String s) | 将StringBuffer对象中指定范围的字符或字符串用新的字符串s进行替换 |
void setCharAt(int index, char ch) | 修改指定位置index处的字符 |
String toString() | 返回StringBuffer缓冲区中的字符串对象 |
StringBuffer reverse() | 将此StringBuffer对象用其反转形式取代 |
StringBuffer类和String类有很多相似之处,初学者在使用时很容易混淆。接下来针对这两个类进行对比,简单归纳一下两者的不同,具体如下:
①String类定义的字符串是常量,一旦创建后,内容和长度都是无法改变的。StringBuffer表示字符容器,其内容和长度可以随时修改。在操作字符串时,如果该字符串仅用于表示数据类型,则使用String类即可,但是如果需要对字符串中的字符进行增删操作,则使用StringBuffer类。
②String类重写了Object类的equals()方法,而StringBuffer类没有重写Object类的equals()方法。
StringBuilder的使用
除了使用StringBuffer外,JDK 1.5之后提供了一个StringBuilder类同样可以操作字符串。StringBuilder与StringBuffer的功能相似,且两个类中所提供的方法也基本相同。二者所不同的是StringBuffer是线程安全的,而StringBuilder没有实现线程安全功能,所以性能略高。通常情况下,如果创建一个内容可变的字符串对象,应该优先考虑StringBuilder类。
StringBuilder类同样提供了一系列的追加(append)、插入(insert)、替换(replace)和删除(delete)的方法。如果将文件1中的StringBuffer换成StringBuilder,程序同样可以正确执行。