java中String 和StringBuffer有什么区别 JAVA的String类和StringBuffer两个类的区...

\u8bf7\u95eejava\u4e2d\u7684String\u7c7b\u548cStringBuffer\u7c7b\u6709\u4ec0\u4e48\u533a\u522b\u4e0e\u8054\u7cfb\uff0c\u8c22\uff01

\u5728java\u4e2d\u67093\u4e2a\u7c7b\u6765\u8d1f\u8d23\u5b57\u7b26\u7684\u64cd\u4f5c\u3002
1.Character \u662f\u8fdb\u884c\u5355\u4e2a\u5b57\u7b26\u64cd\u4f5c\u7684\uff0c
2.String \u5bf9\u4e00\u4e32\u5b57\u7b26\u8fdb\u884c\u64cd\u4f5c\u3002\u4e0d\u53ef\u53d8\u7c7b\u3002
3.StringBuffer \u4e5f\u662f\u5bf9\u4e00\u4e32\u5b57\u7b26\u8fdb\u884c\u64cd\u4f5c\uff0c\u4f46\u662f\u53ef\u53d8\u7c7b\u3002
String:
\u662f\u5bf9\u8c61\u4e0d\u662f\u539f\u59cb\u7c7b\u578b.
\u4e3a\u4e0d\u53ef\u53d8\u5bf9\u8c61,\u4e00\u65e6\u88ab\u521b\u5efa,\u5c31\u4e0d\u80fd\u4fee\u6539\u5b83\u7684\u503c.
\u5bf9\u4e8e\u5df2\u7ecf\u5b58\u5728\u7684String\u5bf9\u8c61\u7684\u4fee\u6539\u90fd\u662f\u91cd\u65b0\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u5bf9\u8c61,\u7136\u540e\u628a\u65b0\u7684\u503c\u4fdd\u5b58\u8fdb\u53bb.
String \u662ffinal\u7c7b,\u5373\u4e0d\u80fd\u88ab\u7ee7\u627f.


StringBuffer:
\u662f\u4e00\u4e2a\u53ef\u53d8\u5bf9\u8c61,\u5f53\u5bf9\u4ed6\u8fdb\u884c\u4fee\u6539\u7684\u65f6\u5019\u4e0d\u4f1a\u50cfString\u90a3\u6837\u91cd\u65b0\u5efa\u7acb\u5bf9\u8c61
\u5b83\u53ea\u80fd\u901a\u8fc7\u6784\u9020\u51fd\u6570\u6765\u5efa\u7acb,
StringBuffer sb = new StringBuffer();
note:\u4e0d\u80fd\u901a\u8fc7\u4ed8\u503c\u7b26\u53f7\u5bf9\u4ed6\u8fdb\u884c\u4ed8\u503c.
sb = "welcome to here!";//error
\u5bf9\u8c61\u88ab\u5efa\u7acb\u4ee5\u540e,\u5728\u5185\u5b58\u4e2d\u5c31\u4f1a\u5206\u914d\u5185\u5b58\u7a7a\u95f4,\u5e76\u521d\u59cb\u4fdd\u5b58\u4e00\u4e2anull.\u5411StringBuffer
\u4e2d\u4ed8\u503c\u7684\u65f6\u5019\u53ef\u4ee5\u901a\u8fc7\u5b83\u7684append\u65b9\u6cd5.
sb.append("hello");


\u5b57\u7b26\u4e32\u8fde\u63a5\u64cd\u4f5c\u4e2dStringBuffer\u7684\u6548\u7387\u8981\u6bd4String\u9ad8:
String str = new String("welcome to ");
str += "here";
\u7684\u5904\u7406\u6b65\u9aa4\u5b9e\u9645\u4e0a\u662f\u901a\u8fc7\u5efa\u7acb\u4e00\u4e2aStringBuffer,\u8ba9\u4faf\u8c03\u7528append(),\u6700\u540e
\u518d\u5c06StringBuffer toSting();
\u8fd9\u6837\u7684\u8bddString\u7684\u8fde\u63a5\u64cd\u4f5c\u5c31\u6bd4StringBuffer\u591a\u51fa\u4e86\u4e00\u4e9b\u9644\u52a0\u64cd\u4f5c,\u5f53\u7136\u6548\u7387\u4e0a\u8981\u6253\u6298\u6263.


