关于String,你了解多少?这里带你重新认识一下String、StringBuffer和StringBuilder到底是怎么一回事。
String
String
类代表字符串。Java 程序中的所有字符串字面值(如"abc"
)都作为此类的实例实现。字符串是常
量,它们的值在创建之后不能更改。
String源码:
由String源码中的final关键字可知,String一旦被赋值就不可在改变,那么,代码里我们经常做这样的操作又
是怎么回事?
其实在第一次给str赋值的过程中,已经在堆中创建了一个地址,用于存放str的值“a”。但是在第二遍str赋值的
过程中,其实并没有覆盖原来的“a”,只是又重新创建了一块地址,存放“b”,所以它的内存显示如下:
也就是说,String的实例一旦被赋值就不可以再改变,可以改变的只是String实例的引用。至于未被引用的
值,将会被GC(Garbage Collection)回收。
StringBuffer(JDK1.0)
看了String,就知道StringBuffer为什么出现了。StringBuffer是可变的字符串序列,相较于String而
言,StringBuffer可以处理多条字符串,并且可以用Append或者Insert改变当前实例的长度和值。
StringBuilder(JDK5.0)
StringBuilder与StringBuffer类似,都是可变的字符串序列,可用的方法也是append和insert。在单线程的使用
中,与StringBuffer相比,StringBuilder的运行速度更快。但是如果用StringBuilder去实现多线程是不安全的,此时宜
用StringBuffer。
总结
这里再提一下String和StringBuilder吧。最近在看《java特种兵》,里边String语句在compile的时候,如果遇到变
量的时候,都是通过StringBuilder进行编译的。举个“栗子”:
//源码
public static void test(){
String a = "a" ;
String b= a + "b";
String compare = "ab";
System.out.println( b == compare );
}
//编译器编译的代码
String a="a";
StringBuilder temp=new StringBuilder();
temp.append(a).append("b");
String b=temp.toString();
具体的编译器的实现指令还在研究,有兴趣的可以跟我一起研究研究。