StringBuffer类

StringBuffer基本介绍

  1. StringBuff代表可变的字符串,可以对字符串内容进行增删
  2. 很多方法与String相同,但StringBuff是可变长度的
  3. StringBuff是一个容器

了解StringBuffer

StringBuffer的继承关系:
在这里插入图片描述
可以看到StringBuffer继承AbstractStringBuilder类。

  1. StringBuffer的直接父类是AbstractStringBuilder
  2. StringBuffer实现了Serializable接口,使它的对象可以串行化
  3. 在AbstractStringBuilder父类中有属性char[] value,与String不同他不是final修饰的。所以这个属性是指向堆的,不是跟String一样指向常量池的
  4. StringBuffer是一个final类,不能杯继承
  5. 因为StringBuffer字符串是存在char[] value堆中的,所以所有的变化(增加/删除),不用跟String一样每次都要变换地址和创建新对象,所以效率上高于String

StringBuffer和String的区别

首先最大的区别是保存字符串的空间不一样:
String:private final char [] valur;//指向常量池
StringBuffer:private char [] valur;//指向堆

那么这两者有什么区别呢?通过前面的String类的学习,了解到String类的字符串每当要改变内容时会直接在常量池中寻找有没有,有就直接改变地址指向新内容。如果没有就创建新内容然后指向它。不管那种方式都是会改变指向地址的

而StringBuffer因为不是final修饰所以,就是一个普通的char数组。而数组是保存在堆中的,属于引用类型,可以随意更改在堆中的内容,且地址不会变。除非数组空间满了需要扩容才会更换地址。

示意图演示:

String字符串更改内容

String s1 = new String("123")
s1 = "567";

在这里插入图片描述

StringBuffer更改内容

StringBuffer s1 = new StringBuffer("abc")
s1 = "bbc";

在这里插入图片描述

StringBuffer的构造器

  1. StringBuffer():无参构造器,使初始value数组空间容量为16个字符
  2. StringBuffer(CharSequence seq):构造一个字符串缓冲区,它包含与指定CharSequence 相同的字符
  3. StringBuffer(int capacity):传入一个int类型,定义value数组的空间容量
  4. StringBuffer(String str):直接传入一个String类型,保存到value数组,且在这个基础上再+16的字符空间容量

StringBuffer与String的互相转换

String转StringBuffer
第一种:使用构造器,直接传入

String s1 = "qqq";
StringBuffer s2 = new StringBuffer(s1);

第二种:使用StringBuff的append方法

String s1 = "qqq";
StringBuffer s2 = new StringBuffer();
s2 = s2.append(s1);

StringBuffer转String
第一种:使用StringBuffer的toString方法

StringBuffer s1 = "qqq";
String s2 = new String();
s2 = s1.toString();

第二种:使用构造器直接传入

StringBuffer s1 = "qqq";
String s2 = new String(s1);

StringBuffer的常用方法

  1. append:在字符串后增加内容
  2. delete(start,end):删除下标start到下标end前的内容
  3. replace(start,end,string):将下标start到下标end前的内容替换成string
  4. indexOf:查找子串第一次出现的下标
  5. insert(int,string):在下标int前插入string新内容,原内容后移
  6. length:字符串长度

StringBuffer练习题

1.输出什么?为什么

String str =null;
StringBuffer sb = new StringBuffer();
sb.append(str);
System.out.println(sb.length());
System.out.println(sb);
StringBUffer sb2 = new StringBuffer(str);
System.out.println(sb2);

运行:
1.首先输出长度,此时sb是null,调用append,底层最后会使用一个父类的appendNull的方法,把null变成’n’u’l’l’4个字.符存入value,所以长度是4
2.然后输出sb sb是null
3.将str通过构造器传入sb2,而StringBuffer传入string类型的构造器,需要先获取这个string的长度,但是此时str是null所以会报空指针异常:NullPointerException

2.编程题
要求实现输入的数字小数点开始,往前梅隔3位数,就插入一个逗号“,”
比如:123445.22 变成 123,445.22

思路分析:
1.获取输入的数字,转成StringBuffer类型
2.根据小数点,使用lastIndexOf方法找出小数点的下标
3.根据小数点的小标以3为界使用insert方法插入“,”

public class test1 {
    public static void main(String[] args) {
       String num = "2234323423423424567.23";
       StringBuffer sb = new StringBuffer(num);
        for (int i = sb.lastIndexOf(".")-3; i > 0; i-=3) {
            sb.insert(i,",");
        }
        System.out.println(sb);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值