黑马程序员——字符串3:操作字符串的其他类

------- android培训java培训、期待与您交流! ----------

1. StringBuffer类及其方法介绍

        Buffer的意思是缓冲区,大家可以把它理解为一个盛放字符串的容器。相对于字符串对象的不变性,StringBuffer类最大的特点是可以对字符串对象进行修改。我们可以将StringBuffer类中的方法概括为四类:存储、删除、获取、修改,并且这也是所有容器的共性方法,尤其会在后面说到的集合框架中有更明显地体现。下面我们就按照上述顺序介绍这四类方法。

1.1 存储

1.1.1 将数据添加到容器末尾

StringBuffer append(数据):该方法的作用是将指定的数据添加到StringBuffer容器中的末尾。该类定义了很多append方法的重载形式,可以存储几乎所有的基本数据类型变量以及其他对象。注意到该方法的返回值类型就是StringBuffer。

代码演示,

代码1:

class StringBufferDemo
{
	public static void main(String[] args)
	{
		StringBuffer sb1 = new StringBuffer();
		//向sb1中存入字符串,并令sb2指向该方法返回的StringBuffer对象
		StringBuffer sb2 = sb1.append("Hello World!");
 
		//判断sb1和sb2是否指向同一个对象
		System.out.println("sb1== sb2 ? "+(sb1 == sb2));
		System.out.println(sb1.toString());
		System.out.println(sb2.toString());
	}
}
运行结果为:

sb1 == sb2 ? true

Hello World!

Hello World!

        从结果来看,调用append方法返回的StringBuffer对象,就是调用该方法的sb1对象本身,也就是说sb1和sb2指向的是堆内存中的同一个对象。不论对一个StringBuffer对象进行怎样的操作(添加、删除、修改),其返回的总是同一个对象。因此,我们可以定义一个所谓的方法调用链,就像下面的代码,

代码2:

class StringBufferDemo2
{
	public static void main(String[] args)
	{
		StringBuffer sb = new StringBuffer();
		//方法调用链
		sb.append('J').append('a').append('v').append('a');
		System.out.println(sb.toString());
	}
}
运行结果为:                            

Java

上述结果就体现了,每次都将指定数据添加到容器的末尾。

1.1.2 将数据添加到容器的指定位置

StringBuffer insert(int offset, 数据):相较于append方法将数据默认添加到容器的末尾,该方法可以指定数据存储的位置,offset就表示数据存储位置的角标值。该方法返回的依然是该StringBuffer对象。

代码演示,

代码2:

class StringBufferDemo3
{
	public static void main(String[] args)
	{
		StringBuffer sb = new StringBuffer("abccba");
		sb.insert(3,"123321");
		System.out.println(sb.toString());
	}
}
运行结果为:

abc123321cba

调用该方法时要注意,如果指定的角标值超过了StringBuffer对象中存储的字符串长度,将会抛出StringIndexOutOfBoundsException,当然诸如负数的非法角标值也是同理。

1.2 删除

1.2.1 删除指定角标区间的字符

StringBuffer delete(int start, int end):删除指定头尾角标之间的字符,同样是包含头,不包含尾。其中start表示头角标值,end表示尾角标值,但在传递参数时,应在实际尾角标值上加1。同样,调用该方法还是返回该StringBuffer对象。当start值等于end值时,相当于不进行任何操作,但当start值为负、大于容器长度,或者小于end值时,将抛出StringIndexOutOfBoundsException异常。

1.2.2 删除指定角标位上的字符

StringBuffer deleteCharAt(int index):删除指定角标位上的字符。返回值同上。该方法的原理其实就是delete(index, index+1),由于包含头,不包含尾,所以只删除index角标值对应的字符。

代码演示,

代码3:

class StringBufferDemo4
{
	public static void main(String[] args)
	{
		StringBuffer sb = new StringBuffer("012345");
		//删除指定角标区间的字符
		System.out.println(sb.delete(2,4));
		//删除指定角标位上的字符
		System.out.println(sb.deleteCharAt(3));
 
		//清空缓冲区,删除0到尾角标之间所有的字符
		System.out.println("缓冲区中的内容:"+sb.delete(0,sb.length()).toString());
	}
}
运行结果为:

0145

014

缓冲区中的内容:()

第二行代码的运行结果体现了包含头不包含尾的特点。第四行代码中调用了length()方法,与String类的length()方法是相同的,返回StringBuffer容器中字符的长度。

1.3 获取

以下方法的使用及作用与String类完全相同,因此不再赘述,大家可以自行查阅API文档。