\u5e76\u4e14\u7531\u4e8eString \u5bf9\u8c61\u662f\u4e0d\u53ef\u53d8\u5bf9\u8c61,\u6bcf\u6b21\u64cd\u4f5cSting \u90fd\u4f1a\u91cd\u65b0\u5efa\u7acb\u65b0\u7684\u5bf9\u8c61\u6765\u4fdd\u5b58\u65b0\u7684\u503c.\u8fd9\u6837\u539f\u6765\u7684\u5bf9\u8c61\u5c31\u6ca1\u7528\u4e86,\u5c31\u8981\u88ab\u5783\u573e\u56de\u6536.\u8fd9\u4e5f\u662f\u8981\u5f71\u54cd\u6027\u80fd\u7684.

StringBuffer\u7c7b\u548cString\u4e00\u6837\uff0c\u4e5f\u7528\u6765\u4ee3\u8868\u5b57\u7b26\u4e32\uff0c\u53ea\u662f\u7531\u4e8eStringBuffer\u7684\u5185\u90e8\u5b9e\u73b0\u65b9\u5f0f\u548cString\u4e0d\u540c\uff0c\u6240\u4ee5StringBuffer\u5728\u8fdb\u884c\u5b57\u7b26\u4e32\u5904\u7406\u65f6\uff0c\u4e0d\u751f\u6210\u65b0\u7684\u5bf9\u8c61\uff0c\u5728\u5185\u5b58\u4f7f\u7528\u4e0a\u8981\u4f18\u4e8eString\u7c7b\u3002

\u6240\u4ee5\u5728\u5b9e\u9645\u4f7f\u7528\u65f6\uff0c\u5982\u679c\u7ecf\u5e38\u9700\u8981\u5bf9\u4e00\u4e2a\u5b57\u7b26\u4e32\u8fdb\u884c\u4fee\u6539\uff0c\u4f8b\u5982\u63d2\u5165\u3001\u5220\u9664\u7b49\u64cd\u4f5c\uff0c\u4f7f\u7528StringBuffer\u8981\u66f4\u52a0\u9002\u5408\u4e00\u4e9b\u3002

\u5728StringBuffer\u7c7b\u4e2d\u5b58\u5728\u5f88\u591a\u548cString\u7c7b\u4e00\u6837\u7684\u65b9\u6cd5\uff0c\u8fd9\u4e9b\u65b9\u6cd5\u5728\u529f\u80fd\u4e0a\u548cString\u7c7b\u4e2d\u7684\u529f\u80fd\u662f\u5b8c\u5168\u4e00\u6837\u7684\u3002

\u4f46\u662f\u6709\u4e00\u4e2a\u6700\u663e\u8457\u7684\u533a\u522b\u5728\u4e8e\uff0c\u5bf9\u4e8eStringBuffer\u5bf9\u8c61\u7684\u6bcf\u6b21\u4fee\u6539\u90fd\u4f1a\u6539\u53d8\u5bf9\u8c61\u81ea\u8eab\uff0c\u8fd9\u70b9\u662f\u548cString\u7c7b\u6700\u5927\u7684\u533a\u522b\u3002

\u53e6\u5916\u7531\u4e8eStringBuffer\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\uff0c\u6240\u4ee5\u5728\u591a\u7ebf\u7a0b\u7a0b\u5e8f\u4e2d\u4e5f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684\u8fdb\u884c\u4f7f\u7528\uff0c\u4f46\u662f\u7a0b\u5e8f\u7684\u6267\u884c\u6548\u7387\u76f8\u5bf9\u6765\u8bf4\u5c31\u8981\u7a0d\u5fae\u6162\u4e00\u4e9b\u3002

1\u3001StringBuffer\u5bf9\u8c61\u7684\u521d\u59cb\u5316

