String和StringBuffer类中一些需要注意的方法

本文深入探讨了StringBuffer类的常见方法,包括插入、删除、查找、修改、反转和子字符串操作。通过实例展示了每种方法的具体作用及注意事项,对比了String与StringBuffer在操作上的关键差异。

StringBuffer类中常见的方法如下:总结有如下操作(增,删,查,改,翻转,字串)

方法

说明

StringBuffer insert(String s)在指定位置插入字符串
int length()确定StringBuffer对象的长度
void setCharAt(int pos,char ch) 使用ch指定的新值设置pos指定位置上的字符
String toString()转换为字符串形式
StringBuffer reverse()将字符串反转也就是倒叙
StringBuffer delete(int start,int end)删除start到end-1位置的字符串
StringBuffer deleteCharAt(int pos)删除pos索引指定处字符
StringBuffer replace(int start,int end,String s)使用s替换指定位置上的字符串,从start开始到end结束

 

 

 

 

 

 

 

 

 

 

接下来我们举例这些方法的作用,其中有一些特别注意的地方

    String s1="abczdefgcc";//定义一个字符串s1
	System.out.println(s1.toUpperCase());//将字符串全部转换为大写
	System.out.println(s1.startsWith("abcs"));//判断是不是以"abcs"开始,结果返回Boolean值
	System.out.println(s1.endsWith("defgcc"));//判断是不是以"abcs"结束,结果返回Boolean值

	/*s1.replace("c", "z");特别注意这里,这里的replace只是临时的改变了String的值,并没有实际 
    改变s1的值,只要记住String几乎不可变就可以*/

	System.out.println(s1.replace("c", "z"));//这里输出的是abzzdefgzz
	
    //这里输出的结果依然是"abczdefgcc"而对于StringBuffer则会有不一样的结果
    s1.replace("z", "c");
	System.out.println(s1);

    //定义一个StringBuffer对象s3
	StringBuffer s3 = new StringBuffer("中国");//初始化s3为"中国"
	s3.append("美");// 则s3为"中国美"。实际上s3的值已经改变
	// 转换为不变字符串:toString()。
	System.out.println(s3.toString());//输出的结果是"中国美"

    //构造一个s4对象为StringBuffer类并且初始化值为"abcdefgh"
	StringBuffer s4 = new StringBuffer("abcdefgh");
	System.out.println(s4.length());  //s4的长度为8
	System.out.println(s4.capacity());//8+16   因为StringBuffer后面预留了16个字节的容量
	// 字符串反转
	s4.reverse();
	System.out.println(s4.toString());//输出的结果是"hgfedcba"
	// 删除指定字符串着中的字符
	// delete(int start,int end)
	StringBuffer s5 = new StringBuffer("Hello");
	s5.delete(0, s5.length()); // 删除字符串s的全部字符
	System.out.println(s5.toString());//输出为空
		        
	// deleteCharAt(int index)
	StringBuffer s6 = new StringBuffer("Hello");
	s6.deleteCharAt(4); // 删除字符串s索引为4的字符由于是从0开始计算,所以第4个字符是'o'
	System.out.println(s6.toString());//输出为"Hell"
	System.out.println(s6);//输出为"Hell"
	s6.toString();

	// 替换字符串
	// replace(int start,int end,String str)
	StringBuffer s7 = new StringBuffer("Hello");
	s7.replace(0, 3, "qqq");//意思是从0号开始,替换3个字符所以"Hel"被替换
	System.out.println(s7.toString());//输出结果是qqqlo

	// substring(int start) //返回从start下标开始以后的字符串
	StringBuffer s8 = new StringBuffer("Hello");

	s8.substring(2);//这里的语句执行之后并没有改变s8的值下面是输出结果
	System.out.println(s8.toString());//输出结果是"Hello"
	System.out.println(s8.substring(1));//输出结果是"ello",从这里可以看出数字1是截取前1个字符
    System.out.println(s8.substring(2));//输出结果是"llo",从这里可以看出数字2是截取前2个字符

		        
	// substring(int start,int end) //返回从start到 end-1字符串
	StringBuffer s9 = new StringBuffer("Hello");
	s9.substring(2,3);
	System.out.println(s9.toString());//输出结果是Hello
	System.out.println(s9.substring(2,4));//输出结果是ll
		

 

