String 和 StringBuffer 的区别(及StringBuffer的常用方法)
对比
|
String |
StringBuffer |
对象是否可变 |
String创建的对象是不可变的,一旦创建不可改变 |
StringBuffer创建的对象是可变的 |
值改变存储过程 |
对象值的改变是创建了一个新的对象,然后把新的值保存进去 |
值不是重新创建对象,而是通过构造方法 |
对象存储位置 |
String创建的对象存储在常量池,不用的时候不会被销毁 |
StringBuffer创建的对象的值存在于栈区,不用的时候会被销毁 |
运行效率 |
运行时间较长 |
运行时间较短 |
适用范围 |
比较短而小的字符串 |
比较长的字符串,比较多的字符串 |
其他 |
被final修饰,不可以被继承 |
|

二者速度对比
| public class test2 { |
| public static void main(String[] args) { |
| |
| String str = ""; |
| long stringFirst = System.currentTimeMillis(); |
| for (int i = 0; i < 100000; i++) { |
| str = str + i; |
| } |
| long stringEnd = System.currentTimeMillis(); |
| System.out.println("String值改变测试 , 时间:" + (stringEnd - stringFirst) + "ms"); |
| |
| |
| StringBuffer str2 = new StringBuffer(); |
| long stringBufferFirst = System.currentTimeMillis(); |
| for (int i = 0; i < 100000; i++) { |
| str2.append(i); |
| } |
| long stringBufferEnd = System.currentTimeMillis(); |
| System.out.println("StringBuffer值改变测试 , 时间:" + (stringBufferEnd - stringBufferFirst) + "ms"); |
| |
| } |
| } |

结果显而易见,StringBuffer比String性能强太多了
StringBuffer的常用方法
构造函数
| StringBuffer() value内容为空,并设置容量为16个字节; |
| StringBuffer(CharSequece seq) 使用seq初始化,容量在此基础上加16; |
| StringBuffer(int capacity) 设置特定容量; |
| StringBuffer(String str) 使用str初始化,容量str大小的基础上加16; |
append方法
由于继承了Appendable接口,所以要实现append方法,StringBuffer类对几乎所有的基本类型都重载了append方法:
| append(boolean b) |
| append(char c) |
| append(char[] str) |
| append(char[] str,int offset,int len) |
| append(CharSequence s) |
| append(CharSequence s,int start,int end) |
| append(double d) |
| append(float f) |
| append(int i) |
| append(long lng) |
| append(Object obj) |
| append(String str) |
| append(StringBuffer sb) |
insert方法
insert方法可以控制插入的起始位置,也几乎对所有的基本类型都重载了insert方法:
| insert(int offser,boolean b) |
| insert(int offset,char c) |
| insert(int offset,char[] str) |
| insert(int index,char[] str,int offset,int len) |
| insert(int dsfOffset,CharSequence s) |
| insert(int dsfOffset,CharSequence s,int start,int end) |
| insert(int offset,double d) |
| insert(int offset,float f) |
| insert(int offset,int i) |
| insert(int offset,long l) |
| insert(int offset,Object obj) |
| insert(int offset,String str) |
其它会改变内容的方法
上面的那些方法会增加StringBuffer的内容,还有一些方法可以改变StringBuffer的内容:
| StringBuffer delete(int start,int end) 删除从start到end(不包含)之间的内容; |
| StringBuffer deleteCharAt(int index) 删除index位置的字符; |
| StringBuffer replace(int start,int end,String str) 用str中的字符替换value中从start到end位置的子序列; |
| StringBuffer reverse() 反转; |
| void setCharAt(int index,char ch) 使用ch替换位置index处的字符; |
| void setLength(int newLength) 可能会改变内容(添加'\0'); |
其它常用方法
下面这些方法不会改变内容:
| int capacity() 返回value的大小即容量; |
| int length() 返回内容的大小,即count; |
| char charAt(int index) 返回位置index处的字符; |
| void ensureCapacity(int minimumCapacity) 确保容量至少是minimumCapacity; |
| void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin) 返回srcBegin到srcEnd的字符到dst; |
| int indexOf(String str) 返回str第一次出现的位置; |
| int indexOf(String str,int fromIndex) 返回从fromIndex开始str第一次出现的位置; |
| int lastIndexOf(String str) 返回str最后出现的位置; |
| int lastIndexOf(String str,int fromIndex) 返回从fromIndex开始最后一次出现str的位置; |
| CharSequence subSequence(int start,int end) 返回字符子序列; |
| String substring(int start) 返回子串; |
| String substring(int start,int end) 返回子串; |
| String toString() 返回value形成的字符串; |
| void trimToSize() 缩小value的容量到真实内容大小; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)