StringBuffer类
线程安全的可变字符序列
StringBuffer和String的区别
前者长度和内容可变,后者不可变
如果使用前者做字符串的拼接,不会浪费太多的资源
StringBuffer类的构造方法:
public StringBuffer() //无参构造方法
public StringBuffer(int capacity) //指定容量的字符串缓冲区对象
public StringBuffer(String str) //指定字符串内容的字符串缓冲区对象
范例:
package cn.itcast_01;
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.capacity:"+sb.capacity());//空参构造方法的容量16
System.out.println("sb.length:"+sb.length());//sb.length:0
System.out.println("----------------------------");
//public StringBuffer(int capacity) //指定容量的字符串缓冲区对象
StringBuffer sb2 = new StringBuffer(32);//设置32容量
System.out.println("sb2.capacity:"+sb2.capacity());//sb2.capacity:32
System.out.println("----------------------------");
//public StringBuffer(String str) //指定字符串内容的字符串缓冲区对象
StringBuffer sb3 = new StringBuffer("helloworld");
System.out.println("sb3.capacity:"+sb3.capacity());//sb3.capacity:26
System.out.println("sb3.length:"+sb3.length());//sb3.length:10
}
}
添加功能:
public StringBuffer append(String str) //可以把任意类型添加到字符串缓冲区里面
public StringBuffer insert(int offset , String str) //在指定位置把任意类型的数据插入到字符串缓冲区里面
范例01:添加功能:public StringBuffer append(String str) //可以把任意类型添加到字符串缓冲区里面
package cn.itcast_02;
/*
* StringBuffer的添加功能
*
*/
public class StringBufferDemo {
public static void main(String[] args) {
//public StringBuffer append(String str) //可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
//创建字符串缓存区对象
StringBuffer sb = new StringBuffer();//这一部相当于创建了一个缓冲区
/*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
*/
//以上代码简化:
sb.append("hello");
System.out.println("sb:"+sb);//返回结果:sb:hello
System.out.println("--------------------");
StringBuffer sb2 = new StringBuffer();
sb2.append("hello");
sb2.append(true);
sb2.append(123);
System.out.println("sb2:"+sb2); //返回结果:sb2:hellotrue123//就是不断的一步一步的往缓冲区里添加数据
/*//以上代码用链式编程方式:
sb2.append("hello").append(true).append(123);
System.out.println("sb2:"+sb2); //返回结果:sb2:hellotrue123
*/
}
}
范例02:添加功能 public StringBuffer insert(int offset , String str) //在指定位置把任意类型的数据插入到字符串缓冲区里面
package cn.itcast_02;
/*
* StringBuffer的添加功能
*
*/
public class StringBufferDemo {
public static void main(String[] args) {
//创建字符串缓存区对象
StringBuffer sb = new StringBuffer();//这一部相当于创建了一个缓冲区
//码用链式编程方式:
sb.append("hello").append(true).append(123);
System.out.println("sb:"+sb); //返回结果:sb2:hellotrue123
//public StringBuffer insert(int offset,String str) //在制定位置把任意类型数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
sb.insert(5, false);//从第5个元素后开始插入false数据
System.out.println("sb:"+sb);//返回结果:sb:hellofalsetrue123
}
}
删除功能:
public StringBuffer deleteCharAt(int index) //删除指定位置的一个字符,并返回本身
public StringBuffer delete(int start , int end) //删除指定位置开始到指定位置解释的内容,并返回本身
范例:
package cn.itcast_03;
/*
* StringBuffer的删除功能
*/
public class StringBufferDemo {
public static void main(String[] args) {
//创建对象
StringBuffer sb = new StringBuffer();
//添加元素,链式编程
sb.append("hello").append("world").append("java"); //返回结果:sb:helloworldjava
//public StringBuffer deleteCharAt(int index) //删除指定位置的字符,并返回本身
//需求:要删除e这个字符
//sb.deleteCharAt(1);//返回结果:sb:hlloworldjava
//public StringBuffer delete(int start,int end) // 删除从指定位置开始到指定位置结束的内容,并返回本身
//需求:删除world
//sb.delete(5,10); //返回结果sb:hellojava
//需求:删除所有数据
sb.delete(0,sb.length());//返回结果sb:
System.out.println("sb:"+sb);
}
}
替换功能:
public StringBuffer replace(int start , int end , strint str) //从指定位置到结束位置替换成字符XXX
范例:
package cn.itcast_04;
/*
* StringBuffer类的替换功能
*/
public class StringBufferDemo {
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 StringBuffer replace(int start,int end,String str) ////从指定位置到结束位置替换成字符XXX
//需求:把world替换成hahaha
sb.replace(5,10, "hahaha");
System.out.println("sb:"+sb);//返回结果:sb:hellohahahajava
}
}
反转功能:
public StringBuffer reverse() //将字符串反转
范例:
package cn.itcast_05;
/*
* StringBuffer类的反转功能
*
*/
public class StringBufferDemo {
public static void main(String[] args) {
//创建一个对象
StringBuffer sb = new StringBuffer();
//添加元素
sb.append("helloworld");
//public StringBuffer reverse() //将字符串反转
sb.reverse();
System.out.println("sb:"+sb);
}
}
public String substring(int start) //将字符串从指定位置截取
public String substring(int start , int end) //将字符串从指定位置开始到指定位置结束中间的内容截取
截取功能和前面几个功能的不同:
返回值类型是String类型,本身没有发生改变
范例:
package cn.itcast_06;
/*
* StringBuffer类的截取功能
*/
public class StringBufferDemo {
public static void main(String[] args) {
//创建对象
StringBuffer sb = new StringBuffer();
//添加元素
sb.append("helloworldjava");
//public StringBuffer(int start) //从指定位置开始截取
String s = sb.substring(5);//注意返回值类型是String,本身并没有改变
System.out.println("s:"+s);//返回结果:s:worldjava
//public StringBuffer(int start,int end) //截取中间一段
String s1 = sb.substring(5,10);
System.out.println("s1:"+s1); //返回结果:s1:world
}
}
类之间的转换:
A---B的转换,其实是为了使用B的功能
范例:
package cn.itcast_07;
/*
* String 和 StringBuffer的相互转换
*/
public class StringBufferTest_01 {
public static void main(String[] args) {
//String--------->StringBuffer
//定义一个String
String s = "helloworld";
//不能吧字符串的值直接赋值给StringBuffer
//方式1:
StringBuffer sb = new StringBuffer(s); //通过构造方法public StringBuffer(String str) //指定字符串内容的字符串缓冲区对象
//方式2:通过append方法
StringBuffer sb2 = new StringBuffer();
sb2.append(s);
System.out.println("sb:"+sb);
System.out.println("sb2:"+sb2);
//StringBuffer-------------->String
StringBuffer buffer = new StringBuffer("java");
//方式1:通过String的构造方法 String(StringBuffer buffer)
String str = new String(buffer);
//方式2:通过toString()方法
String str2= buffer.toString();
System.out.println("str:"+str);
System.out.println("str2:"+str2);
}
}
练习01:把数组拼接成一个字符串
package cn.itcast_08;
/*
* 把数组拼接成一个字符串
*/
public class StringBufferTest_01 {
public static void main(String[] args) {
//定义一个数组:
int[] arr = {44,33,55,11,22};
//定义功能
//方式1:用String做拼接大方式
String s1 = arrayToString(arr);
System.out.println("s1:"+s1); //返回结果:s1:[44, 33, 55, 11, 22]
//方式2:用StringBuffer做拼接方式
String s2 = arrayToString2(arr);
System.out.println("s2:"+s2);//返回结果s2:[44, 33, 55, 11, 22]
}
////:用String做拼接的方法
public static String arrayToString(int[] arr){
String s = "";
s += "[";
for (int x = 0;x<arr.length;x++){
if(x==arr.length-1){
s +=arr[x];
}
else{
s +=arr[x];
s +=", ";
}
}
s +="]";
return s;
}
public static String arrayToString2(int[] arr){
StringBuffer sb = new StringBuffer();
sb.append("[");
for (int x=0;x<arr.length;x++){
if(x==arr.length-1){
sb.append(arr[x]);
}
else{
sb.append(arr[x]);
sb.append(", ");
}
}
sb.append("]");
return sb.toString();
}
}
练习02:从键盘输入字符串,把字符串反转
package cn.itcast_08;
import java.util.Scanner;
/*
* 从键盘输入字符串,将字符串反转
*/
public class StringBufferTest_02 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);//创建Scanner对象
System.out.println("请输入一串字符:");
String s = input.nextLine(); //调用Scanner对象的nextLine方法
String ouput = reversalString(s); // 调用reversalString方法,传递给String类型的接收
System.out.println("ouput:"+ouput);
}
//定义一个基于StringBuffer类的字符反转方法。
/*两个要素:
a/ 返回值类型 String
b/ 参数列表 String str*/
public static String reversalString(String str){
StringBuffer sb = new StringBuffer(); //创建一个StringBuffer对象
sb.append(str);//添加元素
String s = sb.reverse().toString();//调用reverse方法反转后,转换成String类型
return s;
}
}
例如:“abc”不是对称字符串,“aba”是对称字符串
package cn.itcast_08;
import java.util.Scanner;
/*
* 判断一个字符串是不是对称字符串
* 思路:
* 判断一个字符串是否是对称字符串,需要:
* 第一个和最后一个比较
* 第二个和倒数第二个比较
* 。。。。
* 比较的次数是长度/2
*/
public class StringBufferTest_03 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串:");
String s = sc.nextLine();
//一个一个比较
boolean b = isSame(s);
System.out.println("b:"+b);
//方式2,使用字符串缓冲区反转功能
boolean b2 = isSame2(s);
System.out.println("b2:"+b2);
}
//方式1:定义一个boolean方法
public static boolean isSame(String s){
//把字符串转成字符数组
char[] chs = s.toCharArray();
for(int start=0,end = chs.length-1;start<=end;start++,end--){
if (chs[start]!=chs[end]){
return false;
}
}
return true;
}
//方式2:使用字符串缓冲区的反转功能
public static boolean isSame2(String s){
StringBuffer sb = new StringBuffer();
sb.append(s);
String s1 = sb.reverse().toString();
return s.equals(s1); //调用equals方法判断反转前后的字符是否一致。返回boolean值
}
}
在单线程模式下,用StringBuilder替代StringBuffer效率会更高。