String和StringBuffer的几点区别

1.String一般来说对象的值是固定不变的对于一些操作方法也只是临时的改变了并没有实质性改变

   StringBuffer几乎所有的操作都是对对象的值进行修改所以StringBuffer 用于表示可以修改的字符串

2.对于Stringbuffer中subString来说这个方法并没有实质性的改构造对象的值与String类似

 

String的不变性

当字符串string在内存中创建后,就不会再改变,所以对该字符串进行的所有改变操作,实际上都没有改变原来的字符串,你可以参考一下我们第一节,不过我们调用了原始的String的多少个方法,其实对原来的字符都不会有任何改变,都是重新生成一个新的字符串作为返回值,这就是所谓的Java String的不变性。

每一次的修改操作都会生成一个新的字符串,有一个不好的点——慢慢地消耗了内存,对GC来说也是非常费时的一件事,效率非常低,所以如果我们需要多次改变创建的字符串的话,那么使用String将会是个很不好的选择。

String与StringBuffer的区别

真是因为String是的不变性,StringBuffer或者StringBuilder就有他们的用武之地了,当然String有它的优点,就是使用方便,我们如何做出选择呢?一般如果字符串经常要做出修改,比如经常要拼接,删除等等,那么使用StringBuffer或者StringBuilder比较好,你可以在完成操作后使用toString方法转换为String类。

