常用类--StringBuffer、StringBuilder、Math
3、StringBuffer类
3.1 StringBuffer结构剖析
-
java.lang.StringBuffer 代表可变的字符序列,可以对字符串进行增删
-
很多方法和String相同,但 StringBuffer 是可变长度的
-
StringBuffer 是一个容器

- StringBuffer 的直接父类是 AbstractStringBuilder
- StringBuffer 实现了 Serialzable ,即 StringBuffer 的对象可以串行化
- 在父类中 AbstractStringBuilder 有属性 char[] value,不是final
- 该value 数组存放字符串内容,因此是存放在堆中
- StringBuffer 是一个final类,不能被继承
- 因为StringBuffer 字符内容是存在char[] value,所以在变化(增加/删除)时,不用每次都更换地址(即不是每次创建新对象),所以效率高于 String
String 和 StringBuffer:
- String 保存的是字符串常量,里面的值不能修改,每次String类的更新实际上就是更改地址,效率较低 //private final char value[]
- 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方法,可重载这些方法,以接受任意类型的数据

- StringBuilder 继承 AbstractStringBuilder 类
- 实现了 Serialzable ,说明 StringBuilder 对象是可以串行化的(对象可以网络传输,可以保存到文件)
- StringBuilder 是 final 类,不能被继承
- StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder 的char[] value;因此,字符序列是堆中
- StringBuilder 的方法,没有做互斥处理,即没有 synchronized 关键字,因此在单线程的情况下使用
4.2 StringBuilder的常用方法
String. StringBuffer 和StringBuilder的比较
-
StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且方法
也一样 -
String:不可变字符序列,效率低,但是复用率高(常量池一个hsp可以多个指向它)。
-
StringBuffer:可变字符序列、效率较高(增删)、线程安全
-
StringBuilder:可变字符序列、效率最高、线程不安全
-
String使用注意说明:
string s="a"; //创建了一个字符串s+=“b"://实际上原来的”a”字符串对象已经丢弃了,现在又产生了一个字符串s+“b”(也就是”ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能
=>结论:如果我们对String 做大量修改,不要使用String
-
效率测试: 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 求两个数的最小值

浙公网安备 33010602011771号