目录
一、String,StringBuffer,StringBuilder是什么?
二、String,StringBuffer,StringBuilder的使用
三、String,StringBuffer,StringBuilder的相同点和不同点
前言
在本周的Java学习中,学习了Java中的常用类,其中包括有引用类型String,以及String Buffer,StringBulider类,这篇博客主要介绍这三者的共同点和区别。
一、String,StringBuffer,StringBuilder是什么?
String、StringBuffer和StringBuilder都是Java中用来处理字符串的类。
1.String
String是Java中最常用的字符串类。它是不可变的,一旦创建就不能修改。每次对String进行修改操作,都会创建一个新的对象。String类提供了许多方法来操作字符串,如连接、截取、替换等。String类的不可变性使其在多线程环境下是线程安全的。
示例代码:
String str = "Hello";
str = str + " World";
System.out.println(str); // 输出:Hello World
2.StringBuffer
StringBuffer也是用来处理字符串的类,它是可变的。即可以修改已有对象的值,而不会创建新的对象。StringBuffer类提供了许多方法来修改、连接、插入和删除字符串的内容。它是线程安全的,适用于多线程环境。
StringBuffer stringBuffer = new StringBuffer("Hello");
stringBuffer.append(" World");
System.out.println(stringBuffer.toString()); // 输出:Hello World
3.StringBuilder
StringBuilder与StringBuffer类似,也是可变的字符串类,可以修改已有对象的值,而不会创建新的对象。StringBuilder类也提供了许多方法来修改、连接、插入和删除字符串的内容。然而,它不保证线程安全,适用于单线程环境。由于非线程安全的特性,StringBuilder具有更好的性能。
StringBuilder stringBuilder = new StringBuilder("Hello");
stringBuilder.append(" World");
System.out.println(stringBuilder.toString()); // 输出:Hello World
二、String,StringBuffer,StringBuilder的使用
1.String
1.1常用的方法
- length():返回字符串的长度。
- charAt(index):返回字符串中指定位置的字符。
- substring(beginIndex, endIndex):获取字符串的子串,从beginIndex开始(包含),到endIndex结束(不包含)。
- concat(str):将指定的字符串连接到原字符串的末尾,并返回一个新的字符串。
- indexOf(str):返回指定子串在字符串中第一次出现的位置。
- contains(str):判断字符串是否包含指定的子串,返回布尔值。
- replace(oldStr, newStr):将字符串中的某个字符或子串替换为指定的新字符或新字符串。
- split(separator):将字符串按照分隔符(separator)分割成多个子串,返回字符串数组。
- toLowerCase():将字符串中的字符全部转换为小写。
- toUpperCase():将字符串中的字符全部转换为大写。
上述方法的示例代码:
String str = "Hello World";
// length()
int length = str.length();
System.out.println("Length: " + length);
// charAt(index)
char ch = str.charAt(6);
System.out.println("Character at index 6: " + ch);
// substring(beginIndex, endIndex)
String subStr = str.substring(6, 11);
System.out.println("Substring: " + subStr);
// concat(str)
String newStr = str.concat("!");
System.out.println("Concatenated String: " + newStr);
// indexOf(str)
int index = str.indexOf("World");
System.out.println("Index of 'World': " + index);
// contains(str)
boolean contains = str.contains("Hello");
System.out.println("Contains 'Hello': " + contains);
// replace(oldStr, newStr)
String replacedStr = str.replace("World", "Universe");
System.out.println("Replaced String: " + replacedStr);
// split(separator)
String[] splitStr = str.split(" ");
System.out.println("Split String: ");
for (String s : splitStr) {
System.out.println(s);
}
// toLowerCase()
String lowerCaseStr = str.toLowerCase();
System.out.println("Lowercase String: " + lowerCaseStr);
// toUpperCase()
String upperCaseStr = str.toUpperCase();
System.out.println("Uppercase String: " + upperCaseStr);
1.2使用场景
- String:适用于不需频繁修改字符串内容的情况,如字符串常量、少量操作字符串的场景。
2.StringBuffer
2.1常用方法
- append(str):将指定的字符串追加到当前StringBuffer对象的末尾。
- insert(offset, str):在指定的位置插入一个字符串到当前StringBuffer对象中。
- delete(start, end):删除指定范围内的字符,包括开始位置的字符而不包括结束位置的字符。
- replace(start, end, str):替换指定范围内的字符串为新的字符串。
- reverse():将StringBuffer对象中的字符序列进行反转操作。
- substring(start):获取从指定位置开始到字符串末尾的子串。
- substring(start, end):获取指定范围的子串,包括开始位置的字符而不包括结束位置的字符。
- length():返回字符串缓冲区中的字符数。
- capacity():返回字符串缓冲区的当前容量。
示例代码:
StringBuffer stringBuffer = new StringBuffer("Hello World");
// append(str)
stringBuffer.append("!");
System.out.println("Appended String: " + stringBuffer);
// insert(offset, str)
stringBuffer.insert(5, "Awesome ");
System.out.println("Inserted String: " + stringBuffer);
// delete(start, end)
stringBuffer.delete(5, 13);
System.out.println("Deleted String: " + stringBuffer);
// replace(start, end, str)
stringBuffer.replace(0, 5, "Hi");
System.out.println("Replaced String: " + stringBuffer);
// reverse()
stringBuffer.reverse();
System.out.println("Reversed String: " + stringBuffer);
// substring(start)
String subString = stringBuffer.substring(6);
System.out.println("Substring: " + subString);
// substring(start, end)
String subString2 = stringBuffer.substring(0, 2);
System.out.println("Substring: " + subString2);
// length()
int length = stringBuffer.length();
System.out.println("Length: " + length);
// capacity()
int capacity = stringBuffer.capacity();
System.out.println("Capacity: " + capacity);
2.2使用场景
- StringBuffer:适用于多线程环境下需要频繁修改字符串内容的场景。
3.StringBuilder
3.1常用方法
StringBuilder类的方法与StringBuffer类的方法基本相同,不同之处在于StringBuilder类不保证线程安全,所以在单线程环境下性能更好。
示例代码:
StringBuilder stringBuilder = new StringBuilder("Hello World");
// append(str)
stringBuilder.append("!");
System.out.println("Appended String: " + stringBuilder);
// insert(offset, str)
stringBuilder.insert(5, "Awesome ");
System.out.println("Inserted String: " + stringBuilder);
// delete(start, end)
stringBuilder.delete(5, 13);
System.out.println("Deleted String: " + stringBuilder);
// replace(start, end, str)
stringBuilder.replace(0, 5, "Hi");
System.out.println("Replaced String: " + stringBuilder);
// reverse()
stringBuilder.reverse();
System.out.println("Reversed String: " + stringBuilder);
// substring(start)
String subString = stringBuilder.substring(6);
System.out.println("Substring: " + subString);
// substring(start, end)
String subString2 = stringBuilder.substring(0, 2);
System.out.println("Substring: " + subString2);
// length()
int length = stringBuilder.length();
System.out.println("Length: " + length);
// capacity()
int capacity = stringBuilder.capacity();
System.out.println("Capacity: " + capacity);
3.2使用场景
- StringBuilder:适用于单线程环境下需要频繁修改字符串内容的场景,性能优于StringBuffer。
三、String,StringBuffer,StringBuilder的相同点和不同点
1.相同点:
- 它们都是用来存储和操作字符串的,属于不可变对象(Immutable Objects)。这意味着每次对字符串进行修改时,都会创建一个新的对象,原始对象不会被改变。
- 它们都继承自抽象类AbstractStringBuilder。
- 它们都提供了许多方法来操作字符串,如追加、删除、替换、查找等。
2.不同点:
2.1可变性:
- String:是不可变类,一旦创建就不能修改。每次对String进行修改操作,都会创建一个新的对象。
- StringBuffer:是可变类,可以修改已有对象的值,而不会创建新的对象。线程安全的,适用于多线程环境。
- StringBuilder:是可变类,类似于StringBuffer,但是不保证线程安全。在单线程环境下,StringBuilder的性能比StringBuffer更好。
2.2线程安全性:
- String:是不可变类,所以是线程安全的。
- StringBuffer:是线程安全的,通过使用同步方法和同步代码块来保证线程安全性。
- StringBuilder:是非线程安全的,不提供同步支持。
2.3性能:
- String:由于不可变性,每次操作都会创建新的对象,所以在大量修改字符串的场景下,可能会产生大量的对象,影响性能。
- StringBuffer:由于是线程安全的,对方法进行了同步,所以在线程安全的情况下,性能相对较差。
- StringBuilder:由于不保证线程安全,不需要进行同步,所以在线程安全无关的情况下,性能最好。
总结
- 如果需要频繁修改字符串内容,并且在多线程环境下,应使用StringBuffer。
- 如果需要频繁修改字符串内容,并且在单线程环境下,应使用StringBuilder。
- 如果字符串内容不需要修改,则使用String即可。