- String 、StringBuffer和StringBulider的区别
(1)执行速度:StringBulider>StringBuffer>String
(2)String是字符串常量(不可改变对象),StringBuffer和StringBuilder是字符串变量(是可变对象)。String是final类不可继承。
但是以下例子:
String str = “abcd”;
Str += 1;
却能够改变str,Why?
其实没有改变String变量,这里涉及到JVM的一些做法,以上代码JVM是这么处理的:JVM首先穿件一个str对象,赋值”abcd”,接着第二行重新创建一个Str对象,String重新赋值后会改变其地址,赋值”abcd1”,原来的str对象会被GC回收。因此String对象在不断的回收过程中,降低了效率。
StringBuffer和StringBuilder对象的操作是在原对象上操作的,不会创建新的对象,因此速度比较快。
(3)StringBuilder和StringBuffer的区别
StringBuilder:非线程安全的,StringBuffer是线程安全的。当字符串缓冲区多多线程公用时,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快。如果是单线程一般用StringBuilder而不用StringBuffer,主要是从速度来考虑的。 如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer和StringBuilde性能会更高
对于三者使用的总结: 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.youkuaiyun.com/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.youkuaiyun.com/chtnj/article/details/7909720
http://showmealone.blog.sohu.com/5759448.html
《Java 核心技术卷I》3.节 字符串. Cay S. Horstmann Gary Cornell 著. 机械工业出版社