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的数组最终是一个字符串数据。
而数组可以放置多种数组,但必须是同一种数据类型的。
转载于:https://blog.51cto.com/11841428/1860211