首先,String的底层使用final修饰的字符串数组保存字符串。故对象是不可变的。而StringBuilder和StringBuffer虽然底层也是用字符串数组保存字符串。但没有用final修饰,故可变。数组
其次,因为String对象不可变,故为线程安全的。又由于StringBuilder对象是可变的,故线程不安全(主要体如今方法调用方面),因为StringBuffer对方法加了同步锁,因此StringBuffer是线程安全的。安全
而后,性能方面。每次对String类型进行改变时,都会生成一个新的String对象,而后将指针指向新的String对象。因为同步锁的缘由,StringBuffer的性能是比Stringbuilder差的。他们两都是对对象自己操做的,无需生成新的对象。性能
ps:建立String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要建立的值相同的对象,若是存在,直接赋予给当前引用。若没有就在常量池从新建立String对象。ui