StringBuffer\u5bf9\u8c61\u7684\u521d\u59cb\u5316\u4e0d\u50cfString\u7c7b\u7684\u521d\u59cb\u5316\u4e00\u6837\uff0cJava\u63d0\u4f9b\u7684\u6709\u7279\u6b8a\u7684\u8bed\u6cd5\uff0c\u800c\u901a\u5e38\u60c5\u51b5\u4e0b\u4e00\u822c\u4f7f\u7528\u6784\u9020\u65b9\u6cd5\u8fdb\u884c\u521d\u59cb\u5316\u3002

\u4f8b\u5982\uff1a
StringBuffer s = new StringBuffer();
\u8fd9\u6837\u521d\u59cb\u5316\u51fa\u7684StringBuffer\u5bf9\u8c61\u662f\u4e00\u4e2a\u7a7a\u7684\u5bf9\u8c61\u3002

\u5982\u679c\u9700\u8981\u521b\u5efa\u5e26\u6709\u5185\u5bb9\u7684StringBuffer\u5bf9\u8c61\uff0c\u5219\u53ef\u4ee5\u4f7f\u7528\uff1a
StringBuffer s = new StringBuffer(\u201cabc\u201d);
\u8fd9\u6837\u521d\u59cb\u5316\u51fa\u7684StringBuffer\u5bf9\u8c61\u7684\u5185\u5bb9\u5c31\u662f\u5b57\u7b26\u4e32\u201dabc\u201d\u3002

\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0cStringBuffer\u548cString\u5c5e\u4e8e\u4e0d\u540c\u7684\u7c7b\u578b\uff0c\u4e5f\u4e0d\u80fd\u76f4\u63a5\u8fdb\u884c\u5f3a\u5236\u7c7b\u578b\u8f6c\u6362\uff0c\u4e0b\u9762\u7684\u4ee3\u7801\u90fd\u662f\u9519\u8bef\u7684\uff1a

StringBuffer s = \u201cabc\u201d; //\u8d4b\u503c\u7c7b\u578b\u4e0d\u5339\u914dStringBuffer s = (StringBuffer)\u201dabc\u201d; //\u4e0d\u5b58\u5728\u7ee7\u627f\u5173\u7cfb\uff0c\u65e0\u6cd5\u8fdb\u884c\u5f3a\u8f6c
StringBuffer\u5bf9\u8c61\u548cString\u5bf9\u8c61\u4e4b\u95f4\u7684\u4e92\u8f6c\u7684\u4ee3\u7801\u5982\u4e0b\uff1a

String s = \u201cabc\u201d;StringBuffer sb1 = new StringBuffer(\u201c123\u201d);StringBuffer sb2 = new StringBuffer(s); //String\u8f6c\u6362\u4e3aStringBufferString s1 = sb1.toString(); //StringBuffer\u8f6c\u6362\u4e3aString
2\u3001StringBuffer\u7684\u5e38\u7528\u65b9\u6cd5

StringBuffer\u7c7b\u4e2d\u7684\u65b9\u6cd5\u4e3b\u8981\u504f\u91cd\u4e8e\u5bf9\u4e8e\u5b57\u7b26\u4e32\u7684\u53d8\u5316\uff0c\u4f8b\u5982\u8ffd\u52a0\u3001\u63d2\u5165\u548c\u5220\u9664\u7b49\uff0c\u8fd9\u4e2a\u4e5f\u662fStringBuffer\u548cString\u7c7b\u7684\u4e3b\u8981\u533a\u522b\u3002

a\u3001append\u65b9\u6cd5
public StringBuffer append(boolean b)
\u8be5\u65b9\u6cd5\u7684\u4f5c\u7528\u662f\u8ffd\u52a0\u5185\u5bb9\u5230\u5f53\u524dStringBuffer\u5bf9\u8c61\u7684\u672b\u5c3e\uff0c\u7c7b\u4f3c\u4e8e\u5b57\u7b26\u4e32\u7684\u8fde\u63a5\u3002\u8c03\u7528\u8be5\u65b9\u6cd5\u4ee5\u540e\uff0cStringBuffer\u5bf9\u8c61\u7684\u5185\u5bb9\u4e5f\u53d1\u751f\u6539\u53d8\uff0c\u4f8b\u5982\uff1a

