Java基础学习day16

StringBuffer

一、StringBuffer:

public final class StringBuffer
字符串缓冲区可供多个线程使用。
线程安全(没有出现同步操作,数据是安全的,但效率低),可变的字符序列。
字符串缓冲区类似于String ,但可以进行修改。

( 一)、StringBuffer 的构造方法

1、StringBuffer()
public StringBuffer() 构造一个字符串缓冲区,其中没有字符,初始容量为16个字符。
2、StringBuffer (int capacity)
public StringBuffer(int capacity) 构造一个字符串缓冲区,其中没有字符和指定的初始容量。
3、stringBuffer(String str)
public StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。字符串缓冲区的初始容量是16加上字符串参数的长度。


StringBuffer的方法:
public int capacity()返回当前容量。容量是新插入可用的存储量,超过此值将重新分配。
public int length() 返回长度(字符数)。
public class StringBufferDemo {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        System.out.println("sb的实际存储字符数:"+ sb.length());
        System.out.println("sb的容量为:" + sb.capacity());
        System.out.println("===============================");
        //StringBuffer (int capacity)
        StringBuffer sb2 = new StringBuffer(50);
        System.out.println("sb2的实际存储字符数:"+ sb2.length());
        System.out.println("sb2的容量为:" + sb2.capacity());
        System.out.println("================================");
        //stringBuffer(String str)
        StringBuffer sb3 = new StringBuffer("laoshuaini");
        System.out.println("sb3的实际存储字符数:"+ sb3.length());
        System.out.println("sb3的容量为:" + sb3.capacity());//本身字符串长度加上初始化容量长度
        System.out.println(sb3);

    }
}

(二)、 添加功能

   1、 public StringBuffer append(String str)
    将指定的字符串追加到此字符序列。
   2、 public StringBuffer insert(int offset,String str)
    将字符串插入此字符序列。
public class StringBufferDemo2 {
    public static void main(String[] args) {
        //创建StingBuffer对象
        StringBuffer sb = new StringBuffer("hello");
        sb.append("world").append("Java");//链式编程
        System.out.println(sb);
        System.out.println("==============================");
        //StringBuffer不仅可以增加String类型的,还可以增加char、int、long等类型
        //但需注意,无论添加之前是什么类型,添加之后都是字符,最终组合成字符串
        //就算是true,添加进StringBuffer中,输出后都是‘t’、‘r’、‘u’、‘e’四个字符组成的字符串
        Demo demo = new Demo();
        sb.append(demo);//添加的是引用数据类型类中toString()的结果
        System.out.println(sb);
        System.out.println("===============================");

        //public StringBuffer insert(int offset,String str)
        //        将字符串插入此字符序列。
        StringBuffer sb3 = new StringBuffer("hello");
        sb3.insert(3,"he");//String参数的字符按顺序插入到指定偏移量的此序列中,
                  // 向上移动最初位于该位置上方的任何字符,并将该序列的长度增加参数的长度。
        System.out.println(sb3);


    }
}
class Demo{
    private String name;

    public Demo() {
    }

    public Demo(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Demo{" +
                "name='" + name + '\'' +
                '}';
    }
}

(三)、删除功能:

1、 public StringBuffer deleteCharAt(int index)
        按此顺序删除指定位置的char 。
2、 public StringBuffer delete(int start,int end)
     删除此序列的子字符串中的字符。 子字符串从指定的start开始,
     如果不存在这样的字符,则扩展到索引end - 1处的字符或序列的末尾。  如果start等于end ,则不进行任何更改。
     异常:StringIndexOutOfBoundsException -
     如果 start为负数,大于 length() ,或大于 end 。 
public class StringBufferDemo3 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("woaidashuju");
        System.out.println(sb);
        System.out.println("sb的实际存储字符的个数:" + sb.length());
        System.out.println("======删除字符后============");
//        sb.deleteCharAt(4);
//        System.out.println(sb);
//        System.out.println("sb实际存储字符个数:"+ sb.length());
        System.out.println("======指定位置删除============");
        sb.delete(3,5);
        System.out.println(sb);  //删除数为(3,5]内字符
     
    }

}

(四)、 替换功能

    public StringBuffer replace(int start,int end,String str)
     使用指定的String的字符替换此序列的子字符串中的字符。
     子字符串从指定的start开始,并且如果不存在这样的字符,则扩展到索引end - 1处的字符或序列的末尾。
     首先删除子字符串中的字符,然后在String插入指定的start 。
    (如果需要,将延长此序列以容纳指定的字符串。)
