首先String,StringBuffrt,StringBuilder都是用于操作字符串。
我们先说说String:String一种不可变类,即在给String类型的变量重新赋值的时候String的地址也会发生改变,所以会产生新的对象,而String变量的值如果相同,那么地址就是一样,也就是说他们指向都是一样的,所以重新赋值是生成一个新的对象然后指向新的对象。原来的指向的对象将会被当作来及被GC回收掉。
- String str = "abc";
- String str1 = "abc";
- System.out.println(str == str1);//结果true 比较地址
- str = "abcd";
- System.out.println(str == str1);//结果false
这种别每次改变Stirng都要生成新的对象,然后在指向新的对象,效率非常低,操作少量字符串的时候可以使用。
再说StringBuffer:StringBuffer是一种可变类,任何改变它都不会生成新的对象,StringBuffer是支持并发操作,线程是安全的。
- StringBuffer buffer = new StringBuffer(512);//512缓存字节
- buffer.append("aaa");
- System.out.println(buffer.hashCode());//488676694
- buffer.append("bbb");
- System.out.println(buffer.hashCode());//488676694
- //比较两次值其实是相同的
两次比较相同,说明了StringBuffer是一种不可变类,没有分配新的地址,没有新的对象,适用于多线程。
然后说StringBuilder:StringBuilder通StringBuffer一样都是不可变类,任何改变都不会生成新的对象,但是StringBuilder是多线程不安全的,单线程StringBuilder比StringBuffer要快一些。
- long startTime;
- long endTime;
- StringBuffer buffer = new StringBuffer(512);
- startTime = System.currentTimeMillis();
- for(int i = 0; i < 10000; i++){
- buffer.append(i);
- }
- endTime = System.currentTimeMillis();
- System.out.println(endTime -startTime);//结果13
- StringBuilder builder = new StringBuilder(512);
- startTime = System.currentTimeMillis();
- for(int i = 0; i < 10000; i++){
- builder.append(i);
- }
- endTime = System.currentTimeMillis();
- System.out.println(endTime -startTime);//结果3
相比较而言StringBuilder确实比StringBuffer快,String就不比较了,肯定比其他两种更慢
总而言之,对字符串少量操作的时候使用Stiring比较方便,多线程使用StringBuffer,对字符有大量操作的时候但又不在多线程中时候可以使用StringBuilder,不然使用StringBuffer