StringBuffe sb = new StringBuffer(\u201cabc\u201d);sb.append(true);
\u5219\u5bf9\u8c61sb\u7684\u503c\u5c06\u53d8\u6210\u201dabctrue\u201d\u3002

\u4f7f\u7528\u8be5\u65b9\u6cd5\u8fdb\u884c\u5b57\u7b26\u4e32\u7684\u8fde\u63a5\uff0c\u5c06\u6bd4String\u66f4\u52a0\u8282\u7ea6\u5185\u5bb9\uff0c\u4f8b\u5982\u5e94\u7528\u4e8e\u6570\u636e\u5e93SQL\u8bed\u53e5\u7684\u8fde\u63a5\uff0c\u4f8b\u5982\uff1a

StringBuffer sb = new StringBuffer();String user = \u201ctest\u201d;String pwd = \u201c123\u201d;sb.append(\u201cselect * from userInfo where username=\u201c) .append(user) .append(\u201c and pwd=\u201d) .append(pwd);
\u8fd9\u6837\u5bf9\u8c61sb\u7684\u503c\u5c31\u662f\u5b57\u7b26\u4e32
\u201cselect * from userInfo where username=test and pwd=123\u201d\u3002
b\u3001deleteCharAt\u65b9\u6cd5
public StringBuffer deleteCharAt(int index)
\u8be5\u65b9\u6cd5\u7684\u4f5c\u7528\u662f\u5220\u9664\u6307\u5b9a\u4f4d\u7f6e\u7684\u5b57\u7b26\uff0c\u7136\u540e\u5c06\u5269\u4f59\u7684\u5185\u5bb9\u5f62\u6210\u65b0\u7684\u5b57\u7b26\u4e32\u3002\u4f8b\u5982\uff1a

StringBuffer sb = new StringBuffer(\u201cTest\u201d);sb.deleteCharAt(1);
\u8be5\u4ee3\u7801\u7684\u4f5c\u7528\u5220\u9664\u5b57\u7b26\u4e32\u5bf9\u8c61sb\u4e2d\u7d22\u5f15\u503c\u4e3a1\u7684\u5b57\u7b26\uff0c\u4e5f\u5c31\u662f\u5220\u9664\u7b2c\u4e8c\u4e2a\u5b57\u7b26\uff0c\u5269\u4f59\u7684\u5185\u5bb9\u7ec4\u6210\u4e00\u4e2a\u65b0\u7684\u5b57\u7b26\u4e32\u3002\u6240\u4ee5\u5bf9\u8c61sb\u7684\u503c\u53d8\u4e3a\u201dTst\u201d\u3002

\u8fd8\u5b58\u5728\u4e00\u4e2a\u529f\u80fd\u7c7b\u4f3c\u7684delete\u65b9\u6cd5\uff1a
public StringBuffer delete(int start,int end)
\u8be5\u65b9\u6cd5\u7684\u4f5c\u7528\u662f\u5220\u9664\u6307\u5b9a\u533a\u95f4\u4ee5\u5185\u7684\u6240\u6709\u5b57\u7b26\uff0c\u5305\u542bstart\uff0c\u4e0d\u5305\u542bend\u7d22\u5f15\u503c\u7684\u533a\u95f4\u3002\u4f8b\u5982\uff1a

StringBuffer sb = new StringBuffer(\u201cTestString\u201d);sb.delete (1,4);\u8be5\u4ee3\u7801\u7684\u4f5c\u7528\u662f\u5220\u9664\u7d22\u5f15\u503c1(\u5305\u62ec)\u5230\u7d22\u5f15\u503c4(\u4e0d\u5305\u62ec)\u4e4b\u95f4\u7684\u6240\u6709\u5b57\u7b26\uff0c\u5269\u4f59\u7684\u5b57\u7b26\u5f62\u6210\u65b0\u7684\u5b57\u7b26\u4e32\u3002\u5219\u5bf9\u8c61sb\u7684\u503c\u662f\u201dTString\u201d\u3002

c\u3001insert\u65b9\u6cd5
public StringBuffer insert(int offset, boolean b)
\u8be5\u65b9\u6cd5\u7684\u4f5c\u7528\u662f\u5728StringBuffer\u5bf9\u8c61\u4e2d\u63d2\u5165\u5185\u5bb9\uff0c\u7136\u540e\u5f62\u6210\u65b0\u7684\u5b57\u7b26\u4e32\u3002\u4f8b\u5982\uff1a

