203 - StringBuilder类

1、字符串的分类

(1)不可变字符串:String

(2)可变字符串:StringBuilder,StringBuffer

疑问:

(1)可变不可变??

(2)StringBuilder —— (先讲)

(3)StringBuilder和StringBuffer区别  ??

2、StringBuilder底层  —— 非常重要的两个属性:

 3、StringBuilder内存分析

注意看数组的扩容。

代码示例:

package test9_StringBuilder;

public class Test1 {
    public static void main(String[] args) {
        //StringBuilder类在package java.lang 包下,所以直接使用,无需导包。

        //创建StringBuilder的对象
        StringBuilder sb3 = new StringBuilder();
        //表面上调用StringBuilder的空构造器,实际底层是对value数组进行初始化,长度为16
        //System.out.println(sb3); //没赋值,是空的

        StringBuilder sb2 = new StringBuilder(8);
        //表面上调用StringBuilder的有参构造器,传入一个int类型的数,实际底层就是对value数组进行初始化,长度为你传入的数字
        System.out.println(sb2); //没赋值,是空的
        System.out.println(sb2.length()); //length为 0
        //System.out.println(sb2.count);//外部包获取不到count

        StringBuilder sb = new StringBuilder("abc"); //底层较为复杂

        //sb.append("def").append("aaaaaaaa").append("bbb").append("oooooooo");
        System.out.println(sb.append("def").append("aaaaaaaa").append("bbb").append("ooooooo"));
        //链式调用方式:return this

        //sb = sb.append("def").append("aaaa");
        //System.out.println(sb);
    }
}

 4、解释可变和不可变字符串

(1)String —— 不可变

(2)StringBuilder —— 可变

        可变,在StringBuilder 这个对象的地址不变的情况下,想把“abc”变成“abcdef”是可能的,直接追加即可。

代码示例:

package test9_StringBuilder;

public class Test2 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
       /* sb.append("abc");
        System.out.println(sb);
        sb.append("def");
        System.out.println(sb);*/

        System.out.println(sb.append("abc") == sb.append("def")); //true
    }
}

5、常用方法

(1)StringBuilder常用方法

代码示例:

package test9_StringBuilder;

import java.sql.SQLOutput;

public class Test3_methods {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("nihao!");
        //增
        sb.append("I'm zhou.");
        System.out.println(sb);

        //删
        sb.delete(3,6); //删除位置在[3,6)上的字符
        System.out.println(sb);

        sb.deleteCharAt(10);//删除位置在10上的字符
        System.out.println(sb);

        //改 —— 插入
        StringBuilder sb1 = new StringBuilder("aa123bb");
        sb1.insert(3,"@"); //在下标为3的位置上插入
        System.out.println(sb1);

        //改—— 替换
        StringBuilder sb2 = new StringBuilder("112233445566778899");
        //sb2.replace(4,5,"插入成功!"); //在下标[4,5)位置上插入字符串
        sb2.replace(4,14,"插入成功!"); //在下标[4,14)位置上插入字符串
        //注:不管插入位置的长短和插入字符串的长短,
        //直接用待插入的字符串去替换指定位置上的内容
        System.out.println(sb2);

        sb2.setCharAt(2,'!');//替换指定位置上的内容
        System.out.println(sb2);

        //查
        StringBuilder sb3 = new StringBuilder("qwerdf");
        System.out.println(sb3);
        for (int i = 0; i < sb3.length(); i++) {
            System.out.print(sb3.charAt(i)+"\t");
        }//122128110123109111 ??? 原因是用了'\t',应该是"\t".
         // '\t',也即Tab键,ASCII码表对应的是9
        System.out.println();
        System.out.println(sb3.charAt(2));//e
        System.out.println(sb3.charAt(2)+1);//102

        //截取
        String str = sb3.substring(2,4);
        //截取[2,5),返回的是一个新的String,对StringBuilder没有影响
        System.out.println(str);
        System.out.println(sb3);
    }
}

(2)StringBuffer常用方法

   同上,将StringBuilder 改为 StringBuffer即可,可见两者用法几乎一样。

6、String、StringBuffer、StringBuilder区别与联系 

1) String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序 

       列是不可改变的,直至这个对象销毁。

2) StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、

       reverse、setChartAt、setLength等方法改变其内容。一旦生成了最终的字符串,调

       用toString方法将其转变为String。

3) JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相

       同不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性

     能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder

   StringBuilder : JDK1.5 开始      效率高       线程不安全

            StringBuffer  : JDK1.0 开始      效率低       线程安全

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值