<think>首先,用户的问题是:“我想了解StringBuffer的常用方法及其与String的区别 请问Java StringBuffer常用方法介绍 及其与String的区别”。所以,我需要基于系统指令来回答。 系统指令的关键点: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用:提供了几个引用,我需要整合这些信息。 用户提供的引用: - [^1]: 关于StringBuffer添加null值的方法。 - [^2]: StringBufferStringBuilder的使用示例。 - [^3]: StringBuffer是可变的,字符数组在堆中。 - [^4]: String方法比较。 - [^5]: StringBuffer的常用方法String的区别。 我的回答结构: 1. **介绍StringBuffer**:简要解释什么是StringBuffer。 2. **StringBuffer的常用方法**:列出并解释主要方法,如append、insert、delete、reverse等,基于引用[^2][^5]。 3. **与String的区别**:对比StringStringBuffer,强调String是不可变的,StringBuffer是可变的,基于引用[^3][^4]。 4. **示例代码**:提供一个简单的Java代码示例来演示方法使用,参考引用[^2]。 5. **生成相关问题**:在末尾添加相关问题,如§§相关问题§§部分。 在回答中,我需要自然地添加引用标识。例如,当提到某个点来自引用时,在末尾添加[^n]。 由于没有数学表达式,我可以避免使用LaTeX,但如果有数字或公式,我会用$...$。但在这个主题中,可能不需要。 确保使用中文。 最终回答结构: - 开头:直接回答问题。 - 主体: - StringBuffer介绍。 - 常用方法列表。 - 与String的区别。 - 代码示例。 - 结尾:相关问题。 生成相关问题: - 基于主题,如性能优化、应用场景等。</think>### Java StringBuffer常用方法介绍及其与String的区别 在Java中,`StringBuffer`是一个可变的字符串序列,常用于需要频繁修改字符串的场景。与`String`不同,`StringBuffer`允许直接修改内容而不创建新对象,从而提高效率。下面我将逐步介绍其常用方法、与`String`的区别,并提供代码示例。 #### 1. StringBuffer的常用方法 `StringBuffer`提供了一系列方法来操作字符串内容。以下是最常用的方法(基于引用[^2][^5]): - **append()**:在字符串末尾追加内容(如字符串、字符或对象)。例如,`sb.append("World")`会将"World"添加到当前字符串后。 - **insert()**:在指定位置插入内容。语法为`insert(int offset, String str)`,其中`offset`是插入位置索引。例如,`sb.insert(5, " my")`在索引5处插入" my"。 - **delete()**:删除指定范围的字符。语法为`delete(int start, int end)`,删除从`start`到`end-1`的字符。例如,`sb.delete(5, 8)`删除索引5到7的字符。 - **deleteCharAt()**:删除指定索引的单个字符。例如,`sb.deleteCharAt(5)`删除索引5处的字符。 - **reverse()**:反转整个字符串。例如,`sb.reverse()`会将"Hello"变为"olleH"。 - **toString()**:将`StringBuffer`对象转换为不可变的`String`对象。例如,`String str = sb.toString()`用于获取最终字符串。 - **setLength()**:设置字符串长度。如果新长度小于当前长度,会截断字符串;如果大于,会用空字符填充(基于引用[^5])。 - **capacity()** **ensureCapacity()**:管理内部缓冲区大小,避免频繁扩容(基于引用[^3])。 这些方法都直接修改原对象,而不是创建新对象,这使得`StringBuffer`在字符串拼接或修改时更高效[^3]。 #### 2. StringBufferString的区别 `String``StringBuffer`在Java中处理字符串的方式有本质差异: - **不可变 vs 可变**: - `String`是不可变的:一旦创建,内容不能修改。任何操作(如拼接或替换)都会创建一个新对象,导致内存开销性能问题。例如: ```java String s1 = "Hello"; s1 = s1 + " World"; // 创建新对象,原对象被丢弃 ``` - `StringBuffer`是可变的:内部使用字符数组(在堆中存储),允许就地修改内容。操作如`append()`或`insert()`直接更新数组,不创建新对象(基于引用[^3])。例如: ```java StringBuffer sb = new StringBuffer("Hello"); sb.append(" World"); // 直接修改原对象 ``` 这使得`StringBuffer`在循环或频繁修改时更高效[^5]。 - **性能比较**: - `String`在少量操作时简单易用,但大量拼接(如循环中)会生成大量中间对象,降低性能。 - `StringBuffer`适用于高并发场景,因为它是线程安全的(方法使用`synchronized`修饰),但可能略有性能损耗。相比之下,`StringBuilder`(非线程安全)在单线程下更快(基于引用[^2])。 - **内存管理**: - `String`对象存储在字符串常量池中,重复内容可能共享内存。 - `StringBuffer`对象存储在堆中,每次修改都更新内部数组,避免冗余对象(基于引用[^3])。 - **方法差异**: - `String`提供如`substring()`、`equals()`等方法,侧重于查询比较。 - `StringBuffer`提供如`append()`、`insert()`等方法,侧重于修改操作(基于引用[^4])。 #### 3. 代码示例 以下Java代码演示了`StringBuffer`的基本使用(参考引用[^2]): ```java public class StringBufferExample { public static void main(String[] args) { // 创建StringBuffer对象 StringBuffer sb = new StringBuffer(); // 添加字符串 sb.append("Hello"); sb.append(" "); sb.append("World"); System.out.println("After append: " + sb.toString()); // 输出: Hello World // 在索引5处插入字符串 sb.insert(5, " my"); System.out.println("After insert: " + sb.toString()); // 输出: Hello my World // 删除索引5处的字符 sb.deleteCharAt(5); System.out.println("After deleteCharAt: " + sb.toString()); // 输出: Hellomy World // 反转字符串 sb.reverse(); System.out.println("After reverse: " + sb.toString()); // 输出: dlroW ymolleH // 转换为String对象 String result = sb.toString(); System.out.println("Final String: " + result); } } ``` 注意:在处理`null`值时,`append()`方法会自动将`null`转换为字符串"null",避免错误(基于引用[^1])。例如: ```java String str = null; StringBuffer sb = new StringBuffer(); sb.append(str); // 安全添加,结果为"null" ``` #### 总结 - **使用场景**:优先用`String`用于只读字符串;用`StringBuffer`用于多线程环境下的频繁修改;单线程下用`StringBuilder`更高效[^2][^5]。 - **关键区别**:`String`的不可变性确保安全但低效;`StringBuffer`的可变性提升性能但需注意线程安全。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值