首页 > 代码库 > java之StringBuffer类
java之StringBuffer类
1.StringBuffer类概述
StringBuffer类概述:如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。而StringBuffer就可以解决这个为题。
线程安全的可变字符序列。
2.线程初识
线程安全,就是线程之间的同步。例如:今天我拿着我的银行卡去取款机取钱,但是同一时刻,我妻子拿着存折去银行取钱。如果银行系统之间的数据是不同步或者说线程之间是不同步,那么,非常happy。我在取款机取了1000元,而我妻子拿着存折在银行也取了1000元。那么,这样的事情,是很“可怕”的。所以,线程安全,就是线程之间的同步,也就意味着数据的安全。
同理,线程不安全,就是线程之间不同步。比如,我在看电视的同时,可以和别人聊天。所以,线程不安全,就是指线程之间不同步,但是不同步也有好处啊,那就是效率高。换句话说,如果线程安全的话,我先看电视,然后看完电视,再和别人说话,这样是能认真的看电视,但是别人可能过了这个时间点都没心情聊天了。
所以,线程安全,即线程之间的同步。和线程不安全,即线程之间的不同步,就是永远困扰我们的问题。就看我们怎么想了,如果你想要数据安全,那么就线程安全,即线程之间的同步;相反,如果你追求高效率的话,那么就线程不安全,即线程之间不同步。
在生活中,线程安全的例子很多,比如:医院的网站和银行的网站。但线程不安全的例子也不少,比如新闻网站,论坛等等。
3.StringBuffer和String之间的区别?
前者的长度和内容可变,后者不可变。
如果使用前者做字符串拼接,不会浪费太多的资源。
4.构造方法
public StringBuffer()
public StringBuffer(CharSequence seq)
public StringBuffer(int capacity)
public StringBuffer(String str)
package cn; /** * StringBuffer的构造方法 * public StringBuffer() 无参构造方法 * public StringBuffer(int capacity) 指定容量的字符串缓冲区对象 * public StirngBuffer(String str) 指定字符串内容的字符串缓冲区对象 * * StringBuffer的方法 * public int capacity() 返回当前容量 * public int length() 返回长度 */ public class StringBufferDemo { public static void main(String[] args) { //public StringBuffer() 无参构造方法 StringBuffer sb = new StringBuffer(); System.out.println("sb:"+sb);//sb: System.out.println("sb的长度:"+sb.length());//sb的长度:0 System.out.println("sb的容量:"+sb.capacity());//sb的容量:16 //public StringBuffer(int capacity) 指定容量的字符串缓冲区对象 StringBuffer sb2 = new StringBuffer(50); System.out.println("sb2:"+sb2);//sb2: System.out.println("sb2的长度:"+sb2.length());//sb2的长度:0 System.out.println("sb2的容量:"+sb2.capacity());//sb2的容量:50 //public StirngBuffer(String str) 指定字符串内容的字符串缓冲区对象 StringBuffer sb3 = new StringBuffer("helloworld"); System.out.println("sb3:"+sb3);//sb3:helloworld System.out.println("sb3的长度:"+sb3.length());//sb3的长度:10 System.out.println("sb3的容量:"+sb3.capacity());//sb3的容量:26 } }
5.StringBuffer的增、删、替换、反转功能
StringBuffer类之增功能
package com; /** * StringBuffer的添加功能: * public StringBuffer append(String str):可以把任意类型数据添加到字符串缓冲区里面 ,并返回字符串缓冲区本身 * public StringBuffer insert(int offset,String str):可以将任意类型数据添加到指定字符串缓冲区里面,返回字符串缓冲区本身 */ public class StringBufferDemo2 { public static void main(String[] args) { //创建字符串缓冲区对象 StringBuffer sb = new StringBuffer(); //public StringBuffer append(String str):可以把任意类型添加到字符串缓冲区里面 StringBuffer sb2 = sb.append("hello"); System.out.println("sb:"+sb);//sb:hello System.out.println("sb2:"+sb2);//sb2:hello System.out.println(sb == sb2);//true //append()方法可以调用多次,链式编程 System.out.println(sb.append("world").append(true).append(‘a‘).append(false));//helloworldtrueafalse System.out.println(sb.insert(0, "天下无敌"));//天下无敌helloworldtrueafalse } }
StringBuffer类之删功能
package com; /** * StringBuffer的删除功能 * public StringBuffer deleteCharAt(int index) 删除指定位置的字符,并返回字符串缓冲区本身 * public StringBuffer delete(int strat,int end) 删除从指定位置开始到指定位置结束的内容,并返回字符串缓冲区本身 * */ public class StringBufferDemo3 { public static void main(String[] args) { //创建对象 StringBuffer sb = new StringBuffer(); sb.append("helloworld").append("java"); System.out.println(sb);//helloworldjava //public StringBuffer deleteCharAt(int index) 删除指定位置的字符,并返回字符串缓冲区本身 //需求:要求删除e这个字符,怎么办? System.out.println(sb.deleteCharAt(1));//hlloworldjava //需求:我要删除第一个l字符,怎么办? System.out.println(sb.deleteCharAt(1));//hloworldjava //public StringBuffer delete(int strat,int end) 删除从指定位置开始到指定位置结束的内容,并返回字符串缓冲区本身 //需求:我要删除world System.out.println(sb.delete(3, 8));//hlojava //需求:我要删除所有的数据 System.out.println(sb.delete(0, sb.length()));// } }
StringBuffer类之替换功能
package com; /** * StringBuffer的替换功能 * public StringBuffer replace(int start,int end,String str)从strat到end用str替换 */ public class StringBufferDemo { public static void main(String[] args) { //创建字符串缓冲区对象 StringBuffer sb = new StringBuffer(); //添加数据 sb.append("hello").append("world").append("java"); System.out.println("替换前:"+sb);//替换前:helloworldjava //public StringBuffer replace(int start,int end,String str)从strat到end用str替换 //需求:把world这个数据用"节日快乐"替换 sb.replace(5, 10, "节日快乐"); System.out.println("替换后:"+sb);//替换后:hello节日快乐java } }
StringBuffer类之反转功能
package com; /** * StringBuffer类之反转功能 * public StringBuffer reverse() * */ public class StringBufferDemo4 { public static void main(String[] args) { //定义字符串缓冲区对象 StringBuffer sb = new StringBuffer(); //添加对象 sb.append("逼傻扬清风"); System.out.println("反转前:"+sb);//反转前:逼傻扬清风 System.out.println("反转后:"+sb.reverse());//反转后:风清扬傻逼 } }
StringBuffer类之截取功能
package com; /** * StringBuffer类之截取功能 * public String substring(int start) * public String substring(int start,int end) * */ public class StringDemo6 { public static void main(String[] args) { //定义一个字符串缓冲区对象 StringBuffer sb = new StringBuffer(); //添加对象 sb.append("hello").append("world").append("java"); System.out.println("截取之前的sb是:"+sb);//截取之前的sb是:helloworldjava //截取功能 //public String substring(int start) String s = sb.substring(5); System.out.println("s:"+s);//s:worldjava System.out.println("截取之后的sb是:"+sb);//截取之后的sb是:helloworldjava } }
6.StringBuffer和String类的相互转换
package cn; /** * String和StringBuffer类的相互转换? * String-->StringBuffer的转换: 我们把类A转换为类B,其实是为了使用B的功能。 * StringBuffer-->String的转换: 我们可能要的结果是String类型,所以还得转回来 */ public class StringDemo7 { public static void main(String[] args) { String s = "hello"; //不能把字符串的值直接赋值给StringBuffer //1.通过构造方法 StringBuffer sb = new StringBuffer(s); System.out.println("String-->StringBuffer:"+sb);//String-->StringBuffer:hello //2.通过append()方法 StringBuffer sb2 = new StringBuffer(); sb2.append(s); System.out.println("String-->StringBuffer:"+sb2);//String-->StringBuffer:hello //StringBuffer-->String //1.通过toString()方法 StringBuffer buffer = new StringBuffer("java"); String str = buffer.toString(); System.out.println("StringBuffer-->String:"+str);//StringBuffer-->String:java //2.通过String的构造方法 String str2 = new String(buffer); System.out.println("StringBuffer-->String:"+str2);//StringBuffer-->String:java } }
7.把数组拼接成一个字符串
package cn; /** * 把数组拼接成一个字符串 * */ public class StringBufferTest2 { public static void main(String[] args) { //定义一个数组 int[] arr = new int[]{44,33,66,33,22}; //方法一:效率低 //定义功能 String str = arrayToString(arr); //拼接后的字符串 System.out.println("拼接后的字符串:"+str);//拼接后的字符串:[44, 33, 66, 33, 22] //方法二:用StringBuffer。这样效率高 String str2 = arrayToString2(arr); System.out.println("拼接后的字符串:"+str2);//拼接后的字符串:[44, 33, 66, 33, 22] } public static String arrayToString2(int[] arr){ StringBuffer sb = new StringBuffer(); sb.append("["); for (int i = 0; i < arr.length; i++) { if(i == arr.length -1){ sb.append(arr[i]); }else{ sb.append(arr[i]).append(", "); } } sb.append("]"); return sb.toString(); } public static String arrayToString(int[] arr){ String s = ""; s += "["; for (int i = 0; i < arr.length; i++) { if(i == arr.length -1){ s += arr[i]; }else{ s += arr[i]+", "; } } s += "]"; return s; } }
8.字符串反转
package cn; public class StringBufferTest3 { public static void main(String[] args) { String s = "我爱你"; //调用方法一 System.out.println(reverse(s));//你爱我 //调用方法二 System.out.println(reverse1(s));//你爱我 //但是调用方法一和方法二 就意味着产生很多“垃圾”,所以效率不高,为了提高效率,我们可以先将String转换为StringBuffer, //然后调用StringBuffer的reverse()方法,最后再将StringBuffer转换过来 System.out.println(reverse2(s));//你爱我 } /** * 方法一:使用String的length()和charAt()方法 * @param s * @return */ public static String reverse(String s){ String str = ""; for (int i = s.length()-1; i >= 0; i--) { str += s.charAt(i); } return str; } /** * 方法二:先通过toCharArray()将字符串转换为字符数组,然后将字符数组反转 * @param s * @return */ public static String reverse1(String s){ char[] chs = s.toCharArray(); for (int i = chs.length -1,j=0; i > j; i--,j++) { char temp = chs[i]; chs[i] = chs[j]; chs[j] = temp; } return new String(chs); } /** * 方法三:我们可以先将String转换为StringBuffer * 然后调用StringBuffer的reverse()方法,最后再将StringBuffer转换过来 * @param s * @return */ public static String reverse2(String s){ return new StringBuffer(s).reverse().toString(); } }
9.判断一个字符串是否是对称字符串
package cn; /** * * 需求:判断一个字符串是否是对称 字符串 * */ public class StringBufferTest4 { public static void main(String[] args) { String str = "abc"; String str1 = "abba"; String str2 = "aba"; //调用方法一: System.out.println(isSame(str));//false System.out.println(isSame(str1));//true System.out.println(isSame(str2));//true //调用方法二: System.out.println(isSame2(str));//false System.out.println(isSame2(str1));//true System.out.println(isSame2(str2));//true } /** * 方法一:先将字符串转换为字符数组,然后对字符数组中的首尾分别判断 * @param s * @return */ public static boolean isSame(String s){ char[] chs = s.toCharArray(); for (int i = 0,j=chs.length-1; i < j; i++,j--) { if(chs[i] != chs[j]){ return false; } } return true; } /** * 方法二:通过将String转换为StringBuffer,然后将其反转后,再将其转换为String,再与原来的String比较 * @param s * @return */ public static boolean isSame2(String s){ return new StringBuffer(s).reverse().toString().equals(s); } }
10.String、StringBuffer和StringBuilder的区别?
String是内容不可变得,而StringBuffer和StringBuilder是内容是可变的。
StringBuffer是数据同步的,是线程安全的,效率低;而StringBuilder是数据不同步的,线程不安全,效率高。
11.StringBuffer和数组的区别?
二者都可以看成是一个容器,装其他的数组。
StringBuffer的数组最终是一个字符串数据。
而数组可以放置多种数组,但必须是同一种数据类型的。
本文出自 “11831428” 博客,请务必保留此出处http://11841428.blog.51cto.com/11831428/1860211
java之StringBuffer类