您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
javase第三季学习笔记-StringBuffer类
发布时间:2017-08-10 14:38:11编辑:雪饮阅读()
StringBuffer类引入
在实际开发当中,我们经常会使用到字符串连接的操作,如果用String来操作,则使用”+”号完成字符串的连接操作。
使用String连接字符串,代码性能非常低,因为String的内容不可变(是一个char数组固定长度,当长度不够时就会创建新数组然后把原数组的元素全部转移到新数组,然后废除原数组)。所以每使用一次拼接的操作就会重新创建数组。这就导致性能比较差了。
查看类的源代码:
在类名上按住ctrl然后鼠标点击类名
第一次会报错,资源没有找到:
点击Attach Source可以关联资源
有两种关联资源的方式:
第一种是从工程目录关联
第二种是从外部目录关联
External Fiel:可以选择一个压缩文件(如我们安装jdk后的src.zip)
External Folder:可以选择一个目录(例如src解压了,选择src目录即可)
这个警告可以忽略:
分析StringBuffer发现:
StringBuffer类可以创建可修改的字符串序列。该类有StringBuffer(),StringBuffer(int size),StringBuffer(String s)三个改造方法。
1.StringBuffer()的初始容量可以容纳16个字符,当该对象的实体存放的字符的长度大于16时,实体容量就自动增加。StringBuffer对象可以通过length()方法获取实体中存放的字符序列长度,通过capacity()方法来获取当前实体的实际容量。
2.StringBuffer(int size)可以指定分配给该对象的实体的初始容量参数为参数size指定的字符个数。当该对象的实体存放的字符序列的长度大于size个字符时,实体的容量就自动的增加。以便存放所增加的字符。
3.StringBuffer(String s)可以指定给对象的实体的初始容量为参数字符串s的长度额外再加16个字符。当该对象的实体存放的字符序列长度大于size个字符时,实体的容量自动的增加,以便存放所增加的字符。
接下来介绍StringBuffer()怎样扩容:
扩容算法:
使用append()方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就需要进行扩容:构建新的存储空间更大的字符串,将旧的复制过去;
再进行字符串append添加的时候,会先计算添加后字符串大小,传入一个方法:ensureCapacityInternal 这个方法进行是否扩容的判断,需要扩容就调用expandCapacity方法进行扩容
尝试将新容量扩为大小变成2倍+2 if 判断一下 容量如果不够,直接扩充到需要的容量大小。
StringBuffer常用操作方法
public StringBuffer(CharSequence seq)接收一个字符串序列
示例代码:
package com.vince.stringbuffer;
public class StringBufferDemo {
public static void main(String[] args) {
String s="小白";
//默认字符数组的大小是16
//扩展方式:(原来长度+1)*2(也就是2倍+2)
//默认扩展方式后的长度若小于0则取Integer的最大值为新数组长度
/*
默认扩展方式后的长度若还不足存储新来的字符与原有字符,则直接扩容到真正所需的容量
无论是通过构造方法初次传入的字符还是后面append的都算是新来的,因为如果是初次通过构造方法时字符数组还是空的,将要存储的则为新来的。
append的就没有什么解释的了
*/
//如果我们可以确定整个长度,可以调用带初始容量的构造方法
StringBuffer sb=new StringBuffer();
sb.append(" 正确的时间经历正确的事情。");
sb.append("入江湖天涯仗剑,伴红颜且自逍遥。");
sb.append("宁恋本乡一捻土,莫爱他乡万两金");
//删除指定位置到另一个指定位置的内容
sb.delete(10,20);
System.out.println(sb.toString());
//查询字符串第一次出现的位置
System.out.println(sb.indexOf("剑"));
//从指定位置插入内容
sb.insert(31,"世界上唯一可以不劳而获的就是贫穷,唯一可以无中生有的是梦想。没有哪件事,不动手就可以实现。世界虽然残酷,但总会有路;看不到美好,是因为你没有坚持走下去。人生贵在行动,迟疑不决时,不妨先迈出小小一步。前进不必遗憾,若是美好,叫做精彩;若是糟糕,叫做经历!一起勉励!");
//其实toString可以不用调用的,他会自动toString
System.out.println(sb);
//替换方法.从指定位置到另一个指定位置替换内容
sb.replace(0,2,"人关于每件事情上都已有定论,只不过不能两全才有所犹豫。");
System.out.println(sb);
//字符串反转
sb.reverse();
System.out.println(sb);
//字符串截取(从指定位置到结尾)
System.out.println(sb.substring(20));
//字符串截取(从指定位置到另外一个指定位置)
System.out.println(sb.substring(20,30));
}
}
StringBuffer的兄弟StringBuilder
一个可变的字符序列。此类提供一个与StringBuffer兼容的API(即StringBuffer有的方法,它都有),但不保证同步(此处的同步是指的线程同步)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普通)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快。
StringBuffer:线程安全(需要排队),它的方法修饰符中包含synchronized
StringBuilder:线程不安全,单线程访问时效率更高(该类是jdk1.5后新增的)
关键字词:javase,StringBuffer