package com.wonders.week01.bzl;
/**
* JDK1.7
* StringBuffer类
* (1)final修饰的类
* (2)继承自Object,实现了Serializable CharSequence
* (3)StringBuffer是一个线程安全的,可变的字符序列。StringBuffer和String很类似,但是StringBuffer是可以修改的。
* (4)在任何时候,它都包含一些特定的字符序列.可以通过调用某些方法改变字符序列的内容和长度.
* (5)使用多线程的时候StringBuffer是线程安全的。
* (6)在必要的情况下,这些方法是同步的,以便在任何特定实例上的所有操作都表现为在某种串行顺序中,这与每个涉及的每个线程所调用的方法调用的顺序是一致的
* (7)StringBuffer的基本操作是append和insert方法,它们被重写可以来接收任何的类型的数据。
* (8)每一个将数据转换为有效的字符串,然后把这个字符串追加或者插入到原来字符串的后面。
* (9)append方法是将这些字符串添加到字符串的末尾。insert方法是将字符串插入到某个具体的位置。
* (10)一般来说,如果sb是StringBuffer的一个引用实例,sb.append(x)与sb.insert(sb.length(),x)的效果是相同的
* (11)每当发生涉及源序列的操作(例如从源序列追加或插入)时,这个类只在执行操作的字符串缓冲区上进行同步,而不是在源上同步.
* (12)虽然从多个线程同时使用时,StringBuffer的线程安全的,如果构造函数或追加或插入操作是通过线程共享源序列时,调用代码必须确保操作有一个一致的和不变的源视图操作的时间序列。
* (13)通过使用不可变的源序列,或者不在线程间共享源序列,调用方可以在操作调用期间持有锁.
* (14)每个字符串缓冲区都有一个容量。只要字符串缓冲区中包含的字符序列的长度不超过容量,就不需要分配新的内部缓冲数组。如果内部缓冲区溢出,它会自动变得更大
* (15)除非另有说明,否则将null参数传递给这个类的构造函数或方法将导致抛出一个NullPointerException
* (16)在发布JDK 5的时候,这个类已经得到了一个等价类的补充,这个类被设计用于单个线程,StringBuilder。StringBuilder类通常应该使用于此,因为它支持所有相同的操作,但它更快,因为它不执行同步
* @author liyongyong
*
*/
public class StringBufferTest {
public static void main(String[] args) {
StringBuffer sbBuffer = new StringBuffer("helloworld");
//计算字符的长度
int size = sbBuffer.length();
System.out.println("sbBuffer的长度是 : " + size);
//试图减少用于字符序列的存储。如果缓冲区比必须要容纳它当前的字符序列要大,那么它可以调整大小以提高空间效率。
//调用此方法或许影响后续调用 capacity() 方法返回的值
sbBuffer.trimToSize();
//设置字符序列的长度。序列被更改为一个新的字符序列,其长度由参数指定。对于每一个非负的索引k小于newLength,新字符序列中的下标k的字符与旧序列中k小于旧字符序列的长度的字符相同;
//否则,它就是null字符' \ u0000 '。换句话说,如果newLength参数小于当前长度,那么长度将更改为指定长度
//如果参数newLength大于或者等于当前字符串的长度,便会在字符串追加足够多的null('\u0000')来使得字符串的长度达到参数newLength的长度。
//参数newLength的长度必须大于或者等于0
//如果参数newLength的值是负数,则会抛出异常IndexOutOfBoundsException
sbBuffer.setLength(20);
//返回类型是字符类型,参数是需要得到的字符值的索引。返回值是指定索引对应的字符值
//如果索引是负数或者大于字符串的长度则会抛出异常IndexOutOfBoundsException
//参数index必须大于等于0,小于字符序列的长度。
//如果索引指定的char值是代理,则返回代理值
char value = sbBuffer.charAt(2);
System.out.println("sbBuffer的索引为2的字符是 : " + value);
//返回指定索引处的字符(Unicode值)。索引是指char值(Unicode值),范围从0到length()- 1
//如果给定索引中指定的char值处于高代理范围,则以下索引小于此序列的长度,且在以下索引中的char值处于低代理范围,则返回对应于此代理对的补充代码点。否则,将返回给定索引中的char值
//返回值是:索引中字符的代码点值
int code = sbBuffer.codePointAt(1);
System.out.println("指定索引位置的字符的unicode值是 : " + code);
//返回指定索引之前的字符(Unicode值)。索引是指char值(Unicode值),范围从1到length()。
//如果在(index - 1)上的char值处于低代理范围(index - 2),(index - 2)不为负数,且(index - 2)的char值在高代理范围内,则返回代理对的补充代码点值。
//如果索引- 1中的char值是未配对的低代理或高代理,则返回代理值
//返回指定索引前一个字符的unicode值
int code1 = sbBuffer.codePointBefore(1);
System.out.println("code1 的值是 : " + code1);
//返回指定索引中包含的字符的个数
int code2 = sbBuffer.codePointCount(0, 4);
System.out.println("code2 的数量是 : " + code2);
//在这个序列中返回由codePointOffset代码点对给定索引偏移的索引。索引和codePointOffset给出的文本范围内的未成对代理数作为一个代码点
int offset = sbBuffer.offsetByCodePoints(0, 3);
System.out.println(offset);
//将字符从这个序列复制到目标字符数组dst。第一个被复制的字符是索引srcBegin;要复制的最后一个字符是索引srcend - 1。
//要复制的字符总数是srcend - srcbegin。将字符复制到dst的子数组中,从索引dstBegin开始,以索引结束
//异常:srcBegin或者dstBegin 是负数;srcBegin 大于dstBegin;srcEnd 大于字符串长度;dstBegin+srcEnd-srcBegin大于目标数组的长度。
char[] dst = {'a','b','c','d','e'};
sbBuffer.getChars(0, 3, dst, 1);
//在指定索引处的字符设置为ch。这个序列被更改为表示一个与旧字符序列相同的新字符序列,除了它包含位置索引的字符ch
//索引参数必须大于或等于0,小于该序列的长度
//参数1:要修改的字符的索引
//参数2:新的字符
sbBuffer.setCharAt(0, 'a');
System.out.println("修改以后的字符串是 : " + sbBuffer);
//向字符串后面追加字符
//append方法的参数可以是以下类型:Object,String,StringBuffer,CharSequence,boolean,char[],char,int,long,float,double
StringBuffer sb = new StringBuffer();
sb.append("aaa");
System.out.println("append以后的新字符串是 : " + sb);
//删除这个序列的子字符串中的字符。子字符串从指定的开始处开始,并扩展到索引端- 1的字符,如果没有这样的字符,则将其扩展到序列的末尾。如果start等于end,则不会做出任何更改
//参数1:包含开始的索引字符
//参数2:不包含结束的索引字符
//如果开始的索引是负数或者大于字符序列长度或者大于结束位置索引则抛出StringIndexOutOfBoundsException 异常
sbBuffer.delete(1, 3);
System.out.println("删除以后的字符串是 : " + sbBuffer);
//在这个序列中,删除指定位置的char。
//如果索引为负或大于或等于长度则会抛出异常StringIndexOutOfBoundsException
//参数是要移除的字符的索引
sbBuffer.deleteCharAt(0);
System.out.println("移除sbBuffer索引为0的字符以后的字符序列是 : " + sbBuffer);
//将此序列中的字符替换为指定字符串中的字符。子字符串从指定的开始处开始,并扩展到索引字符长度- 1的字符,如果没有这样的字符,则将其扩展到序列的末尾。
//首先删除子字符串中的字符,然后在开始时插入指定的字符串
//参数1:开始的索引(包含) 参数2:结束的索引(不包含) 参数3:准备替代存在的字符的字符
sbBuffer.replace(1, 3, "@");
System.out.println("替换以后的字符串是 : " + sbBuffer);
//对当前的字符串进行截取,返回一个新的字符串
//参数1:要开始截取的位置索引(包含)
//参数2:停止截取的位置索引(不包含)
StringBuffer bS = new StringBuffer("abcdefghijk");
System.out.println("截取之前的字符串是 : " + bS);
System.out.println("截取以后的字符串是 : " + bS.substring(2));
System.out.println("截取以后的字符串是 : " + bS.substring(3, 5));
//在指定的位置插入数据
//数据类型可以是:Object,String,char[],CharSequence,boolean,char,int,long,float,double
sb.insert(0, "world");
System.out.println("插入后的字符序列是 : " + sb);
//返回该字符在序列中第一次出现的位置索引,如果不存在返回-1
int index = sb.indexOf("a");
System.out.println("a在字符序列中第一次出现的位置索引是 : " + index);
int lastIndex = sb.lastIndexOf("a");
System.out.println("a在字符序列中最后一次出现的位置索引是 : " + lastIndex);
//字符串逆序
System.out.println("字符串sb逆序前是 : " + sb);
System.out.println("字符串sb逆序后是 : " + sb.reverse());
}
}
API学习StringBuffer
最新推荐文章于 2024-02-26 16:56:23 发布