String与StringBuilder以及StringBuffer区别
String是常量,定义的语法为:String myString = "this is a String";
作为常量,String定义完成后就无法修改了,而我们见到的myString = "this is a new String";
并不是修改了其原来的值,而是新建了一个字符串指向了原来的内存地址,而之前的字符串因为没有了指向,所以会被GC进行回收。
输出分析:
String a = "aa";
String b = "bb";
String c = a + b;
String t1 = "aa";
String t2 = new String("aa");
String t3 = "aa" + "bb";
String t4 = "aabb";
System.out.println(a == t1);
System.out.println(a == t2);
System.out.println(c == t3);
System.out.println(t3 == t4);
a==t1为true,字串符有常量池,再次出现的值会从常量池中获取;
a==t2为false,new关键字创建了新的对象,所以不是从常量池中获取;
c==t3为false,字符串变量进行加号操作,会生成新的对象;
t3==t4为true,字符串直接相加,不是通过变量的形式进行加操作,等同于一个字符串。
StringBuilder是开发中经常用到的,原因在于:StringBuilder非线程安全,但是效率要高于StringBuffer,因此在单线程的情况下,大多使用StringBuilder。而StringBuffer中的public方法(除构造方法)都是用synchronized修饰的,多线程的情况下保证了其安全性。在IO的学习中,Buffer结尾的一般都是具有缓冲功能的,StringBuffer也不例外,其toString方法就是使用了缓冲机制。
StringBuilder的toString方法
StringBuffer的toString方法