1. 字符串类
Java中,操作字符串的类有:String、StringBuffer、StringBuilder
1.1 String与StringBuffer、StringBuilder区别
- String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String(效率低,耗时长,浪费内存)。
- StringBuffer : 对字符串操作的方法都加了synchronized,保证线程安全。
- StringBuilder : 不保证线程安全。
1.2 效率比较
在效率上:StringBuilder>StringBuffer>String
原因:StringBuffer有同步锁,执行速度较StringBuilder慢,可以保证线程安全,适合多线程操作字符串;StringBuilder无同步锁,执行速度更快,不保证线程安全,适合单线程操作字符串;StringBuffer和StringBuilder是"字符串变量",而String是"字符串常量",也就是不可改变的对象,对其进行字符串操作,这个过程是需要重新在栈堆内存中开辟新的内存空间的,所以效率低,浪费内存。
2. String与new String()的区别
JVM为了提升性能和减少内存开销,避免字符串的重复创建,维护了一块特殊的内存空间——字符串实例池。
String赋值的两种方式。
1、String a = "zl";
以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"zl"这个对象,如果存在,直接把实例池中"zl"的地址返回给a。如果不存在,则会在实例池中创建"zl"对象,并把该对象的地址返回给a,即a存的是"zl"对象的地址。
String a = "zl";//此时实例池中不存在“zl”这个对象,所以会在实例池中创建"zl"对象,并把该对象的地址返回给a,即a存的是"zl"对象的地址。
String b = "zl";//此时实例池中存在“zl”这个对象,所以会直接把实例池中"zl"的地址返回给b。所以a,b指向的是同一地址,所以返回true;2、String a= new String("zl");
以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"zl"这个对象,若不存在则会在实例池中创建"zl"对象,同时在堆中创建"zl"这个对象,然后将堆中的这个对象的地址返回给a。若实例池存在则直接在堆中再创建一个"zl"这个对象,然后将堆中这个新创建对象的地址返回给a。
String a = new Sring("zl");//此时在实例池和堆中均创建了“zl”这个对象,并且将堆中的这个对象的地址返回给a。
String b = new Sring("zl");//此时实例池中已有“zl”这个对象,则直接在堆中创建“zl”这个对象,并将堆中的这个对象的地址返回给b。所以a和b存的是不同的内存地址,所以返回false;