常用类--StringBuffer、StringBuilder、Math

3、StringBuffer类

3.1 StringBuffer结构剖析

  • java.lang.StringBuffer 代表可变的字符序列,可以对字符串进行增删

  • 很多方法和String相同,但 StringBuffer 是可变长度的

  • StringBuffer 是一个容器

![常用类 3.1.1](D:\桌面\博客\picture\常用类 3.1.1.png)

  1. StringBuffer 的直接父类是 AbstractStringBuilder
  2. StringBuffer 实现了 Serialzable ,即 StringBuffer 的对象可以串行化
  3. 在父类中 AbstractStringBuilder 有属性 char[] value,不是final
    • 该value 数组存放字符串内容,因此是存放在堆中
  4. StringBuffer 是一个final类,不能被继承
  5. 因为StringBuffer 字符内容是存在char[] value,所以在变化(增加/删除)时,不用每次都更换地址(即不是每次创建新对象),所以效率高于 String

String 和 StringBuffer

  1. String 保存的是字符串常量,里面的值不能修改,每次String类的更新实际上就是更改地址,效率较低 //private final char value[]
  2. StringBuffer 保存的是字符串变量,里面的值可以修改,每次 StringBuffer 的更新实际上可以更新内容,不用每次更新地址(除非空间不够),效率较高 //char value[],存放在堆里

3.2 StringBuffer构造器及转化

StringBuffer构造器

  • StringBuffer()

    构造一个其中不带字符的字符串缓冲器,其初始容量是16个字符

    StringBuffer stringBuffer = new StringBuffer();
    
  • StringBuffer(CharSequence seq)

    public java.lang.StringBuilder(CharSequence seq) 构造一个字符缓冲区,它包含与指定 CharSequence 相同的字符

  • StringBuffer(int capacity) //capacity[容量]

    构造一个不带字符,但具有指定初始容量的字符串缓冲区。即对 char[] 大小进行指定

    StringBuffer stringBuffer = new StringBuffer(100);
    
  • StringBuffer(String str)

    构造一个字符串缓冲区,并对其内容初始化指定的字符串内容

    char[] 大小就是 str.length+16

    StringBuffer stringBuffer = new StringBuffer("hello");
    

String 和 StringBuffr 相互转换

//String -> StringBuffer
String str = "hello tom";

//方式一:使用构造器
//注意:返回的才是Stringbuffer对象,对str本身没有影响
StringBuffer stringBuffer = new StringBuffer(str);

//方式二:使用append方法
StringBuffer stringBuffer = new StringBuffer();
stringBuffer = stringBuffer.append(str);
//StringBuffer -> String
StringBuffer stringBuffer = new StringBuffer("你好");

//方式一:使用 StringBuffer 的 toString方法
String s = stringBuffer.toString();

//方式二:使用构造器
String s = new String(stringBuffer);

3.3 StringBuffer的常用方法

  • 增 append

    StringBuffer s = new StringBuffer("你好");
    s.append(',').append("我是张三").append(10);   
    
  • 删 delete(start,end)

    删除索引 >=start && <end处的字符,前闭后开

  • 改 replace(start,end,string)

    将索引start----end 间的内容用 string 替换掉,不含end

  • 查 indexOf

    查找子串在字符串第1次出现的索引,如果找不到返回-1

  • 插 insert

    s.insert(9,"赵敏");
    //在索引为9的位置插入“赵敏”,原来索引为9的内容往后
    
  • 获取长度 length

练习:

//以下代码输出什么
String str = null;
StringBuffer sb = new StringBuffer();

//需要看源码,调用的是AbstractStringBuilder的appendNULL
//即如果str为空,sb.append(str)相当于内容为null的字符串数组
sb.append(str);
System.out.println(sb.length());//4

System.out.println(sb);//null

//下面的构造器,会抛出NullpointerException
StringBuffer sb1 = new StringBuffer(str);//看源码,super(str.length()+16)
System.out.println(sb1);

输入商品名和价格名,要求打印效果示例,要求价格的小数点前每三位用逗号间隔

商品名 商品价格

手机 125,564.59

//思路分析:
//1.定义Scanner对象,接收用户输入的(String)
//2.希望使用StringBuffer 的insert,需要将 String 转成StringBuffer
//3.然后使用相关方法
StringBuffer sb = new StringBuffer(price);
int i = sb.lastIndexOf(".");

for(int i = sb.lastIndexOf(".") - 3;i  >0;i -= 3){
    sb = sb.insert(i-3,",");
}

4、StringBuilder类

4.1 StringBuilder结构剖析

  • 是一个可变的字符序列。此类提供了一个与 StringBuffer 兼容的API,但不保证同步(StringBuilder 不是线程安全)。此类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用时。如果可能,请优先采用该类,因为在大多数现实中,比StringBuffer要快

  • StringBuilder 上的主要操作时append和insert方法,可重载这些方法,以接受任意类型的数据

![常用类 4.1.1](D:\桌面\博客\picture\常用类 4.1.1.png)

  1. StringBuilder 继承 AbstractStringBuilder 类
  2. 实现了 Serialzable ,说明 StringBuilder 对象是可以串行化的(对象可以网络传输,可以保存到文件)
  3. StringBuilder 是 final 类,不能被继承
  4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder 的char[] value;因此,字符序列是堆中
  5. StringBuilder 的方法,没有做互斥处理,即没有 synchronized 关键字,因此在单线程的情况下使用

4.2 StringBuilder的常用方法

String. StringBuffer 和StringBuilder的比较

  1. StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且方法
    也一样

  2. String:不可变字符序列,效率低,但是复用率高(常量池一个hsp可以多个指向它)。

  3. StringBuffer:可变字符序列、效率较高(增删)、线程安全

  4. StringBuilder:可变字符序列、效率最高、线程不安全

  5. String使用注意说明:
    string s="a"; //创建了一个字符串

    s+=“b"://实际上原来的”a”字符串对象已经丢弃了,现在又产生了一个字符串s+“b”(也就是”ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能

    =>结论:如果我们对String 做大量修改,不要使用String

  6. 效率测试: StringBuilder > StringBuffer > String

结论:

  • 如果字符串存在大量的修改操作,一般使用 StringBuffer 或StringBuilder
  • 如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
  • 如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
  • 如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等

StringBuilder 和 StringBuffer 均代表可变的字符序列,方法是一样的,所以使用和 StringBuffer 一样

5、Math类

Math类包含用于基本数学运算的基本方法,如初等指数、对数、平方根、三角函数

5.1 Math方法

均是静态方法

  • abs 绝对值

  • pow 求幂

    //求2的四次方
    double pow = Math.pow(2,4);
    
  • ceil 向上取整

  • floor 向下取整

  • round 四舍五入

  • sqrt 求开方

  • random 求随机数

    请写出获取 a-b之间的一个随机整数,a,b均为整数? 比如2 -- 7

    //random 返回的是0 <= x < 1之间的一个随机小数
    
    //分析:
    //1.(int)(a) <= x <= (int)(a + Math.random()*(b - a +1))
    
    int num = (int)(Math.random()*(b-a+1)+a)
    
    
  • max 求两个数的最大值

  • min 求两个数的最小值

posted @ 2025-08-21 17:12  lu璐  阅读(6)  评论(0)    收藏  举报