黑马程序员————StringBuffe字符串缓冲简单介绍



------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

.StringBuffer:线程安全的可变字符序列
 1、stringbuffer概述
 1).StringBuffer是一个容器,可以装一些字符串。
  它就类似于一个"容器"。里面装的是"字符串"。用它来盛装"字符串",对"字符串"进行 一系列的操作
 2).它有容量和长度的概念;
 3).StringBuffer和String的区别:
  1).String的值是不可变的;
  2).StringBuffer是容器,内部是可以改变的;
 4).如果需要对一个字符串经常的修改,要考虑使用StringBuffer。因为String会产生多个的存储空间,这是一个效率比较低的方式。
 5).StringBuffer和StringBuilder的区别:
  1).StringBuffer是线程安全的。效率低;
  2).StringBuilder是线程不安全的。效率高;

 2、构造方法:
  public StringBuffer() :构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符
  public StringBuffer(int capacity):构造一个不带字符,但具有指定初始容量的字符串缓冲区
  public StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
 StringBuffer的容量和长度的概念
  1.容量:可存储的最大长度;public int capacity()方法可以获取容量
  2.长度:当前实际存储的字符的数量;public int length()返回长度(字符数)

 3、成员方法:
 StringBuffer的添加功能:
  public StringBuffer append(String str):append()有很多其他的重载方法。可以接收★★★任何的基本数据类型★★★,并将这些类型的参数转换String存储到内部;
   注意:由于返回的就是调用者的引用,所以,调用时,接不接收返回值都可以,效果一样的。

class Student{
  public Student append(boolean b){
    //做一些其他事情
   return this;//哪个对象调用此方法,就返回哪个对象的引用;
  }
  }
 public static void main(){
  Student stu = new Student();
    Student stu2 = stu.append(true);
   System.out.println(stu == stu2);
 }


  public StringBuffer insert(int offset,String str):将字符串插入此字符序列中。将字符串str插入到offset位置。原offset位置上的字符后移。
   参数:offset - 偏移量。str - 一个 string。
 
 StringBuffer类的删除方法;
  public StringBuffer deleteCharAt(int index):删除index位置上的字符
  public StringBuffer delete(int start,int end):删除start索引位置到 end - 1   的索引位置上的所有字符


 StringBuffer类的替换和反转:
  public StringBuffer replace(int start,int end,String str):将start和(end - 1处)之间的字符替换为参数str
   大家回顾String类的replace()方法,它们两个的区别:
    1.String的replace()方法返回一个新字符串,原字符串没变;
    2.StringBuffer的replace()方法改变的就是自己容器内部的字符序列。内部是发生了改变的。
   
  public StringBuffer reverse()倒序更改其内的字符序列,其长度和对象地址值不发生改变。
 
 StringBuffer类的截取功能:
  public String substring(int start):从start开始到结尾。返回的是一个String。原内部的值是否会发生改变呢?没变
  public String substring(int start,int end):截取从start到 end  处 的所有字符,原内部的值不发生改变。


 4、String 和StringBuffer的相互转换
  1).从String到StringBuffer
   1.通过构造方法:
    String str = "hello";
      StringBuffer buf = new StringBuffer(str);
   2.使用append方法
   String str = "hello";
   StringBuffer buf = new StringBuffer();
   buf.append(str);
  2).从StringBuffer到String:
   1.StringBuffer的toString()方法:String str = buf.toString();
   2.使用截取:String str = buf.substring(0);


 5、打印StringBuffer,会调用其tostring方法,输出的是其内的字符序列。

 6、把数组拼接成字符串
  使用String进行拼接。弊端:在拼接过程中,会产生很多的字符串空间。
  使用stringbuffer;循环拼接就可以。
  

for(int i = 0 ;i < arr.length ; i++){
   if(i < arr.length - 1){
    buf.append(arr[i]);
    buf.append(",");
   }else{
    buf.append(arr[i]);
  return buf.toString();//需要将StringBuffer转换为String

 7、字符串反转
  A:StringBuffer中有个反转的功能:reverse()
   1).将字符串转换为StringBuffer:通过StringBuffer的构造方法;
   2).调用reverse();
   3).将StringBuffer再转换为字符串;
  B:其它算法:
   1.将字符串提取数组;
   2.倒序遍历数组,将数组中每个字符存储到StringBuffer中;
   3.将StringBuffer中的字符串取出;
  C:数组倒序法:
   1.将字符串提取数组;
   2.将数组中第一个元;素和倒数第一个元素交换,第二个和倒数第二个交换,以此类推,
   3.将字符数组转换为字符串


  8、判断是否是对称字符串
   算法一:
    1.定义一个字符串,并转换为StringBuffer
    2.将StringBuffer内的值反转;
    3.转换为字符串并和原字符串比较,如果相同,则认为是"对称串"
   算法二:
    1.定义一个字符串,并转换为字符数组;
    2.将字符数组中的第一个元素和倒数第一个元素比较,并依次比较第二位和倒数第二位,如果有一位不相同,就不是对称字符串:

  String str = "abcba";
  char[] charArray = str.toCharArray();
  int len = charArray.length ;          
  boolean flag = true;//先假设是对称串;//使用一个boolean类型的变量做标记
  for(int i = 0 ;i < len ; i++){
   char c1 = charArray[i];
   char c2 = charArray[charArray.length - 1 - i];
   if(c1 != c2){
    flag = false;//标记不是对称串;
    break;
   }
  }
  if(flag){
   System.out.println("是对称串");
  }else{
   System.out.println("不是对称串");
  }


  9、StringBuffer和StringBuilder的区别:使用上来讲,两个方法是等价的。
   1.StringBuffer是线程安全的:可以安全的被多个线程同时访问。效率低;
   2.StringBuilder是线程不安全的。效率高;


  10、StringBuffer和数组的区别:
   1.StringBuffer内部也是使用的数组,但对于我们来说,这个数组是"可变长度的",我们不用关心"容量不够的情况"。
     数组:长度是固定的。一旦确定长度后,后期不能更改了。
   2.StringBuffer的append()方法可以接收任何类型的参数,电脑最终都转换为"字符"存储了
     数组:定义什么类型的就只能存储什么类型;


   11、String和StringBuffer分别作为方法的形参
    String作为参数传递,传递的是地址值,方法内改变引用指向,不改变原来的字符串
    StringBuffer作为参数传递,传递的也是地址值,但是方法内改变其内容,影响原来的内容。
 

  public static void change1(String str){//str = 0x2233
    str = "world";//str = 0x5566//改变的不是原来字符串中的内容,因为字符串是不可变的。
   public static void change2(StringBuffer buf){//buf = 0x4444
    buf.append("world");//这里更改的就是0x4444中的内容;//同String类不同,StringBuffer内部是可以被更改的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值