public class StringBufferDemo4 {
    public static void main(String[] args) {
        //创建一个StringBuffer对象
        StringBuffer sb = new StringBuffer("hellowol");
        System.out.println(sb);
        System.out.println("=====指定位置替换字符==============");
//        sb.replace(2,6,"wove");// 从[2,6)开始替换,含头不含尾
//        System.out.println(sb);
//        sb.replace(15,20,"hello");
//        System.out.println(sb);//StringIndexOutOfBoundsException: start > length()
        sb.replace(1,3,"jkoi");
        System.out.println(sb);// 插入的字符长度大于删除的字符长度
    }

}

(五)、反转功能

    public StringBuffer reverse()
    导致此字符序列被序列的反向替换。 如果序列中包含任何代理对,则将这些代理对视为反向操作的单个字符。
    设n是执行reverse方法之前的该字符序列的字符长度(不是char值中的长度)。
    然后,新字符序列中索引k处的字符等于旧字符序列中索引nk-1处的字符。
public class StringBufferDemo5 {
    public static void main(String[] args) {
        //创建StringBuffer对象
        StringBuffer sb = new StringBuffer();
        sb.append("我爱晗鹿");
        System.out.println(sb);
        sb.reverse();
        System.out.println("反转之后:" + sb);


    }
}

(六)、 截取功能

  1、  public String substring(int start)
    返回一个新的String ,其中包含此字符序列中当前包含的字符的子序列。
    子字符串从指定的索引开始并延伸到此序列的末尾。
 2、   public CharSequence subSequence(int start, int end)
    返回一个新的字符序列,
public class StringBufferDemo6 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        sb.append("hello").append("world").append("java").append("spark");
        System.out.println(sb);
        String sb1 = sb.substring(6);
        System.out.println("截取字符为:"+sb1 );
        System.out.println("截取后原字符为:"+sb);
        System.out.println("==============================");
        String sb3 = sb.substring(5, 10);
        System.out.println(sb3);
        System.out.println("截取后原字符为:"+ sb);
        System.out.println("=========将StringBuffer类型转换为String类型=================");
        String sb4 = sb.substring(0);
        System.out.println(sb4);
        //System.out.println(sb==sb4);//java: 不可比较的类型: java.lang.StringBuffer和java.lang.String

    }
}

(七)、 String类型与StringBuffer类型之间的相互转换

    A,B
    A--B ,将A类型转换成B类型,目的是为了使用B类型中的功能
    B--A ,再将B转换成A类型 ,目的可能是最终的结果需要A类型,所以将它再次转换。
public class StringBuffer7 {
    public static void main(String[] args) {
        //String --StringBuffer (将String转换为StringBuffer,在StringBuffer中寻找方法,)
        String s = "hello";
        //方法一:构造方法
        StringBuffer sb = new StringBuffer(s);
        System.out.println(sb);
        //方法二:使用StringBuffer中append方法
        StringBuffer sb1 = new StringBuffer();
        sb1.append(s);
        System.out.println(sb1);
        //判断sb与sb1是否转换为String类型
        System.out.println(s.equals(sb));
        System.out.println(s.equals(sb1));
        System.out.println("=============================");
        //StringBuffer--String
        StringBuffer sb2 = new StringBuffer("hellowo");
        //方法一:StringBuffer 中的截取方法
//        sb2.substring(0);
//        System.out.println(sb2);
        //方法二:toString()方法 --最常用的方法
//        String s1 = sb2.toString();
//        System.out.println(s1);
        //public String(StringBuffer buffer)
        //分配一个新字符串
        String s2 = new String(sb2);
        System.out.println(s2);


    }
}

(八)、String与StringBuffer作为参数传递的区别

public class StringBufferDemo8 {
    public static void main(String[] args) {
        String s1 = "hello";
//        String s2 = "world";
//        System.out.println("s1:" + s1 + ",s2:" + s2); // s1:hello,s2:world
//        change(s1, s2);
//        System.out.println("s1:" + s1 + ",s2:" + s2); // s1: hello ,s2: world

        //但凡new出来的都在堆内存中,
        // StringBuffer类append之后 ,返回的是什么
        StringBuffer sb1 = new StringBuffer("hello");
        StringBuffer sb2 = new StringBuffer("world");
        System.out.println("sb1:" + sb1 + ",sb2:" + sb2); //sb1: hello  ,sb2: world
        change(sb1,sb2);
        System.out.println("sb1:" + sb1 + ",sb2:" + sb2); // sb1: hello  ,sb2: worldworld



    }

    // 当StringBuffer作为参数传递的时候,谁进行了操作,谁就发生了变化
    public static void change(StringBuffer sb1,StringBuffer sb2){
        sb1 = sb2;
        sb2 = sb1.append(sb2);
        System.out.println("sb1:" + sb1 + ",sb2:" + sb2); // sb1: worldworld  ,sb2: worldworld
    }

    public static void change(String s1, String s2) {
        s1 = s2;
        s2 = s1 + s2;
        System.out.println("s1:" + s1 + ",s2:" + s2); //s1: world ,s2:worldworld
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值