java 字符串缓冲区_详解Java中字符串缓冲区StringBuffer类的使用

StringBuffer 是一个线程安全的可变的字符序列。它继承于AbstractStringBuilder,实现了CharSequence接口。

StringBuilder 也是继承于AbstractStringBuilder的子类;但是,StringBuilder和StringBuffer不同,前者是非线程安全的,后者是线程安全的。

StringBuffer 和 CharSequence之间的关系图如下:

85d3a82b0cafc44cc7f321e9e9b12f65.png

StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。

所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。

在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。

但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。

另外由于StringBuffer是线程安全的,关于线程的概念后续有专门的章节进行介绍,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。

0.StringBuffer对象的初始化

StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。

例如:

StringBuffer s = new StringBuffer();

这样初始化出的StringBuffer对象是一个空的对象。

如果需要创建带有内容的StringBuffer对象,则可以使用:

StringBuffer s = new StringBuffer(“abc”);

这样初始化出的StringBuffer对象的内容就是字符串”abc”。

需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:

StringBuffer s = “abc”; //赋值类型不匹配

StringBuffer s = (StringBuffer)”abc”; //不存在继承关系,无法进行强转

StringBuffer对象和String对象之间的互转的代码如下:

String s = “abc”;

StringBuffer sb1 = new StringBuffer(“123”);

StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer

String s1 = sb1.toString(); //StringBuffer转换为String

1.StringBuffer 函数列表

StringBuffer()

StringBuffer(int capacity)

StringBuffer(String string)

StringBuffer(CharSequence cs)

StringBuffer append(boolean b)

StringBuffer append(int i)

StringBuffer append(long l)

StringBuffer append(float f)

StringBuffer append(double d)

synchronized StringBuffer append(char ch)

synchronized StringBuffer append(char[] chars)

synchronized StringBuffer append(char[] chars, int start, int length)

synchronized StringBuffer append(Object obj)

synchronized StringBuffer append(String string)

synchronized StringBuffer append(StringBuffer sb)

synchronized StringBuffer append(CharSequence s)

synchronized StringBuffer append(CharSequence s, int start, int end)

StringBuffer appendCodePoint(int codePoint)

int capacity()

synchronized char charAt(int index)

synchronized int codePointAt(int index)

synchronized int codePointBefore(int index)

synchronized int codePointCount(int beginIndex, int endIndex)

synchronized StringBuffer delete(int start, int end)

synchronized StringBuffer deleteCharAt(int location)

synchronized void ensureCapacity(int min)

synchronized void getChars(int start, int end, char[] buffer, int idx)

synchronized int indexOf(String subString, int start)

int indexOf(String string)

StringBuffer insert(int index, boolean b)

StringBuffer insert(int index, int i)

StringBuffer insert(int index, long l)

StringBuffer insert(int index, float f)

StringBuffer insert(int index, double d)

synchronized StringBuffer insert(int index, char ch)

synchronized StringBuffer insert(int index, char[] chars)

synchronized StringBuffer insert(int index, char[] chars, int start, int length)

synchronized StringBuffer insert(int index, String string)

StringBuffer insert(int index, Object obj)

synchronized StringBuffer insert(int index, CharSequence s)

synchronized StringBuffer insert(int index, CharSequence s, int start, int end)

int lastIndexOf(String string)

synchronized int lastIndexOf(String subString, int start)

int length()

synchronized int offsetByCodePoints(int index, int codePointOffset)

synchronized StringBuffer replace(int start, int end, String string)

synchronized StringBuffer reverse()

synchronized void setCharAt(int index, char ch)

synchronized void setLength(int length)

synchronized CharSequence subSequence(int start, int end)

synchronized String substring(int start)

synchronized String substring(int start, int end)

synchronized String toString()

synchronized void trimToSize()

2. StringBuffer 示例源码如下(StringBufferTest.java):

/**

* StringBuffer 演示程序

*/

import java.util.HashMap;