StringBuffer sb = new StringBuffer(\u201cTestString\u201d);sb.insert(4,false);
\u8be5\u793a\u4f8b\u4ee3\u7801\u7684\u4f5c\u7528\u662f\u5728\u5bf9\u8c61sb\u7684\u7d22\u5f15\u503c4\u7684\u4f4d\u7f6e\u63d2\u5165false\u503c\uff0c\u5f62\u6210\u65b0\u7684\u5b57\u7b26\u4e32\uff0c\u5219\u6267\u884c\u4ee5\u540e\u5bf9\u8c61sb\u7684\u503c\u662f\u201dTestfalseString\u201d\u3002

d\u3001reverse\u65b9\u6cd5
public StringBuffer reverse()
\u8be5\u65b9\u6cd5\u7684\u4f5c\u7528\u662f\u5c06StringBuffer\u5bf9\u8c61\u4e2d\u7684\u5185\u5bb9\u53cd\u8f6c\uff0c\u7136\u540e\u5f62\u6210\u65b0\u7684\u5b57\u7b26\u4e32\u3002\u4f8b\u5982\uff1a

StringBuffer sb = new StringBuffer(\u201cabc\u201d);sb.reverse();
\u7ecf\u8fc7\u53cd\u8f6c\u4ee5\u540e\uff0c\u5bf9\u8c61sb\u4e2d\u7684\u5185\u5bb9\u5c06\u53d8\u4e3a\u201dcba\u201d\u3002

e\u3001setCharAt\u65b9\u6cd5
public void setCharAt(int index, char ch)
\u8be5\u65b9\u6cd5\u7684\u4f5c\u7528\u662f\u4fee\u6539\u5bf9\u8c61\u4e2d\u7d22\u5f15\u503c\u4e3aindex\u4f4d\u7f6e\u7684\u5b57\u7b26\u4e3a\u65b0\u7684\u5b57\u7b26ch\u3002\u4f8b\u5982\uff1a

StringBuffer sb = new StringBuffer(\u201cabc\u201d);sb.setCharAt(1,\u2019D\u2019);\u5219\u5bf9\u8c61sb\u7684\u503c\u5c06\u53d8\u6210\u201daDc\u201d\u3002

f\u3001trimToSize\u65b9\u6cd5
public void trimToSize()
\u8be5\u65b9\u6cd5\u7684\u4f5c\u7528\u662f\u5c06StringBuffer\u5bf9\u8c61\u7684\u4e2d\u5b58\u50a8\u7a7a\u95f4\u7f29\u5c0f\u5230\u548c\u5b57\u7b26\u4e32\u957f\u5ea6\u4e00\u6837\u7684\u957f\u5ea6\uff0c\u51cf\u5c11\u7a7a\u95f4\u7684\u6d6a\u8d39\u3002

\u603b\u4e4b\uff0c\u5728\u5b9e\u9645\u4f7f\u7528\u65f6\uff0cString\u548cStringBuffer\u5404\u6709\u4f18\u52bf\u548c\u4e0d\u8db3\uff0c\u53ef\u4ee5\u6839\u636e\u5177\u4f53\u7684\u4f7f\u7528\u73af\u5883\uff0c\u9009\u62e9\u5bf9\u5e94\u7684\u7c7b\u578b\u8fdb\u884c\u4f7f\u7528\u3002

String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结。

在java中有3个类来负责字符的操作。
1.Character 是进行单个字符操作的
2.String 对一串字符进行操作。不可变类。
3.StringBuffer 也是对一串字符进行操作,但是可变类。

String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.

StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");

字符串连接操作中StringBuffer的效率要比String高:

String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,然后调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的.

看看以下代码:
将26个英文字母重复加了5000次,