char charAt(int index)

int indexOf(String str)

int indexOf(String str, int fromIndex)

int lastIndexOf(String str)

int lastIndexOf(String str, int fromIndex)

int length()

String substring(int start):使用方法和作用与String类相同,但是要注意返回值类型是String,而不是StringBuffer。

String substring(int start, int end):同上。

1.4 修改(替换)

1.4.1 将指定角标区间内的字符替换为指定字符串

StringBuffer replace(int start, int end,String str):该方法与String类不同,是将指定角标区间内的字符替换为指定字符,并且返回的还是该StringBuffer对象。注意,同样是包含头,不包含尾。

1.4.2 替换指定角标位上的字符

void setCharAt(int index, char ch):将指定角标位上的字符替换为指定字符。注意,该方法不同于replace,返回值类型为void。

代码演示,

代码4:

class StringBufferDemo5
{
	public static void main(String[] args)
	{
		StringBuffer sb = new StringBuffer("Hello World!");
             
		//将“World”,替换为“Java”
		sb.replace(6,11, "Java");
		System.out.println(sb.toString());
 
		//将空格替换为$
		sb.setCharAt(5,'_');
		System.out.println(sb.toString());
	}
}
运行结果为:

Hello Java!

Hello_Java!

1.5 反转

1.5.1 将容器中的字符顺序进行反转

StringBuffer reverse():将容器中的字符顺序进行反转。该方法返回的同样是该StringBuffer对象。

代码演示,

代码5:

class StringBufferDemo6
{
	public static void main(String[] args)
	{
		StringBuffer sb = new StringBuffer("12345");
 
		//反转
		sb.reverse();
		System.out.println(sb.toString());
	}
}
运行结果为:

54321

1.6 复制字符

void getChars(int srcBegin, int srcEnd, char[]dst, int dstBegin):将容器中srcBegin到srcEnd角标区间的字符复制到目标字符数组dst,粘贴起始角标为dstBegin。注意这里同样要遵守包含头,不包含尾的规则,因此srcEnd值要比实际角标值大1。如果srcBegin为负、dstBegin为负、srcBegin参数大于srcEnd参数、srcEnd大于容器长度或者dstBegin+srcEnd-srcBegin大于字符数组的长度,都将会抛出IndexOutOfBoundsException。此外,如果dstBegin指向为空,将会抛出NullPointerException异常。

代码演示,

代码6:

class StringBufferDemo7
{
	public static void main(String[] args)
	{
		StringBuffer sb = new StringBuffer("Hello World!");
		char[] arr = new char[7];
 
		//将“Hello”复制到目标字符数组中,并从1号角标开始粘贴
		sb.getChars(0,5, arr, 1);
		printArray(arr);            
	}
	public static void printArray(char[] arr)
	{
		System.out.print('[');
		for(int x = 0; x<arr.length; x++)
		{
			if(x != arr.length-1)
				System.out.print(arr[x]+",");
			else
			{
				System.out.println(arr[x]+"]");
				break;
			}
		}
	}
}
运行结果为:

[ ,H,e,l,l,o, ]

1.7 StringBuffer类特点总结

通过上述四类方法的介绍,我们可以总结StringBuffer类的特点:

特点一:长度可变。这是相对于String对象而言的。

特定二:可以直接操作多种数据类型,包括基本数据类型变量和引用数据类型变量。

特点三:最终可以通过toString方法,将存储于StringBuffer对象中的数据转换为字符串返回。

通常,在不确定数据类型和数据长度的情况下,通过StringBuffer对象操作字符串是最为方便的。

2. StringBuilder类及其方法介绍

       StringBuilder类是在JDK1.5版本是出现的新的字符串容器类。API文档中对该类的描述如下:一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步。我们再来看StringBuffer类API文档的第一句话:线程安全的可变字符序列。也就是说这两个类在功能上完全相同,而唯一的不同之处在于,StringBuffer线程同步,而StringBuilder线程不同步,这直接导致了StringBuilder对字符串的操作速度快于StringBuffer。

       因此,为了方便大家在这两个类中进行取舍,StringBuilder类的API文档告诉我们:该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快。将StringBuilder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer。

 

小知识点1:

Java语言版本的升级主要围绕以下三个方面展开:

1. 提高代码的执行效率。

2. 简化代码的书写。

3. 提高安全性。

如果以StringBuilder为例,那么该类的出现主要就是为了提高代码的执行效率,但是是以牺牲安全性为前提的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值