java中String、StringBuffer和StringBuilder的区别

来源:互联网 发布:中班美工交通标志教案 编辑:程序博客网 时间:2024/05/16 09:23

  • String 、StringBuffer和StringBulider的区别

(1)执行速度:StringBulider>StringBuffer>String

(2)String是字符串常量(不可改变对象),StringBuffer和StringBuilder是字符串变量(是可变对象)。String是final类不可继承。

但是以下例子:

String str = “abcd”;

Str += 1;

却能够改变strWhy

其实没有改变String变量,这里涉及到JVM的一些做法,以上代码JVM是这么处理的:JVM首先穿件一个str对象,赋值”abcd”,接着第二行重新创建一个Str对象,String重新赋值后会改变其地址,赋值”abcd1”,原来的str对象会被GC回收。因此String对象在不断的回收过程中,降低了效率。

StringBuffer和StringBuilder对象的操作是在原对象上操作的,不会创建新的对象,因此速度比较快。

(3)StringBuilder和StringBuffer的区别

StringBuilder:非线程安全的,StringBuffer是线程安全的。当字符串缓冲区多多线程公用时,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快。如果是单线程一般用StringBuilder而不用StringBuffer,主要是从速度来考虑的。 如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBufferStringBuilde性能会更高

 对于三者使用的总结: 1.如果要操作少量的数据用 = String

             2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

             3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

  • StringBuffer

1.      StringBuffer只能通过构造函数建立,不能通过赋值符号进行赋值

StringBuffer str= new StringBuffer();对象被建立以后,在内存中就会分配内存空间,并初始保存一个null. 但是不能用str=”hello world”来赋值。可以用str.append(“hello world”)来赋值。

2.      每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。

      StringBuffer buf=new StringBuffer(); //分配长16字节的字符缓冲区

       StringBuffer buf=new StringBuffer(512); //分配长512字节的字符缓冲区

       StringBuffer buf=newStringBuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。

  •  String

1.        String is immutable。String isimmutable, but it reference is not。表面上看到的String的改变,实际上是其reference的改变.

2.        Java对String的内存管理:JVM中有一个特殊的内存区域叫做字符串常量池/String Constant Pool。当编译器遇到字符串字面值/String Leteral时,会先去字符串常量池查看是否有看字符串,如果有,编译器会把一个字符串的引用指向该匹配的字符串对象,不会创建新的字符串对象。

3.        JVM只对于StringLiteral Object才进行池化(把它们放入特殊的内存区域—String Constant Pool)—中. 以下两个例子

(1). String s = "abc";   //创建了一个String对象和一个String类型的reference变量

在这个简单的例子中, “abc”将会被JVM放进StringConstant Pool,同时,String类型的reference变量s会指向它

(2). String s = new String("abc");  //创建了两个String对象和一个String类型的reference变量。在这个例子中,由于我们使用了new关键字,JVM会创建两个String对象,一个是与例1中相同的String literal Object “abc”,它会被放入到StringConstant Poll中去. 而另为一个则使用new关键字创建的普通的Java String对象,它会被放到Java程序所使用的普通得内存区域中去(normal (non-pool) memory).

4.        String不能用“==”来判断来两个字符串是否相等,“==”是用来判断两个字符串引用是否指向同一个引用。而应该用equals来判断。

5.        空串和null串。空串是长度为0的字符串,而null串是指该引用变量目前没有和任何对象相关联(因此在null值上调用方法会出现错误)。判断一个字符串是否为null可以使用以下条件:if(str==null).要检查一个字符串既不是null也不为空串,用一下判断条件:if(str.length()!==0 && str!=null)

参考文献

http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html

http://blog.csdn.net/yirentianran/article/details/2871417

http://millerrch.iteye.com/blog/1540270

http://www.douban.com/note/271623786/

http://zhangyaping-xian.blog.sohu.com/158453963.html

http://blog.csdn.net/chtnj/article/details/7909720

http://showmealone.blog.sohu.com/5759448.html

《Java 核心技术卷I》3.节 字符串. Cay S. Horstmann Gary Cornell 著. 机械工业出版社

0 0