StringBuilder与StringBuffer
来源:互联网 发布:贺知章回乡偶书二首 编辑:程序博客网 时间:2024/06/05 16:59
StringBuffer与StringBuilder的区别与联系
★相同点: StringBuffer和StringBuilder都表示可变的字符串,功能方法都是相同的.★不同点: 1)StringBuffer中的方法都使用了synchronized修饰符,表示同步的,在多线程并发的时候可以保证线程安全,保证线程安全的时候,性能(速度)较低. 2) StringBuilder中的方法都没有使用了synchronized修饰符,不安全,但是性能较高.(建议使用StringBuilder)
因StringBuffer与StringBuilder的功能和方法相同,因此,下面只介绍StringBuilder类
StringBuilder类
StringBuilder类即字符生成器,新创建的StringBuilder对象初始容量为16个字符,可以自行指定初始长度,也可以动态地执行添加、删除和插入等字符串的编辑操作,大大提高了频繁增加字符串的效率。如果附加的字符超过可容纳的长度,则StringBuilder对象将自动增加长度以容纳被附加的字符。
Demo
通过例子来对比String与StringBuilder在对字符串做更新操作时所有时间的差别。
public class Jerque { public static void main(String[] args) { String str=""; //创建空字符串 //定义操作的起始时间 long starTime=System.currentTimeMillis(); //for循环100000次 for(long i=0;i<100000;i++){ str=str+i; //循环追加字符串 } //定义对字符串操作后的时间 long endTime=System.currentTimeMillis(); //计算执行的时间 long time=endTime-starTime; System.out.println("String消耗的时间为"+time+"毫秒"); //创建StringBuilder StringBuilder sb=new StringBuilder(""); //定义操作执行前的时间 starTime=System.currentTimeMillis(); for(long j=0;j<100000;j++){ sb.append(j); //循环追加字符 } //定义操作执行后的时间 endTime=System.currentTimeMillis(); //操作执行的时间 time=endTime-starTime; System.out.println("StringBuilder消耗的时间为 "+time+"毫秒"); }}
结果:
StringBuilder类是一个可变的字符序列,提供了一个与StringBuffer类兼容的API,但是并不保证与之同步,该类是StringBuffer类的一个简易替换,在字符串缓存被单个线程使用时要比StringBuffer类快。但是将StringBuilder的实例用于多个线程是不安全的,这时就要使用StringBuffer类来实现。
StringBuilder类常用的方法
StringBuilder类的构造方法有很多,主要是参数上的区别。
<1>StringBuilder append(String str)方法
该方法将参数str指定的字符串追加到字符串中。
builder.append(String str)
■ builder:声明的StringBuilder对象
■ str:追加到字符串中
■ 返回值:返回字符串的值,String类型
Demo:
使用StringBuilder append(String str)方法将字符串追加到字符串StringBuilder中
public class StringBuilderDemo { public static void main(String[] args) { //声明字符串 String s="good"; //构造初始值为hello的字符串 StringBuilder sb=new StringBuilder("hello"); //将s的值追加到sb中 sb.append(s); System.out.println("追加后sb的值是:"+sb); }}
结果:
追加后sb的值是:hellogood
append()方法不仅可以实现字符串的追加,还可以实现任何类型的数据追加,如int,boolean,char等,甚至其他的字符串也可以往里追加。
<2>StringBuilder append(StringBuffer sb)方法
该方法将参数指定的字符串缓存StringBuffer的值追加到StringBuilder中。
builder.append(StringBuffer sb);
■ builder:StringBuilder对象
■ sb:缓存中的值,追加到StringBuilder中
■ 返回值:返回将缓存的值追加到字符串生成器后的值,String型。
Demo
创建StringBuffer类,使用append(StringBuffer sb)方法将字符串缓存中的值追加到StringBuilder中。
public class stringBuffer { public static void main(String[] args) { //创建初始内容为Sunday的字符串缓存 StringBuffer buffer=new StringBuffer("Sunday"); //创建对象 StringBuilder builder=new StringBuilder(); builder.append(buffer); //向builder中追加数据 System.out.println("追加后的builder的值是:"+builder); }}
结果:
追加后的builder的值是:Sunday
<3>StringBuilder insert(int offset,String str)方法
该方法将参数指定的字符串str添加到offset指定的位置。
builder.insert(int offset,String str);
■ builder:StringBuilder的对象
■ offset:指定字符串添加的下标索引位置。
■ str:添加的字符串。
■ 返回值:返回添加的builder的值,String弄
Demo:
在项目中创建SubO类,在主方法中构造一个StringBuilder对象builder,初始值是字符串s1的值int,将字符串s2的值ser追加到builder的索引位置2处,并将builder输出。
public class SubO { public static void main(String[] args) { //创建字符串对象 String s1="int"; String s2="ser"; //创建对象 StringBuilder builder=new StringBuilder(s1); //向索引值为2的位置插入s2 builder.insert(2,s2); System.out.println("追加后builder的值是"+builder); }}
结果:
追加后builder的值是insert
<4>StringBuilder delete(int start,String end)方法
该方法移除StringBuilder中的子字符串,该子字符串从指定的start处开始,到指定的end结束。
builder.delete(int start,String end)
■ builder:创建的StringBuilder对象。
■ start:删除子字符串的起始索引位置。
■ end:删除子字符串结尾的索引位置。
■ 返回值:返回删除子字符串后的builder的值,String型 。
Demo:
在项目中创建SubD类,在主方法中构造一个builder对象,初始值是StringBuidler,将指定的子字符从中删除,将结果输出。
public class SubD { public static void main(String[] args) { //创建StringBuilder的对象builder并初始化 StringBuilder builder=new StringBuilder("StringBuiler"); //删除字符串 StringBuilder s1=builder.delete(5, 5); System.out.println("删除指定的字符串后:s1="+s1); StringBuilder s2=builder.delete(5,10); System.out.println("删除指定的字符串后:s2="+s2); }}
结果:
删除指定的字符串后:s1=StringBuiler
删除指定的字符串后:s2=Striner
如果start和end位置相同,则StringBuilder值不变,按原样输出;索引start的值会被删除,end的值会被保留,说明删除的子字符包含开始索引不包含结尾索引。
<5>String toString()方法
该方法返回StringBuilder的字符串表示,即将StringBuilder转换为字符串,转换后StringBuilder的值不变。
str.toString();
■ str:StringBuilder对象的值,转换字符串。
■ 返回值:返回转换后的字符串。
Demo:
在项目中创建ToString类,并使用toString()方法将StringBuilder中的值转换为字符串。
public class ToString { public static void main(String[] args) { StringBuilder builder=new StringBuilder("HelloWord"); String s=builder.toString(); System.out.println("s="+s); System.out.println("builder="+builder); }}
结果:
s=HelloWord
builder=HelloWord
example-1
题目:将汉字和字母转换成Unicode码
在项目中创建CharacterUnicode类,将字符串转换成字符数组,再将汉字和字母转换成Unicode码追加到到StringBuilder中。
public class CharacterUnicode { public static void main(String[] args) { String text="中国 hello"; //获取用户输入的字符串 char[] charArray=text.toCharArray(); //获取字符串的字符 StringBuilder builder=new StringBuilder(); //遍历字符数组 for(char c:charArray){ //转化成Unicode码并追加到builder中 builder.append((int)c+" "); } System.out.println("“中国 hello”的Unicode码是:"); //转换成字符串并输出 System.out.println(builder.toString()); }}
结果:
“中国 hello”的Unicode码是:
20013 22269 32 104 101 108 108 111
example-2
题目:去掉字符串中重复的字符
在项目中创建SBDelete类,把每一个字符和其后面的进行比较,如果相同就利用StringBuilder的deleteChar()方法将后面的删除。
public class SBDelete { public static void main(String[] args) { String s="最是那一低头的温柔像一朵水莲花不胜凉风的娇羞道一声珍重 道一声珍重那一声珍重里有蜜甜的忧愁一一 "; //创建StringBuilder字符串 StringBuilder sb=new StringBuilder(s); System.out.println("原来的字符串是:"+sb); System.out.println("原来的字符串长度是:"+sb.length()); //让每个字符和其后的进行比较 for(int i=0;i<sb.length();i++){ for(int j=i+1;j<sb.length();j++){ //如果字符串相同 if(sb.charAt(i)==sb.charAt(j)){ //删除后面的字符串 sb.deleteCharAt(j); // sb.delete(j, j+1); 删前不删后 } } } System.out.println("现在的字符串是:"+sb); System.out.println("现在的字符串长度是:"+sb.length()); }}
结果:
原来的字符串是:最是那一低头的温柔像一朵水莲花不胜凉风的娇羞道一声珍重 道一声珍重那一声珍重里有蜜甜的忧愁一一
原来的字符串长度是:48
现在的字符串是:最是那一低头的温柔像朵水莲花不胜凉风娇羞道声珍重 重里有蜜甜忧愁一
现在的字符串长度是:33
example-3
题目 : 实现字符串加密
在项目中创建EncryptUncrypt类,将字符串转换成字节数组,再将每个字节和密文字符异或操作进行加密;做相反运算就可以解密。
public class EncryptUncrypt { public static String EAndU(String value,char secret){ //将需要加密的内容转换成字符数组 byte[] bt=value.getBytes(); for(int i=0;i<bt.length;i++){ bt[i]=(byte)(bt[i]^secret); //进行异或运算 } //返回加密后的字符串 return new String(bt,0,bt.length); } public static void main(String[] args) { String value="我喜欢你"; //需要加密的内容 char secret='祈'; //密文 System.out.println("原字符串为:"+value); //加密 String encrypt=EncryptUncrypt.EAndU(value,secret); System.out.println("加密后的值:"+encrypt); //解密 String uncrypt=EncryptUncrypt.EAndU(encrypt,secret); System.out.println("解密后的值:"+uncrypt); }}
结果:
原字符串为:我喜欢你
加密后的值:啔圍簋尗
解密后的值:我喜欢你
example-4
题目 : 验证字符串是否回文
解析:给定一个字符串,如果从前往后读和从后往前读完全一样就称为回文。
在项目中创建StringB类,使用reverse()方法把字符反转,然后比较两个字符串相同位置的字符是否相同,如果都相同就是回文。
public class StringB { public static void main(String[] args) { //获取字符串 String s="香莲碧水动风凉水动风凉夏日长长日夏凉风动水凉风动水碧莲香"; StringBuilder sb=new StringBuilder(s); sb.reverse(); int count=0; for(int i=0;i<sb.length();i++){ //如果有一个不相等的话,输出 if(s.charAt(i)!=sb.charAt(i)){ System.out.println("您输入的不是回文诗"); } //如果相等一个,就自加1 if(s.charAt(i)==sb.charAt(i)){ count++; } } //如果count和s的长度相等,则返回是回文诗 if(count==sb.length()){ System.out.println("您输入的是回文诗"); } }}
结果:
您输入的是回文诗
- StringBuilder与StringBuffer
- String,StringBuffer与StringBuilder
- String,StringBuffer与StringBuilder
- StringBuffer 与 StringBuilder
- String,StringBuffer与StringBuilder
- StringBuilder 与 StringBuffer
- String,StringBuffer与StringBuilder
- StringBuffer与StringBuilder区别
- StringBuffer与StringBuilder
- StringBuilder 与StringBuffer
- stringbuffer与stringbuilder的
- StringBuffer与StringBuilder
- String, StringBuffer与StringBuilder
- String,StringBuffer与StringBuilder
- StringBuilder 与 StringBuffer 区别
- StringBuffer与StringBuilder区别
- StringBuffer与StringBuilder区别
- StringBUffer与StringBuilder
- jQuery自定义插件入门实例1
- 网络流算法总结
- 训练日记-7
- Spark Streaming源码初探 (3)
- 图和网络
- StringBuilder与StringBuffer
- 写DLL 时,加与不加 "Extern C"区别
- Super Jumping! Jumping! Jumping!
- axios以post方式传值的问题
- 数据库恢复技术
- H5拖放API
- 多列布局:定宽+自适应,不定宽+自适应,等宽布局,等高布局
- opencv 在ubuntu的cmake配置
- iOS 模拟器中点击 TextFiled后不弹出软键盘的解决方法