字符串是计算机程序设计中的,最多见行为,Java的字符串操做最主要的类是String,而且String对象是不可变的(Immutable),即对象一旦建立在内存中,那么它的内容就再也不改变。虽然String类中提供不少方法看起来像是能够修改String对象,好比trim()、subString()等等,可是实际上它们并无改变原来的字符串对象,这些方法传递的只是引用的一个拷贝,因此从新建立了一个String类型的对象,而且有了新的引用。 java
例以下面一段代码能够说明String的不可变特性: 数组
package date0804.demo2; public class ImmutableString { public static void main(String[] args){ String str=new String("xyz"); change(str); System.out.println(str); } public static void change(String s) { s="xml"; } }
str=xyz 安全
所以,我么能够看到每当把String对象做为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未改变过。 多线程
另外,String对象还支持+操做符,+操做符能够合并字符串,可是根据相关的研究发现,使用+操做符来链接字符串会使得效率降低,于是,涉及到字符串的更改时,优先使用下面的StringBuilder或StringBuffer,两者都提供了丰富的字符串处理命令。 并发
StringBuilder类型是一个可变的字符串类型,StringBuilder类型的API与StringBuffer类型的API基本一致,惟一的区别是StringBuilder的使用假设在单一线程中,换句话说,StringBuilder是线程不安全的。StringBuilder在实例化的时候,一般也会默认设定一个容量大小,通常为字符串参数的长度+16。StringBuilder是继承AbstractStringBuilder这个抽象类的,而这个抽象类的内部使用字符数组来实现的,数组能够进行动态扩展。StringBuilder类提供的经常使用的方法有append()、insert()、replace()、deleteCharAt()、indexOf()、reverse()、toString()等方法,能够实现字符串的增删改查等基本功能。 app
package date0812.demo1; public class Test3 { public static void main(String[] args) { StringBuilder stringBuilder = new StringBuilder("Eclipse"); //添加 stringBuilder = stringBuilder.append(" software"); //容量 int C = stringBuilder.capacity(); //翻转 stringBuilder= stringBuilder.reverse(); System.out.println(C); System.out.println(stringBuilder); } } 运行结果: 23 erawtfos espilcE
StringBuffer是一个可变的、线程安全的处理字符串的类型。一样,StringBuffer也是继承AbstractStringBuilder抽象类的,所以内部也是使用字符数组来存储字符串的。与StringBuilder的区别是,StringBuffer类型的绝大多数方法的修饰符都加上了关键字synchronized,包括length()、capacity()、trimToSize()、append()、delete()、insert()等等,这一方面代表StringBuffer是线程安全的,能够用于多线程并发的场合,全部对StringBuffer的并发操做都要按照必定的顺序来执行,确保它们都可以正确的执行;另外一方面,也代表StringBuffer的开销要比StringBuilder大一点。StringBuffer是要早于StringBuilder开发的,在单一线程中,可使用StringBuilder来提升运行速度,若是遇到多线程须要同步时,则使用StringBuffer类型。其余的,在API的调用方面,基本上如出一辙。 ui