String在定义后, String是不可变的,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
String对象内容的改变实际上是通过内存地址“断开-连接”变化来完成的,而原字符串中的内容并没有任何的改变。String str = "Hello";和str = str + " World";实质上是开辟了三个内存空间,str只是由原来指向"hello"变为指向“hello world”而已,而其原来的指向内容,是没有改变的。 因此,在以后的开发中,若要经常修改字符串的内容,请尽量少用String,因为字符串的指向“断开-连接”会大大降低性能;对于要经常修改内容的情况,建议使用:StringBuilder、StringBuffer.
案例
public class test {
public static void main(String[] args) {
String s = "";
for (int i = 0;i<10000;i++){
s += "abc";
}
System.out.println(s);
}
}
public class test {
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0;i<10000;i++){
stringBuilder.append("abc");
}
System.out.println(stringBuilder);
}
}
public class test {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < 10000; i++) {
stringBuffer.append("abc");
}
System.out.println(stringBuffer);
}
}
StringBuilder和StringBuffer和String的执行速度:StringBuilder > StringBuffer > String
区别:
StringBuilder和StringBuffer的功能和方法是一样的,但是StringBuffer是线程安全,因为StringBuffer是用synchronized关键字修饰的。
在单线程,程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全而StringBuffer则每次都需要判断锁,效率相对更低。
作用:
提高字符串的操作效率。
StringBuilder和StringBuffer的构造方法:
public StringBuilder(); 创建一个空白可变字符串对象,不含有任何内容。
public StringBuilder(String str); 根据字符串的内容,来创建可变字符串对象。
public StringBuffer(); 创建一个空白可变字符串对象,不含有任何内容。
public StringBuffer(String str); 根据字符串的内容,来创建可变字符串对象。
StringBuilder和StringBuffer常用方法:
public StringBuilder append(任意类型);添加数据,并返回对象本身
public StringBuilder reverse(); 反转容器中的内容
public StringBuilder length(); 返回长度(字符串出现的个数)
public String toString(); 通过toString()就可以实现把StringBuilder转换为String
public StringBuffer append(任意类型);添加数据,并返回对象本身
public StringBuffer reverse(); 反转容器中的内容
public StringBuffer length(); 返回长度(字符串出现的个数)
public String toString(); 通过toString()就可以实现把StringBuffer转换为String
添加
//添加数据
stringBuffer.append("java程序员,是个很好的工作");
System.out.println(stringBuffer);
//给指定的位置添加数据
stringBuffer.insert(11,"不");
System.out.println(stringBuffer);
//添加数据
stringBuilder.append("你好").append("不好").append("我是").append("付宇浩");
System.out.println(stringBuilder);
我们可以看到,代码工作量很大,这里可以运用到链式编程
反转
//反转
stringBuilder.reverse();
System.out.println(stringBuilder);
//反转
stringBuilder.reverse();
System.out.println(stringBuilder);
获取长度
//获取长度
System.out.println(stringBuilder.length());
//获取长度
System.out.println(stringBuffer.length());
删除
//删除片段数据
stringBuffer.delete(0,7);//删除的片段,包含头和尾
System.out.println(stringBuffer);
//删除指定数据
stringBuffer.deleteCharAt(4);
System.out.println(stringBuffer);
//删除片段数据
stringBuilder.delete(0,7);//删除的片段,包含头和尾
System.out.println(stringBuilder);
//删除指定数据
stringBuilder.deleteCharAt(4);
System.out.println(stringBuilder);
修改
//修改元素数据,根据位置范围,添加字符串
stringBuffer.replace(2,4,"真假无所谓");
System.out.println(stringBuffer);
//修改指定位置的数据,根据位置,替换字符
stringBuffer.setCharAt(3,'s');
System.out.println(stringBuffer);
//修改元素数据,根据位置范围,添加字符串
stringBuilder.replace(2,4,"真假无所谓");
System.out.println(stringBuilder);
//修改指定位置的数据,根据位置,替换字符
stringBuilder.setCharAt(3,'s');
System.out.println(stringBuilder);
将StringBuilder和StringBuffer转换为String
//将stringBuilder转换成string
String str = stringBuilder.toString();
System.out.println(str);
//将stringbuffter转换成string
String str = stringBuffer.toString();
System.out.println(str);