java学习笔记(三十三)

 

1.1  认识StringBuffer

   StringBuffer是使用缓冲区的,本身也是操作字符串的,但是

与string类不同的是,string类的内容一旦声明以后不可以改变

,改变的只是其内存地址的指向,而StringBuffer中的内容是可

以改变的。

对于StringBuffer,本身是一个具体的操作类,所以不能String类

那样采用直接赋值的方法进行对象实例化,必须通过构造方法调

用。


当一个字符串的内容需要经常改变的时候,就需要使

StringBuffer

 

public final class StringBufferextends Objectimplements

Serializable, CharSequence


线程安全的可变字符序列。一个类似于 String 的字符串缓冲区

,但不能修改。虽然在任意时间点上它都包含某种特定的字符序

列,但通过某些方法调用可以改变该序列的长度和内容。

可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方

法进行同步,因此任意特定实例上的所有操作就好像是以串行顺

序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致

StringBuffer 上的主要操作是 append 和 insert 方法,可重载

这些方法,以接受任意类型的数据。每个方法都能有效地将给定

的数据转换成字符串,然后将该字符串的字符追加或插入到字符

串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;

而 insert 方法则在指定的点添加字符。

例如,如果 z 引用一个当前内容为 "start" 的字符串缓冲区对

象,则此方法调用 z.append("le") 会使字符串缓冲区包含

"startle",而 z.insert(4, "le") 将更改字符串缓冲区,使之

包含 "starlet"。

通常,如果 sb 引用 StringBuilder 的一个实例,则

sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果

当发生与源序列有关的操作(如源序列中的追加或插入操作)时

,该类只在执行此操作的字符串缓冲区上而不是在源上实现同步

每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的

字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数

组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,

为该类补充了一个单个线程使用的等价类,即 StringBuilder。

与该类相比,通常应该优先使用 StringBuilder 类,因为它支持

所有相同的操作,但由于它不执行同步,所以速度更快。

 

1.2  StringBuffer \\ append()方法:字符串连接操作


append()方法:字符串连接操作

在 StringBuffer中提供了一系列的append()方法,观察之:

(注意:这些方法最终都会返回StringBuffer类的实例化对象)

 

public class StringBufferDemo01
{
 public static void main(String args[]){
 StringBuffer buf = new StringBuffer();
 buf.append("hello");
 buf.append("hello").append("!!");
 buf.append("\n");
 buf.append(true);
 buf.append("\n");
 buf.append("fhkdf");
 System.out.println(buf);//调用tostring()方法
 }
}

 

实例二
:public class StringBufferDemo02
{
 public static void main(String args[]){
 StringBuffer buf = new StringBuffer();
 buf.append("hello");
 fun(buf);
 System.out.println(buf);//调用tostring()方法
 
 }
 public static void fun(StringBuffer s){
 s.append("worlsd").append("sdfks");
 }
}

 

结果:

F:\java\stringbuffer>javac StringBufferDemo02.java

F:\java\stringbuffer>java StringBufferDemo02
helloworlsdsdfks

从以上实例可以看出:StringBuffer的内容是可以改变的。


1.3 StringBuffer:实例操作:在任意位置处为StringBuffer添

加内容。


public StringBuffer insert(int offset, boolean b)


实例:

public class StringBufferDemo02
{
 public static void main(String args[]){
 StringBuffer buf = new StringBuffer();
 buf.append("hello");
 buf.insert(1,"licaho ");
 buf.insert(buf.length(),"!!!!");
 System.out.println(buf);//调用tostring()方法
 
 }
 
}

 

在StringBuffer中与string非常相似的是都可以使用length方法

求出字符串长度。

 


1.4 字符串反转操作  public StringBuffer reverse()


将此字符序列用其反转形式取代。如果序列中存在代理项对

(surrogate pair),在 reverse 操作中将其作为单个字符处理。

因此,高-低代理项的顺序不会反转。假设 n 为执行 reverse 方

法前此字符序列的字符长度(并非 char 值的长度),则新字符

序列中索引 k 处的字符将等于原字符序列索引 n-k-1 处的字符


注意,进行 reverse 操作后,执行操作前未成对的低代理项和高

代理项将成为代理项对。例如,反转 "\uDC00\uD800" 将生成有

效的代理项对 "\uD800\uDC00"。