Java代码
1.String tempstr = "abcdefghijklmnopqrstuvwxyz";
2.int times = 5000;
3.long lstart1 = System.currentTimeMillis();
4.String str = "";
5.for (int i = 0; i < times; i++) {
6. str += tempstr;
7.}
8.long lend1 = System.currentTimeMillis();
9.long time = (lend1 - lstart1);
10.System.out.println(time);
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart1 = System.currentTimeMillis();
String str = "";
for (int i = 0; i < times; i++) {
str += tempstr;
}
long lend1 = System.currentTimeMillis();
long time = (lend1 - lstart1);
System.out.println(time);

可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。
也就是46秒。
我们再看看以下代码

Java代码
1.String tempstr = "abcdefghijklmnopqrstuvwxyz";
2.int times = 5000;
3.long lstart2 = System.currentTimeMillis();
4.StringBuffer sb = new StringBuffer();
5.for (int i = 0; i < times; i++) {
6. sb.append(tempstr);
7.}
8.long lend2 = System.currentTimeMillis();
9.long time2 = (lend2 - lstart2);
10.System.out.println(time2);
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart2 = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < times; i++) {
sb.append(tempstr);
}
long lend2 = System.currentTimeMillis();
long time2 = (lend2 - lstart2);
System.out.println(time2);

得到的结果为 16 有时还是 0
所以结论很明显,StringBuffer 的速度几乎是String 上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。不信你试试。

根据上面所说:

str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();

所以str += "here";可以等同于

StringBuffer sb = new StringBuffer(str);

sb.append("here");

str = sb.toString();

所以上面直接利用"+"来连接String的代码可以基本等同于以下代码

Java代码
1.String tempstr = "abcdefghijklmnopqrstuvwxyz";
2.int times = 5000;
3.long lstart2 = System.currentTimeMillis();
4.String str = "";
5.for (int i = 0; i < times; i++) {
6. StringBuffer sb = new StringBuffer(str);
7. sb.append(tempstr);
8. str = sb.toString();
9.}
10.long lend2 = System.currentTimeMillis();
11.long time2 = (lend2 - lstart2);
12.System.out.println(time2);
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart2 = System.currentTimeMillis();
String str = "";
for (int i = 0; i < times; i++) {
StringBuffer sb = new StringBuffer(str);
sb.append(tempstr);
str = sb.toString();
}
long lend2 = System.currentTimeMillis();
long time2 = (lend2 - lstart2);
System.out.println(time2);

平均执行时间为46922左右,也就是46秒。

总结: 如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yirentianran/archive/2008/09/03/2871417.aspx

--------------------------------------------------------------------------------------------------------------------------------------------
另外一段网上对String与StringBuffer区别的注解:

String和StringBuffer
String 是不可以变的字符串.
StringBuffer 是可变的字符串.
对StringBuffer进行操作,是在原来的对象之上进行改变. 而对String进行操作,是创建新的对象。

Java代码
1.public class StringTest {
2. public static void stringReplace(String text) {
3. text = text.replace('j', 'i');
4. }
5.
6. public static void bufferReplace(StringBuffer text) {
7. text = text.append("C");
8. }
9.
10. public static void main(String args[]) {
11. String textString = new String("java");
12. StringBuffer textBuffer = new StringBuffer("java");
13.
14. stringReplace(textString);
15. bufferReplace(textBuffer);
16.
17. System.out.println(textString + textBuffer);
18. }
19.}
public class StringTest {
public static void stringReplace(String text) {
text = text.replace('j', 'i');
}

public static void bufferReplace(StringBuffer text) {
text = text.append("C");
}

public static void main(String args[]) {
String textString = new String("java");
StringBuffer textBuffer = new StringBuffer("java");

stringReplace(textString);
bufferReplace(textBuffer);

System.out.println(textString + textBuffer);
}
}

输出结果
javajavaC
String实例化以后所有的属性都是final的,而StringBuffer确不是,这就是可变与不可变。
这是因为第七行text = text.append ("C"),append方法会改变text中的值,而text与textBuffer指向的地址是相同的。因此会打印javaC
再举个例子:
String a = "a"; //假设a指向地址0x0001
a = "b"; //重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。
因此String的操作都是改变赋值地址而不是改变值操作。
具体:
String:在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的。
StringBuffer:StringBuffer类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用
StringBuffer类的append方法追加字符比String使用 + 操作符添加字符到一个已经存在的字符串后面有效率得多。因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这无凝是一个非常消耗时间的操作。添加多个字符也就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题.