public class StringBufferTest {

public static void main(String[] args) {

testInsertAPIs() ;

testAppendAPIs() ;

testReplaceAPIs() ;

testDeleteAPIs() ;

testIndexAPIs() ;

testOtherAPIs() ;

}

/**

* StringBuffer 的其它API示例

*/

private static void testOtherAPIs() {

System.out.println("-------------------------------- testOtherAPIs --------------------------------");

StringBuffer sbuilder = new StringBuffer("0123456789");

int cap = sbuilder.capacity();

System.out.printf("cap=%d\n", cap);

char c = sbuilder.charAt(6);

System.out.printf("c=%c\n", c);

char[] carr = new char[4];

sbuilder.getChars(3, 7, carr, 0);

for (int i=0; i

System.out.printf("carr[%d]=%c ", i, carr[i]);

System.out.println();

System.out.println();

}

/**

* StringBuffer 中index相关API演示

*/

private static void testIndexAPIs() {

System.out.println("-------------------------------- testIndexAPIs --------------------------------");

StringBuffer sbuilder = new StringBuffer("abcAbcABCabCaBcAbCaBCabc");

System.out.printf("sbuilder=%s\n", sbuilder);

// 1. 从前往后,找出"bc"第一次出现的位置

System.out.printf("%-30s = %d\n", "sbuilder.indexOf(\"bc\")", sbuilder.indexOf("bc"));

// 2. 从位置5开始,从前往后,找出"bc"第一次出现的位置

System.out.printf("%-30s = %d\n", "sbuilder.indexOf(\"bc\", 5)", sbuilder.indexOf("bc", 5));

// 3. 从后往前,找出"bc"第一次出现的位置

System.out.printf("%-30s = %d\n", "sbuilder.lastIndexOf(\"bc\")", sbuilder.lastIndexOf("bc"));

// 4. 从位置4开始,从后往前,找出"bc"第一次出现的位置

System.out.printf("%-30s = %d\n", "sbuilder.lastIndexOf(\"bc\", 4)", sbuilder.lastIndexOf("bc", 4));

System.out.println();

}

/**

* StringBuffer 的replace()示例

*/

private static void testReplaceAPIs() {

System.out.println("-------------------------------- testReplaceAPIs ------------------------------");

StringBuffer sbuilder;

sbuilder = new StringBuffer("0123456789");

sbuilder.replace(0, 3, "ABCDE");

System.out.printf("sbuilder=%s\n", sbuilder);

sbuilder = new StringBuffer("0123456789");

sbuilder.reverse();

System.out.printf("sbuilder=%s\n", sbuilder);

sbuilder = new StringBuffer("0123456789");

sbuilder.setCharAt(0, 'M');

System.out.printf("sbuilder=%s\n", sbuilder);

System.out.println();

}

/**

* StringBuffer 的delete()示例

*/

private static void testDeleteAPIs() {

System.out.println("-------------------------------- testDeleteAPIs -------------------------------");

StringBuffer sbuilder = new StringBuffer("0123456789");

// 删除位置0的字符,剩余字符是“123456789”。

sbuilder.deleteCharAt(0);

// 删除位置3(包括)到位置6(不包括)之间的字符,剩余字符是“123789”。

sbuilder.delete(3,6);

// 获取sb中从位置1开始的字符串

String str1 = sbuilder.substring(1);

// 获取sb中从位置3(包括)到位置5(不包括)之间的字符串

String str2 = sbuilder.substring(3, 5);

// 获取sb中从位置3(包括)到位置5(不包括)之间的字符串,获取的对象是CharSequence对象,此处转型为String

String str3 = (String)sbuilder.subSequence(3, 5);

System.out.printf("sbuilder=%s\nstr1=%s\nstr2=%s\nstr3=%s\n",

sbuilder, str1, str2, str3);

System.out.println();

}

/**

* StringBuffer 的insert()示例

*/

private static void testInsertAPIs() {

System.out.println("-------------------------------- testInsertAPIs -------------------------------");

StringBuffer sbuilder = new StringBuffer();

// 在位置0处插入字符数组

sbuilder.insert(0, new char[]{'a','b','c','d','e'});

// 在位置0处插入字符数组。0表示字符数组起始位置,3表示长度

sbuilder.insert(0, new char[]{'A','B','C','D','E'}, 0, 3);

// 在位置0处插入float

sbuilder.insert(0, 1.414f);

// 在位置0处插入double

sbuilder.insert(0, 3.14159d);

// 在位置0处插入boolean

sbuilder.insert(0, true);

// 在位置0处插入char

sbuilder.insert(0, '\n');

// 在位置0处插入int

sbuilder.insert(0, 100);

// 在位置0处插入long

sbuilder.insert(0, 12345L);

// 在位置0处插入StringBuilder对象

sbuilder.insert(0, new StringBuffer("StringBuilder"));

// 在位置0处插入StringBuilder对象。6表示被在位置0处插入对象的起始位置(包括),13是结束位置(不包括)

sbuilder.insert(0, new StringBuffer("STRINGBUILDER"), 6, 13);

// 在位置0处插入StringBuffer对象。

sbuilder.insert(0, new StringBuffer("StringBuffer"));

// 在位置0处插入StringBuffer对象。6表示被在位置0处插入对象的起始位置(包括),12是结束位置(不包括)

sbuilder.insert(0, new StringBuffer("STRINGBUFFER"), 6, 12);

// 在位置0处插入String对象。

sbuilder.insert(0, "String");

// 在位置0处插入String对象。1表示被在位置0处插入对象的起始位置(包括),6是结束位置(不包括)

sbuilder.insert(0, "0123456789", 1, 6);

sbuilder.insert(0, '\n');

// 在位置0处插入Object对象。此处以HashMap为例

HashMap map = new HashMap();

map.put("1", "one");

map.put("2", "two");

map.put("3", "three");

sbuilder.insert(0, map);

System.out.printf("%s\n\n", sbuilder);

}

/**

* StringBuffer 的append()示例

*/

private static void testAppendAPIs() {

System.out.println("-------------------------------- testAppendAPIs -------------------------------");

StringBuffer sbuilder = new StringBuffer();

// 追加字符数组

sbuilder.append(new char[]{'a','b','c','d','e'});

// 追加字符数组。0表示字符数组起始位置,3表示长度

sbuilder.append(new char[]{'A','B','C','D','E'}, 0, 3);

// 追加float

sbuilder.append(1.414f);

// 追加double

sbuilder.append(3.14159d);

// 追加boolean

sbuilder.append(true);

// 追加char

sbuilder.append('\n');

// 追加int

sbuilder.append(100);

// 追加long

sbuilder.append(12345L);

// 追加StringBuilder对象

sbuilder.append(new StringBuffer("StringBuilder"));

// 追加StringBuilder对象。6表示被追加对象的起始位置(包括),13是结束位置(不包括)

sbuilder.append(new StringBuffer("STRINGBUILDER"), 6, 13);

// 追加StringBuffer对象。

sbuilder.append(new StringBuffer("StringBuffer"));

// 追加StringBuffer对象。6表示被追加对象的起始位置(包括),12是结束位置(不包括)

sbuilder.append(new StringBuffer("STRINGBUFFER"), 6, 12);

// 追加String对象。

sbuilder.append("String");

// 追加String对象。1表示被追加对象的起始位置(包括),6是结束位置(不包括)

sbuilder.append("0123456789", 1, 6);

sbuilder.append('\n');

// 追加Object对象。此处以HashMap为例

HashMap map = new HashMap();

map.put("1", "one");

map.put("2", "two");

map.put("3", "three");

sbuilder.append(map);

sbuilder.append('\n');

// 追加unicode编码

sbuilder.appendCodePoint(0x5b57); // 0x5b57是“字”的unicode编码

sbuilder.appendCodePoint(0x7b26); // 0x7b26是“符”的unicode编码

sbuilder.appendCodePoint(0x7f16); // 0x7f16是“编”的unicode编码

sbuilder.appendCodePoint(0x7801); // 0x7801是“码”的unicode编码

System.out.printf("%s\n\n", sbuilder);

}

}

运行结果:

-------------------------------- testInsertAPIs -------------------------------

{3=three, 2=two, 1=one}

12345StringBUFFERStringBufferBUILDERStringBuilder12345100

true3.141591.414ABCabcde

-------------------------------- testAppendAPIs -------------------------------

abcdeABC1.4143.14159true

10012345StringBuilderBUILDERStringBufferBUFFERString12345

{3=three, 2=two, 1=one}

字符编码

-------------------------------- testReplaceAPIs ------------------------------

sbuilder=ABCDE3456789

sbuilder=9876543210

sbuilder=M123456789

-------------------------------- testDeleteAPIs -------------------------------

sbuilder=123789

str1=23789

str2=78

str3=78

-------------------------------- testIndexAPIs --------------------------------

sbuilder=abcAbcABCabCaBcAbCaBCabc

sbuilder.indexOf("bc") = 1

sbuilder.indexOf("bc", 5) = 22

sbuilder.lastIndexOf("bc") = 22

sbuilder.lastIndexOf("bc", 4) = 4

-------------------------------- testOtherAPIs --------------------------------

cap=26

c=6

carr[0]=3 carr[1]=4 carr[2]=5 carr[3]=6

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计的实现,以及它们在MATLAB环境的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值