String StringBuilder StringBuffer三者的关系
由于先学的C++嘛。平常刷题也就是用用String ,char数组什么的。之前一次测试的时候惊喜的发现,在java里面不能直接输入整型char字符整型。会显示是异常类。emmm,卡了一个小时,后来发现必须要用时间类了,生计所迫只能自学了嘛。
哪里不会学哪里嘛,所以我们来先研究一下字符串String类型。以及延伸出来的StringBuilder StringBuffer类。
1)String,字符串常量。也就是说String对象一旦创建之后,对象是不可更改的。
String a = "wo";
System.out.println(a);
a = a + "zeihaokan";
System.out.println(a);
输出结果肯定是两行嘛。
wo。
wozeihaokan。
清晰明了的两句大实话。看起来像一串赋值语句,其实是先创建了一个String对象a,并且把"wo"赋值给a。然后第三行的时候重新创建了一个也叫a的对象,之前的a就被(GC)给回收掉了,所以String类型就是一个不断创建新的对象,并且将旧的对象回收的一个过程,执行速度就不敢恭维了。
2)String StringBuilder StringBuffer三者的区别
①运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
②String字符串常量而StringBuilder和StringBuffer均为字符串变量
③String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
3)StringBuilder StringBuffer两者的比较。
当我们如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。当然了,如果说要是简单的OJ提交的话,还是使用StringBuilder比较好。
4)StringBuffer的使用方法
1.构造函数.
StringBuffer();构造一个没有任何字符的StringBuffer类。
StringBuffer(int length);构造一个没有任何字符的StringBuffer类,并且,其长度为length。
StringBuffer(String str); 以str为初始值构造一个StringBuffer类。
2.append()方法。
StringBuffer的append方法添加object,实质为object的toString返回值(String信息)加入StringBuffer尾部。这个向字符串缓冲区追加的元素的参数可以是布尔量、字符、字符数组、双精度数、浮点数、整型数、长整型数对象类型的字符串、字符串、和StringBuffer类等。如果添加的字符超出了字符串缓冲区的长度,java将自动进行扩充。
3.insert()方法。
StringBuffer a = new StringBuffer("woshuai");//调用insert方法前结果:woshuai
a.insert(2,"字符串zei").
System.out.println(a);//调用insert方法后结果:wozeishuai
4.int capacity();返回当前StringBuffer对象(字符串缓冲区)的总空间,而非字符号串的长度。
5.char charAt(int index);在当前StringBuffer对象中取索引号为index的字符。
第一个字符的索引号为0.
6.StringBuffer delete(int start, int end):删除当前StrinBuffer对象中以索引号start开始,到end结束的子串。
7.StringBuffer deleteCharAt(int index);删除当前StringBuffer对象中索引号为index的字符.
8.void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)从当前StringBuffer对象的索引号srcBegin开始,到srcEnd结束的子串,复制到字符数组dst中,并且从dst的索引号dstBegin开始。
eg: StringBuffer e = new StringBuffer("sb I love ad!");
char[] i = {'I', ' ', 'l', 'o', 'v', 'e', ' ', 's', 'b'};
e.getChars(10,12,i,7);
System.out.println(i);
System.out.print(e.charAt(10));
System.out.print(e.charAt(11)+":");
System.out.println(e);
输出结果:I love ad
ad:sb I love ad!
9.int indexOf(String str):返回当前StringBuffer对象中,第一个满足str子串的位置。
10.int indexOf(String str,int fromIndex):从当前StringBuffer对象的fromIndex开始查找,返回第一个满足子串的位置。
11.int length():返回当前StringBuffer对象(字符缓冲区)中,字符串的长度。
12.int lastindexOf(String str):返回当前StringBuffer对象中,最后一个满足子串的位置。
13.int lastindexOf(String str, int fromIndex):从当前StringBuffer对象的fromIndex开始查找,返回最后一个满足子串的位置。
14.StringBuffer replace(int start, int end, Strin g str):替换当前StringBuffer对象的字符串,从start开始,到end结束的位置替换成str。
15.StringBuffer reverse():将字符串翻转。
eg:StringBuffer a = new StringBuffer("13145678);
System.out.println("a:" + a);
结果为a:87654131;
16.void setCharAt(int index, char ch):设置索引号index的字符为ch。
17.void setLength(int newLength):重新设置字符串缓冲区中的字符串的长度,如果newLength小于当前的字符串长度,将截取多余的字符。
eg:StringBuffer a = new StringBuffer("012234564");
a.setLength(5);
System.out.println("a" + a);
结果为a:01223
18.String substring(int start):取当前StringBuffer对象中,从start开始到结尾的子串。
19.String substring(int start, int end):取当前StringBuffer对象中,从start开始到end的子串。
20.String toString():将当前StringBuffer对象转化成String对象。
5)注意事项:在初始化变量的时候,如果你这么初始化String a = "wo" + "zei" + "haokan"在JVM眼里这个就是String a = "wozeihaokan"。
如果你的字符串来自于另外的String对象的话,速度就没有那么快了。譬如:
String a = "wo";
String b = "zei";
String c = "haokan";
String str = a + b + c;
这时候JVM就会规规矩矩的按照原来的方式去做,str对象的生成速度就不会有之前的a的生成速度快了。所以说在String对象的创建过程中,要注意这一点。
由于先学的C++嘛。平常刷题也就是用用String ,char数组什么的。之前一次测试的时候惊喜的发现,在java里面不能直接输入整型char字符整型。会显示是异常类。emmm,卡了一个小时,后来发现必须要用时间类了,生计所迫只能自学了嘛。
哪里不会学哪里嘛,所以我们来先研究一下字符串String类型。以及延伸出来的StringBuilder StringBuffer类。
1)String,字符串常量。也就是说String对象一旦创建之后,对象是不可更改的。
String a = "wo";
System.out.println(a);
a = a + "zeihaokan";
System.out.println(a);
输出结果肯定是两行嘛。
wo。
wozeihaokan。
清晰明了的两句大实话。看起来像一串赋值语句,其实是先创建了一个String对象a,并且把"wo"赋值给a。然后第三行的时候重新创建了一个也叫a的对象,之前的a就被(GC)给回收掉了,所以String类型就是一个不断创建新的对象,并且将旧的对象回收的一个过程,执行速度就不敢恭维了。
2)String StringBuilder StringBuffer三者的区别
①运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
②String字符串常量而StringBuilder和StringBuffer均为字符串变量
③String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
3)StringBuilder StringBuffer两者的比较。
当我们如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。当然了,如果说要是简单的OJ提交的话,还是使用StringBuilder比较好。
4)StringBuffer的使用方法
1.构造函数.
StringBuffer();构造一个没有任何字符的StringBuffer类。
StringBuffer(int length);构造一个没有任何字符的StringBuffer类,并且,其长度为length。
StringBuffer(String str); 以str为初始值构造一个StringBuffer类。
2.append()方法。
StringBuffer的append方法添加object,实质为object的toString返回值(String信息)加入StringBuffer尾部。这个向字符串缓冲区追加的元素的参数可以是布尔量、字符、字符数组、双精度数、浮点数、整型数、长整型数对象类型的字符串、字符串、和StringBuffer类等。如果添加的字符超出了字符串缓冲区的长度,java将自动进行扩充。
3.insert()方法。
StringBuffer a = new StringBuffer("woshuai");//调用insert方法前结果:woshuai
a.insert(2,"字符串zei").
System.out.println(a);//调用insert方法后结果:wozeishuai
4.int capacity();返回当前StringBuffer对象(字符串缓冲区)的总空间,而非字符号串的长度。
5.char charAt(int index);在当前StringBuffer对象中取索引号为index的字符。
第一个字符的索引号为0.
6.StringBuffer delete(int start, int end):删除当前StrinBuffer对象中以索引号start开始,到end结束的子串。
7.StringBuffer deleteCharAt(int index);删除当前StringBuffer对象中索引号为index的字符.
8.void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)从当前StringBuffer对象的索引号srcBegin开始,到srcEnd结束的子串,复制到字符数组dst中,并且从dst的索引号dstBegin开始。
eg: StringBuffer e = new StringBuffer("sb I love ad!");
char[] i = {'I', ' ', 'l', 'o', 'v', 'e', ' ', 's', 'b'};
e.getChars(10,12,i,7);
System.out.println(i);
System.out.print(e.charAt(10));
System.out.print(e.charAt(11)+":");
System.out.println(e);
输出结果:I love ad
ad:sb I love ad!
9.int indexOf(String str):返回当前StringBuffer对象中,第一个满足str子串的位置。
10.int indexOf(String str,int fromIndex):从当前StringBuffer对象的fromIndex开始查找,返回第一个满足子串的位置。
11.int length():返回当前StringBuffer对象(字符缓冲区)中,字符串的长度。
12.int lastindexOf(String str):返回当前StringBuffer对象中,最后一个满足子串的位置。
13.int lastindexOf(String str, int fromIndex):从当前StringBuffer对象的fromIndex开始查找,返回最后一个满足子串的位置。
14.StringBuffer replace(int start, int end, Strin g str):替换当前StringBuffer对象的字符串,从start开始,到end结束的位置替换成str。
15.StringBuffer reverse():将字符串翻转。
eg:StringBuffer a = new StringBuffer("13145678);
System.out.println("a:" + a);
结果为a:87654131;
16.void setCharAt(int index, char ch):设置索引号index的字符为ch。
17.void setLength(int newLength):重新设置字符串缓冲区中的字符串的长度,如果newLength小于当前的字符串长度,将截取多余的字符。
eg:StringBuffer a = new StringBuffer("012234564");
a.setLength(5);
System.out.println("a" + a);
结果为a:01223
18.String substring(int start):取当前StringBuffer对象中,从start开始到结尾的子串。
19.String substring(int start, int end):取当前StringBuffer对象中,从start开始到end的子串。
20.String toString():将当前StringBuffer对象转化成String对象。
5)注意事项:在初始化变量的时候,如果你这么初始化String a = "wo" + "zei" + "haokan"在JVM眼里这个就是String a = "wozeihaokan"。
如果你的字符串来自于另外的String对象的话,速度就没有那么快了。譬如:
String a = "wo";
String b = "zei";
String c = "haokan";
String str = a + b + c;
这时候JVM就会规规矩矩的按照原来的方式去做,str对象的生成速度就不会有之前的a的生成速度快了。所以说在String对象的创建过程中,要注意这一点。
6)写在最后:
以上这些总结的内容绝大多数是我从网上以及书上找来的,写在这里是想把自己所学的分享给大家,方便大家学习,同时也有助于自己记忆,如果有哪里不对的恳请指正。