java面试-String、StringBuffer和StringBuilder的区别
一、String的创建机制
由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池。
运行机制是:创建一个字符串时,首先检查池中是否有值相同的字符串对象,如果有则不需要创建直接从池中刚查找到的对象引用;
如果没有则新建字符串对象,返回对象引用,并且将新创建的对象放入池中。
但是,通过new方法创建的String对象是不检查字符串池的,而是直接在堆区或栈区创建一个新的对象,也不会把对象放入池中。
String str1 = "123"; //通过直接量赋值方式,放入字符串常量池 String str2 = new String(“123”);//通过new方式赋值方式,不放入字符串常量池
二、String特性:
1、不可变:当一个对象需要被多线程共享,并且访问频繁时,可以省略同步和锁等待的时间,从而大幅度提高系统性能。
不可变模式是一个可以提高多线程程序的性能,降低多线程程序复杂度的设计模式
2、常量池的优化:当两个String对象拥有相同的值时,他们只引用常量池中的同一个拷贝。当同一个字符串反复出现时,这个技术可以大幅度节省内存空间。
三、String、StringBuffer和StringBuilder的区别
1、String是内容不可变的,而StringBuffer和StringBuilder都是内容可变的。
2、StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高。
三、StringBuffer的方法
1.添加:append(),insert()
2.删除:deletecharAt(),delete()
3.替换:replace()
4.反转:reverse()
5.截取:subString()(返回值类型String)
四、.StringBuffer和String的相互转换
String->StringBuffer
//方式1:通过构造方法 String s = "hello"; StringBuffer sb = new StringBuffer(s); //方式2:通过append方法 String s2 = "hello"; StringBuffer sb2 = new StringBuffer(); sb2.append(s);
StringBuffer->String
//方式1:通过构造方法 StringBuffer buffer = new StringBuffer("hello"); String str = new String(buffer); //方式2:通过toString()方法 String str2 = buffer.toString();
五、String和StringBuffer作为形参传递(要特别注意)
String做为形参传递,效果和基本数据类型一致。
public class StringTest { public static void main(String[] args) { String s1 = "hello"; String s2 = "world"; System.out.println(s1+"===="+s2);//hello====world change(s1,s2); System.out.println(s1+"===="+s2);//hello====world StringBuffer sb1 = new StringBuffer("hello"); StringBuffer sb2 = new StringBuffer("world"); System.out.println(sb1+"======"+sb2);//hello====world change(sb1,sb2); System.out.println(sb1+"======"+sb2);//hello======worldworld } public static void change(StringBuffer sb1, StringBuffer sb2) { sb1 = sb2; sb2.append(sb1); } public static void change(String s1, String s2) { s1 = s2; s2 = s1 + s2; } }