String类是不可以被修改的,但是在程序设计中,很多情况需要字符串不断发生改变,此时如果还继续使用 String类,就会存在内存消耗大和效率低的问题,为此,Java还有另一种字符串的标准类StringBuffer类,StringBuffer类的对象是可以直接被修改的
String : 用于一般情况下;
StringBuffer : 用于多线程情况下: synchronized
StringBuilder :用于单线程
String和StringBuilder的使用方法:循环时用StringBuilder,因为不管循环多少次,都只会有一个StringBuilder对象,而用String是没循环一次就会产生一个新的StringBuilder对象。
//每次在循环内部都会产生一个StringBuilder的一个对象
public static String fun1(String[] str){
String str1 = "";
for(int i = 0;i < str.length;i++){
//str1 = str1+str[i];
StringBuilder strbuffer = new StringBuilder(str1);
strbuffer.append(str[i]);
str1 = strbuffer.toString();
/**
* public String toString() {
return new String(value, 0, count);
}
*/
}
return str1;
}
public static String fun1(String[] str){
//只生成一个StringBuilder对象
StringBuilder str2 = new StringBuilder();
for(int i = 0;i < str.length;i++){
str2.append(str[i]);
}
return str2.toString();
}
StringBuffer类的创建:
格式1:
StringBuffer 对象名 = null;
对象名 = new StringBuffer("字符串内容");
格式2:
StringBuffer 对象名 = new StringBuffer("字符串内容");
以上两种格式是等效的,创建StringBuffer对象不能像创建String对象那样直接赋值,这两种格式都包含了类名StringBuffer、new关键字及对象名和字符串的初始值。
StringBuffer类的常用方法:
1.String.intern();
native C++/c编写的
先去常量池里找是有当前字符串的引用,如果有返回该字符串在常量池当中的引用如果没有,创建一个引用。
public class LianXi {
public static void main(String[] args) {
String str4 = "abcd";
String str5 = new String("ab")+new String("cd");
String str6 = str5.intern();
System.out.println(str4 == str6);
System.out.println(str4 == str5);
}
}
运行结果:
true
false
2.StringBuffer append() 和 StringBuffer insert()方法
追加内容
public class LianXi {
public static void main(String[] args) {
StringBuffer str2 = new StringBuffer("hello");
str2.insert(3, "tulun");//3 下标 加在指定位置
System.out.println(str2);
str2.append("world");//append 新的对象 加在字符串后面
System.out.println(str2);
}
}
运行结果:
heltulunlo
heltulunloworld
3.indexOf()
从头开始搜索指定子字符串的位置,如果子字符串存在就返回子字符串的位置,不存在就返回-1;
public class LianXi {
public static void main(String[] args) {
String pwd = "abccdefg";
String lzq = "cde";
System.out.println(pwd.indexOf(lzq));
String pop = "fer";
System.out.println(pwd.indexOf(pop));
}
}
3
-1
4.substring()
可以根据指定索引点截取字符串
public class LianXi {
public static void main(String[] args) {
String pwd = "java是面向对象的编程语言";
System.out.println("截取"+pwd+",从10号下标开始截取的子字符串:"+pwd.substring(10));
System.out.println("截取"+pwd+",从5~9号下标截取的子字符串:"+pwd.substring(5,9));
}
}
运行结果:
截取java是面向对象的编程语言,从10号下标开始截取的子字符串:编程语言
截取java是面向对象的编程语言,从5~9号下标截取的子字符串:面向对象
5.charAt()
实现从字符串中提取指定位置的字符
public class LianXi {
public static void main(String[] args) {
String pwd = "java是面向对象的编程语言";
char lzq = pwd.charAt(9);
System.out.println(pwd+"第9索引位置的元素是"+lzq);
}
}
运行结果:
java是面向对象的编程语言第9索引位置的元素是的