String , String Builder , String Buffer的区别浅析

String , String Builder , String Buffer的区别

首先来看这三个类分别代表什么什么意思

String类代表字符串 ,但是它是代表一个常量,底层是一个被final修饰的数组,它的值在创建之后不能够被更改。

StringBuilder(字符串缓冲区)StringBuffer(字符串缓冲区)虽然也是代表字符串并且底层也是数组,但是这个数组没有被final修饰,他们都是可变量,他们在创建对象实例并且赋值之后可以重新更改值得内容。

​ 这三者的区别主要存在与两点:运行速度线程安全

运行速度:

​ 三者的运行速度大小如下:StringBuilder > StringBuffer > String

​ 原因:

​ 先来看一段代码:

1
2
3
4
5
6
String s="Hello";
System.out.println(s);//Hello
System.out.println(s.getBytes());//[[email protected]
s=s+"World";
System.out.println(s);//HelloWorld
System.out.println(s.getBytes());//[[email protected]

​ 上述代码输出的结果是Hello [[email protected]HelloWorld [[email protected],这段代码在虚拟机上的执行过程实际是这样的:首先,在创建了一个对象s之后,将Hello赋值给了s然后又创建了一个同名对象s,并且将之前的s对象的值和World进行拼接之后赋值给了这个新的s。那么第一次创建的对象s去哪了呢?答案是被虚拟机的垃圾回收机制回收掉了(连同对象s 的值)。因此,在对String类型的对象进行操作的时候实际上就是一个不断创建同名新对象的删除旧对象的一个过程,这期间需要不断的消耗虚拟机的资源,因此执行速度很慢。

​ 但是StringBuilderStringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

线程安全:

StringBuilder是线程不安全的,StringBuffer是线程安全的

总结:

String:适用于少量的字符串操作的情况

String Builder:适用于单线程下在字符缓冲区进行大量操作的情况

String Buffer:适用多线程下在字符缓冲区进行大量操作的情况

StringBuilder/StringBuilder - - > String

​ 可以使用StringBuilder的构造方法:StringBuilder(String str)

String - - >StringBuilder/StringBuilder

​ 可以使用StringBuildertoString方法


String

常用构造方法:

1
2
3
4
5
6
public ():空构造
public (byte[] bytes):把字节数组转换成字符串
public (byte[] bytes,int offset,int length):把字节数组一部分转换成字符串
public (char[] value):把字节数组转换成字符串
public (byte[] bytes,int offset,int count):把字符数组一部分转换成字符串
public String(String original):把字符串常量值转成字符串,换句话说新创建的字符串是参数字符串的副本。

常用函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
String类的获取功能
int length();获取长度
char charAt(int index);返回指定索引位置的字符
int indexOf(int ch);返回指定字符在此字符串第一次出现的索引
int indexOf(String str);返回指定字符串(首字母)在此字符串第一次出现的索引
int indexOf(int ch,int fromIndex);返回指定字符在此字符串从指定位置之后第一次出现的索引
String substring(int start);截取字符串,默认到末尾。返回被截取的子串。
String substring(int start,int end);

String类的转换功能
byte[] getBytes();把字符串转换成字节数组
char[] toCharArray();把字符串转换成字符数组
static String valueOf(char[] chs);把字符数组转换成字串,其他类型数组用不了此方法
static String valueOf(int i);把某种类型数据转换成字符串(四类八种除了byte/short,外加)
String类的valueOf方法可以把任意类型的数据转换成字符串
toCharArray():可以将字符串转化成数组
String toLoweCase();
String toUpperCase();
String concat(String str):进行字符串的拼接
toCharArray(): 将此字符串转换为新的字符数组。

String类的其他功能
替换功能
String replace(char old,char new);
String replace(String old,String new);
String replaceFirst(String regex, String replacement)用给定的序列替换调用者的第一个子字符串
去除字符串两端空格
String trim();
按照字典顺序比较字符串
int compareTo(String str);
int compareToIgnoreCse(String str);
判断功能:
boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开头。
boolean startsWith(String prefix, int toffset) 测试在指定索引处开始的此字符串的子字符串是否以指定的前缀开头。
拆封功能
String[] split(String regex):根据给定的表达式拆分此字符串
注意:

1.String s=new String("hello");String s="hello"区别:

前者创建两个对象(常量池中没有这个hello对象的时候)或一个对象(常量池中有这个hello对象的时候),后者创建一个对象(常量池中没有这个hello对象的时候)或不创建对象(常量池中有这个hello对象的时候)

2.字符串如果是变量相加,先开空间,在拼接。

1
2
String s1="Hello",s2="World";
s1+s2

3.字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。

1
"Hello"+"World"

String Builder和String Buffer

常用构造方法(String Builder为例,String Buffer大致看了一眼,和String Builder几乎一摸一样):

1
2
3
4
StringBuilder() 构造一个没有字符的字符串构建器,初始容量为16个字符。  
StringBuilder(int capacity) 构造一个没有字符的字符串构建器,以及由 capacity参数指定的初始容量。
StringBuilder(CharSequence seq) 构造一个字符串构建器,其中包含与指定的 CharSequence相同的字符。
StringBuilder(String str) 构造一个初始化为指定字符串内容的字符串构建器。

常用方法(String Builder为例,String Buffer大致看了一眼,和String Builder几乎一摸一样):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
StringBuilder append(参数) 将指定参数的字符串表示附加到序列中。除了byte/short 
StringBuilder append(char[] str)char数组参数的字符串表示追加到此序列。
StringBuilder append(char[] str, int offset, int len)char数组参数的子阵列的字符串表示追加到此序列。
StringBuilder append(String str) 将指定的字符串附加到此字符序列。
StringBuilder append(StringBuffer sb) 追加指定的 StringBuffer到这个序列。
int capacity() 返回当前容量。
char charAt(int index) 返回指定索引位置的值
void setCharAt(int index, char ch) 设置指定位置的值为ch
StringBuilder reverse() 导致该字符序列被序列的相反代替。
StringBuilder replace(int start, int end, String str) 用指定的 String的字符替换此序列的子字符串中的字符
int indexOf(String str) 返回指定子字符串第一次出现的字符串内的索引。
int indexOf(String str, int fromIndex) 返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。
int lastIndexOf(String str) 返回指定子字符串最后一次出现的字符串中的索引。
int lastIndexOf(String str, int fromIndex) 返回指定子字符串的最后一次出现的字符串中的索引,从指定索引开始向后搜索。
String toString() 返回表示此顺序中的数据的字符串。