String类的特点
直接赋值和new调用构造方法两种,
直接赋值时会将字符串常量入内存池,当其他变量再赋相同值时,不再在堆空间开辟内存
new构造方法会开辟两块堆内存空间,可以使用intern手工入池
public class Thrd{ public static void main(String[] args) { String str1="zibo"; String str2="zibo"; System.out.println(str1==str2); System.out.println(str1.equals(str2)); String str3=new String("zibo").intern(); System.out.println(str1==str3); System.out.println(str1.equals(str3)); } }
String类一旦声明不可改变,因此在进行大批量修改时会产生大量的垃圾
public class Thrd{ public static void main(String[] args) { String str="zibo"; for(int i=0;i<10;i++){ str+=i; } System.out.println(str); } }
观察认为构造垃圾前后的内存状态(使用Runtime类)
public class Thrd{ public static void main(String[] args) { //Runtime run=new Runtime(); Runtime run=Runtime.getRuntime(); //内存状态 System.out.println("内存状态"); System.out.println("totalMemory()"+run.totalMemory()); System.out.println("maxMemory()"+run.maxMemory()); System.out.println("freeMemory()"+run.freeMemory()); //构造垃圾 String str="zibo"; for(int i=0;i<2000;i++){ str+=i; } System.out.println("构造垃圾后的内存状态"); System.out.println("totalMemory()"+run.totalMemory()); System.out.println("maxMemory()"+run.maxMemory()); System.out.println("freeMemory()"+run.freeMemory()); } }
gc回收
public class Thrd{ public static void main(String[] args) { //Runtime run=new Runtime(); Runtime run=Runtime.getRuntime(); //内存状态 System.out.println("内存状态"); System.out.println("totalMemory()"+run.totalMemory()); System.out.println("maxMemory()"+run.maxMemory()); System.out.println("freeMemory()"+run.freeMemory()); //构造垃圾 String str="zibo"; for(int i=0;i<2000;i++){ str+=i; } run.gc(); System.out.println("gc认为回收垃圾以后的内存状态"); System.out.println("totalMemory()"+run.totalMemory()); System.out.println("maxMemory()"+run.maxMemory()); System.out.println("freeMemory()"+run.freeMemory()); } }
【当需要进行频繁操作字符串时】
可以使用StringBuffer(synchronized线程安全的)或者StirngBuilder(not Thread safe),这是最大的区别
拿StringBuffer说话,
StringBuffer可以和String相互转换
1、利用构造函数
2、用方法实现