String与StringBuffer的区别
简单地说,就是一个变量和常量的关系。StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象。
StringBuffer
的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用
时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。
String:在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的。
StringBuffer:StringBuffer
类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符 比
String使用 + 操作符添加字符 到 一个已经存在的字符串后面有效率得多。因为使用 +
操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这无凝是一个非常消耗时间的操作。添加多个字符也
就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题。
StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。
StringBuffer的常用方法
StringBuffer类中的方法要偏重于对字符串的变化例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。
1、append方法
public StringBuffer append(boolean b)
该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.append(true);
则对象sb的值将变成”abctrue”。
使用该方法进行字符串的连接,将比String更加节约内容,例如应用于数据库SQL语句的连接,例如:
StringBuffer sb = new StringBuffer();
String user = “test”;
String pwd = “123”;
sb.append(“select * from userInfo where username=“)
.append(user)
.append(“ and pwd=”)
.append(pwd);
这样对象sb的值就是字符串“select * from userInfo where username=test and pwd=123”。
2、deleteCharAt方法
public StringBuffer deleteCharAt(int index)
该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“Test”);
sb. deleteCharAt(1);
该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变为”Tst”。
还存在一个功能类似的delete方法:
public StringBuffer delete(int start,int end)
该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb. delete (1,4);
该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。
3、insert方法
public StringBuffer insert(int offset, String s)
该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,“false”);
该示例代码的作用是在对象sb的索引值4的位置插入字符串false,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。
4、reverse方法
public StringBuffer reverse()
该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();
经过反转以后,对象sb中的内容将变为”cba”。
5、setCharAt方法
public void setCharAt(int index, char ch)
该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.setCharAt(1,’D’);
则对象sb的值将变成”aDc”。
6、trimToSize方法
public void trimToSize()
该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。
7、构造方法:
StringBuffer s0=new StringBuffer();分配了长16字节的字符缓冲区
StringBuffer s1=new StringBuffer(512);分配了512字节的字符缓冲区
8、获取字符串的长度: length()
StringBuffer s = new StringBuffer("www");
int i=s.length();
m.返回字符串的一部分值
substring(int start) //返回从start下标开始以后的字符串
substring(int start,int end) //返回从start到 end-1字符串
9.替换字符串
replace(int start,int end,String str)
s.replace(0,1,"qqq");
10.转换为不变字符串:toString()。

String 不是简单类型,而是一个类,它被用来表示字符序列。字符本身符合 Unicode 标准,其初始化方式有两种。
如:String greeting=“Good Morning! \n”;
String greeting=new String(=“Good Morning! \n”);
String的特点是一旦赋值,便不能更改其指向的字符对象,如果更改,则会指向一个新的字符对象 。

StringBuffer是一个具有对象引用传递特点的字符串对象。
StringBuffer对象可以调用其方法动态的进行增加、插入、修改和删除操作,且不用像数组那样事先指定大小,从而实现多次插入字符,一次整体取出的效果,因而操作字符串非常灵活方便。
一旦通过StringBuffer生成最终想要的字符串,就可调用它的toString方法将其转换为一个String对象

在Java中,String,StringBuilder和StringBuffer的区别有:
String是对象不可变的(因为它的原理是一个final修饰的字符数组),而StringBuilder和StringBuffer是对象可变的,它们两个都继承AbstractStringBuilder类。
从线程安全角度考虑,String是对象不可变的,显然线程安全。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,而StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

首先,String是final类,所以每次对String的更改都是在重新创建一个对象。这样效率很低。
这个时候StringBuffer就出现了,他是通过内部的char数组实现,动态的改变字符串,所以StringBuffer在字符串改变时速度较快,最后通过toString创建String对象。
还需要注意StringBuffer是线程安全的。由于String是final的也是线程安全的。

扩展阅读:public static void main ... java 解析string xml ... javascript入门 ... java中string format ... java windowbuilder ... java中string转为map ... 国产任天堂switch手柄 ... java equals ... java入门网站 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网