logo头像

你需要一点点勇气

String StringBuffer StringBuilder 区别和相互转化

1.区别

  • String是字符串常量,由String创建的字符内容是不可改变的。String内部是由char数组实现的,这个char数组有final修饰符。所以String创建的字符串对象内容是不可变的。
  • StringBuffer,StringBuilder 创建的是字符串变量,创建的字符串是可以改变的。StringBuffer, StringBuilder 都继承自AbstractStringBuilder, 内部也是用char数组实现的,但是char没有final修饰。所以创建的字符是可变的。
  • StringBuffer是线程安全的,append函数前有synchronized关键字修饰;StringBuilder不是线程安全的,所以更加高效,支持StringBuffer的所有操作。因此,一般单线程情况下优先使用StringBuilder。

2.相互转换

  • String —–> StringBuffer或者StringBuilder
1
2
3
4
5
6
7
8
9
10
11
String s="test";

//通过构造函数
StringBuffer sBuffer= new StringBuffer(s);
StringBuilder sBuilder= new StringBuilder(s);

//通过append方法
StringBuffer sBuffer= new StringBuffer();
sb.append(s);
StringBuilder sBuilder= new StringBuilder();
sbr.append(s);
  • StringBuffer或StringBuilder —–> String
1
2
3
4
5
6
7
StringBuffer sBuffer= new StringBuffer("bufferTest");

//通过构造函数
String s1= new String(sBuffer);

//通过toString方法
String s2= new sBuffer.toString();

3. String常用方法

==比较引用,equals比较内容

(1) 构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//无参构造 publc String()
String s1= new String();

//public String(String value);
String s2= new String("abc");
String s3= new String(s2);

//字符数组创建 public String(char[] value)
char[] cArray= {'a','b','c','d','e'};
String s4= new String(cArray);

//字符数组指定字符创建 public String(char[] value, int startIndex, int numChars)
char[] cArray= {'a','b','c','d','e'};
String s5= new String(cArray, 1, 3); //相当于s5= new String("bcd")

//byte数组创建 public String(byte[] value)
byte[] bArray= {97,98,65,66}
String s6= new String(bArray); //相当于s6=new String("abAB")

(2)字符串长度

1
2
3
String s7 = new String("123456");
int s7Length= s7.length(); // s7Length=6
##### 3. StringBuffer常用方法

(3)字符串比较

1
2
3
4
5
6
7
8
9
10
//public int compareTo(String s) 判断和s的大小,比参数大返回正整数,小返回负整数,相等返回0
//public int compareToIgnoreCase(String s) 同上,忽略大小写
//public boolean equals(String s) 对比字符串内容是否一致
//public boolean qualsIgnoreCase(String s) 同上,忽略大小写

String str="ABCabc"
str.compareTo("BA"); //-1
str.compareToIgnoreCase("abcabc"); //0
str.equals("abcabc"); //false
str.equalsIgnoreCase("abcabc"); //true

(4)字符串连接

1
2
//public String concat(String s)
String s8= "abc".concat("def").concat("ghi"); //相当于s8="abs"+"def"+"ghi"

(5)字符串分割

1
2
3
4
5
6
//String[] split(String s)
String s9="string split test with space";
String[] sArray1= s9.split("\\s");

String s10="string#split!test with|space";
String[] sArray2= s10.split("#!\\s|");

(6)字符串截取子串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//String trim() 截取字符串两端的空格,中间出现的空格不做处理
String s11= " a b c d ";
String s12=s11.trim(); // "a b c d"

//public char charAt(int index) 获取字符串某一位置的字符
String s13="abcdefg";
char c=s13.charAt(1); // 'b'

//public String substring(int beginIndex) 从beginIndex开始到结束的子串返回为新字符串
//public String substring(int beginIndex, int endIndex)
//从beginIndex开始,到endIndex-1结束的,返回子串为新的字符串
String s13="abcdefg";
String s14=s13.substring(2); // "cdefg"
String s15=s13.substring(1,5); // "bcde"

(7)字符替换及大小写转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//public String replace(char/String old, char/String new) 用新的字符或者字符串替换所有旧的字符或者字符串,并返回新的字符串
//public String replaceFirst(String regex, String replacement) 用replacement替换字符串中第一个匹配到regex的子串,并返回新的字符串
//public String replaceAll(String regex, String replacement) 用replacement替换字符串中的所有匹配到regex的子串,并返回新的字符串
String s16="ABCabcABC";
String s17=s16.replace('A','a'); // "aBCabcaBC"
String s18=s16.replace("ABC","abc"); // "abcabcabc"
String s19=s16.replaceFirst("ABC","abc"); // "abcabcABC"
String s20=s16.replaceAll("ABC","abc"); // "abcabcabc"

//public String toLowerCase() 字符串中所有字母转化为小写,并返回新字符串
//public String toUpperCase() 字符串中所有字母转化为大写,并返回新字符串
String s21="abcABC"
String s22=s21.toLowerCase(); // "abcabc"
String s23=s21.toUpperCase(); // "ABCABC"

(8)字符,子串查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
String s24="abcdefg"

//boolean contains(String s) 判断字符串中是否包含子串s
s24.contains("bcd"); // true

//public int indexOf(int ch/String s) 查找左起第一个匹配到的字符或者子串,返回首次首次出现的位置,没有返回-1
//public int indexOf(int ch/String s, int fromIndex) 从fromIndex开始包括fromIndex位的左起首次匹配位置,没有返回-1
//public int lastIndexOf(int ch/String s) 同上,右起查找
//public int lastIndexOf(int ch/String s, int fromIndex) 同上,右起查找
int i1= s24.indexOf('c'); // 2
int i2= s24.indexOf(67); // 2
int i3= s24.indexOf("abc"); // 0

//boolean startWith(String prefix) 判断是否以prefix开始
//boolean endWith(String suffix) 判断是否以 suffix结束
s24.startWith("abc"); // true
s24.endWith("kkk"); // false

(9)与基本类型、byte[]数组、char[]数组的转化

1
2
3
4
5
6
XXX xxx= parseXXX(String s)
String s= String.valueOf()
String s= new String(byte[])
String s= new String(char[])
char[] chars= s.toCharArray();
byte[] bytes= s.getBytes();

4.StringBuffer常用方法

1
StringBuffer buffer= StringBuffer();

(1) 添加删除查找

1
2
3
4
5
6
7
//append(int/char/float/double/long/boolean/char[]/String) 追加
buffer.append("stringbuffer");
//insert(int offset, int/char/float/double/long/boolean/char[]/String) 指定offset位置插入
buffer.insert(0,"123"); // "123stringbuffer"
buffer.deleteCharAt(0); // "23stringbuffer"
buffer.delete(0,1); // "stringbuffer"
buffer.indexOf("buffer"); //6

(2) 替换修改

1
2
3
4
//replace(int start, int end, String str)
buffer.replac(0,2,"rts"); // "rtsingbuffer"
//setCharAt(int index, char c)
buffer.setCharAt(0,'0'); // "0tsingbuffer"

(3) 反转

1
buffer.reverse(); //"reffubgnist0"