一、三者的区别
[Java中的String,StringBuilder,StringBuffer三者的区别 - 酥风 - 博客园]
- String 类 :不可变字符序列
- StringBuffer 类:可变字符序列 -- 线程安全,做线程同步检查,效率低
- StringBuilder 类:可变字符序列 -- 线程不安全,不做线程同步检查,因此效率较高 (推荐使用)
1、String 类的常用方法:
int length():返回字符串的长度: return value.length
char charAt(int index): 返回某索引处的字符return value[index]
boolean isEmpty():判断是否是空字符串:return value.length == 0
String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写
String toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写
String trim():返回字符串的副本,忽略前导空白和尾部空白
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大
小写
String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”
int compareTo(String anotherString):比较两个字符串的大小
String substring(int beginIndex):返回一个新的字符串,它是此字符串的从
beginIndex开始截取到最后的一个子字符串。
String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字
符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的
子字符串是否以指定前缀开始
boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列
时,返回 true
int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出
现处的索引,从指定的索引开始
int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后
一次出现处的索引,从指定的索引开始反向搜索
注:indexOf和lastIndexOf方法如果未找到都是返回-1
String replace(char oldChar, char newChar):返回一个新的字符串,它是
通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String replace(CharSequence target, CharSequence replacement):使
用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String replaceAll(String regex, String replacement) : 使 用 给 定 的
replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String replaceFirst(String regex, String replacement) : 使 用 给 定 的
replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此
字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
[原文链接][https://blog.csdn.net/bjfu170203101/article/details/109386466]
常用方法可查看 api 文档 -- [JDK 1.8 -API 文档] [Java Platform SE 8]
2、StringBuffer类、StringBuilder类 常用方法列表:
-
重载的
public StringBuilder append(…)方法 --
可以为该StringBuilder
对象添加字符序列,仍然返回自身对象。 -
方法
public StringBuilder delete(int start,int end) --
可以删除从start
开始到end-1
为止的一段字符序列,仍然返回自身对象。 -
方法
public StringBuilder deleteCharAt(int index) --
移除此序列指定位置上的char
,仍然返回自身对象。 -
重载的
public StringBuilder insert(…)方法 --
可以为该StringBuilder 对象在指定位置插入字符序列,仍然返回自身对象。 -
方法
public StringBuilder reverse() --
用于将字符序列逆序,仍然返回自身对象。 -
方法
public String toString() --
返回此序列中数据的字符串表示形式。 -
和 String 类含义类似的方法:
-
public int indexOf(String str) public int indexOf(String str,int fromIndex) public String substring(int start) public String substring(int start,int end) public int length() char charAt(int index)
3、测试 StringBuffer/StringBuilder基本用法 :
public class TestStringBufferAndBuilder{
public static void main(String[ ] args) {
/**StringBuilder*/
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 7; i++) {
sb.append((char) ('a' + i));//追加单个字符
}
System.out.println(sb.toString());//转换成String输出
sb.append(", I can sing my abc!");//追加字符串
System.out.println(sb.toString());
/**StringBuffer,下面的方法同样适用StringBuilder*/
StringBuffer sb2 = new StringBuffer("北京欢迎你");
sb2.insert(0, "爱").insert(0, "我");//插入字符串
System.out.println(sb2);
sb2.delete(0, 2);//删除子字符串
System.out.println(sb2);
sb2.deleteCharAt(0).deleteCharAt(0);//删除某个字符
System.out.println(sb2.charAt(0));//获取某个字符
System.out.println(sb2.reverse());//字符串逆序
}
}
测试结果:
4、String使用的陷阱
String一经初始化后,就不会再改变其内容了。对String字符串的操作实际上是对其副本(原始拷贝)的操作,原来的字符串一点都没有改变。比如:
String s ="a"
; 创建了一个字符串
s = s+"b"
; 实际上原来的a
字符串对象已经丢弃了,现在又产生了另一个字符串s+"b"
(也就是ab
)。 如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的时间和空间性能,甚至会造成服务器的崩溃。
相反,StringBuilder和StringBuffer类是对原字符串本身操作的,可以对字符串进行修改而不产生副本拷贝或者产生少量的副本。因此可以在循环中使用。
package com.menghuan.常用类;
// @date:2022年03月12日0:09
/**
* 效率测试:
* 字符串序列的陷阱 -- 时间和空间效率测试
* String -- 不可变字符串序列,每一个新的字符串都会创建一个对象
* StringBuffer 和 StringBuilder 可变字符串序列 , 只会产生一个对象
*/
public class TestString04 {
public static void main(String[] args) {
//使用String 进行字符串的拼接
String str1 = "";
long num1 = Runtime.getRuntime().freeMemory(); // 获取系统剩余内存空间
long time1 = System.currentTimeMillis(); // 获取系统的当前时间
for (int i = 0; i < 5000; i++) {
str1 = str1 + i; // 相当于产生了5000个对象
}
long num2 = Runtime.getRuntime().freeMemory(); // 获取系统剩余内存空间
long time2 = System.currentTimeMillis(); // 获取系统的当前时间
System.out.println("String占用内存 :"+ (num2 - num1));
System.out.println("String占用时间 :"+ (time2 - time1));
/** 使用StringBuilder 进行字符串的拼接 */
StringBuilder sb1 = new StringBuilder("");
long num3 = Runtime.getRuntime().freeMemory();
long time3 = System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
sb1.append(i); // 末尾添加单个字符
}
long num4 = Runtime.getRuntime().freeMemory();
long time4 = System.currentTimeMillis();
System.out.println("StringBuilder占用内存 :"+ (num4 - num3));
System.out.println("StringBuilder占用时间 :"+ (time4 - time3));
}
}