返回:
此对象的一个引用。


实例:

public class StringBufferDemo02
{
 public static void main(String args[]){
 StringBuffer buf = new StringBuffer();
 buf.append("world");
 buf.insert(0,"hello ");
 buf.insert(buf.length(),"!!!!");
 //buf.reverse();
 String str = buf.reverse().toString();//将内容反

转后变为String类型
 System.out.println(str);//调用tostring()方法
 
 }
 
}

 

1.5  替换指定范围的内容 

public StringBuffer replace(int start,int end,String str)


使用给定 String 中的字符替换此序列的子字符串中的字符。该

子字符串从指定的 start 处开始,一直到索引 end - 1 处的字

符,如果不存在这种字符,则一直到序列尾部。先将子字符串中

的字符移除,然后将指定的 String 插入 start。(如果需要,

序列将延长以适应指定的字符串。)

参数:
start - 起始索引(包含)。
end - 结束索引(不包含)。
str - 将替换原有内容的字符串。
返回:
此对象。
抛出:
StringIndexOutOfBoundsException - 如果 start 为负、大于

length() 或大于 end。

实例:

public class StringBufferDemo02
{
 public static void main(String args[]){
 StringBuffer buf = new StringBuffer();
 buf.append("hello ").append("world!!");
 buf.replace(6,11,"liuchao");
 System.out.println(buf);//调用tostring()方法
 
 }
 
}

 

1.6 字符串截取  public String substring(int start)


返回一个新的 String,它包含此字符序列当前所包含的字符子序

列。该子字符串始于指定索引处的字符,一直到此字符串末尾。

参数:
start - 起始索引(包含)。
返回:
新的字符串。
抛出:
StringIndexOutOfBoundsException - 如果 start 小于 0,或大

于此对象的长度。

 


实例:

public class StringBufferDemo02
{
 public static void main(String args[]){
 StringBuffer buf = new StringBuffer();
 buf.append("hello ").append("world!!");
 buf.replace(6,11,"liuchao");
 String str = buf.substring(0,7);
 System.out.println(str);//调用tostring()方法
 
 }
 
}


1.7  删除字符串  public StringBuffer delete(int start,int

end)


移除此序列的子字符串中的字符。该子字符串从指定的 start 处

开始,一直到索引 end - 1 处的字符,如果不存在这种字符,则

一直到序列尾部。如果 start 等于 end,则不发生任何更改。

参数:
start - 起始索引(包含)。
end - 结束索引(不包含)。
返回:
此对象。
抛出:
StringIndexOutOfBoundsException - 如果 start 为负、大于

length() 或大于 end。

 

实例:

public class StringBufferDemo02
{
 public static void main(String args[]){
 StringBuffer buf = new StringBuffer();
 buf.append("hello ").append("world!!");
 buf.replace(6,11,"liuchao");
 //String str = buf.substring(0,7);
 buf.delete(0,7);
 System.out.println(buf);//调用tostring()方法
 
 }
 
}


1.8 查找指定内容  indexOf


public int indexOf(String str,
                   int fromIndex)从指定的索引处开始,返回

第一次出现的指定子字符串在该字符串中的索引。返回的整数是

满足以下条件的最小 k 值:
     k >= Math.min(fromIndex, str.length()) &&
                   this.toString().startsWith(str, k)
 如果不存在这样的 k 值,则返回 -1。

参数:
str - 要搜索的子字符串。
fromIndex - 搜索开始处的索引。
返回:
从指定的索引处开始,返回第一次出现的指定子字符串在该字符

串中的索引。
抛出:
NullPointerException - 如果 str 为 null。

 

实例:

public class StringBufferDemo02
{
 public static void main(String args[]){
 StringBuffer buf = new StringBuffer();
 buf.append("hello ").append("world!!");
 if(buf.indexOf("hello")== -1){
 System.out.println("no");
 }
 else {
 System.out.println("yes");
 }
 //System.out.println(buf);//调用tostring()方法
 
 }
 
}

 

public class StringBufferDemo02
{
 public static void main(String args[]){
 StringBuffer buf = new StringBuffer();
 buf.append("hello");
 //String str = "hello";
 for(int i = 0;i < 100;i++){
 buf.append(i);
 }
 System.out.println(buf);
 
 }
 
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值