String在JAVA 内部是用 private final char value[]实现。
JAVA生成一个字符串方式有:
(1)String a = "ab";
(2)String b = new String("ab");
JAVA中为了提高运行效率,字符串虽然是对象,不过认为是常量,存储在class文件中,Constant Pool区域中。他是在内存的方法区中存储。内存为空的字符串也会在Constant Pool区域中建立一个长度为0内容为空的字符串。
对于(1)来说字符串在编译期创建
对于(2)来说字符串在运行期创建
(2)可以通过String.intern()方法,将存储在堆中的字符串变量添加到String pool中。
String 的比较:
== 是比较地址 equal 是比较内容
举例:
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
s1 == s2 都指向字符串常量,存储在常量池里。
s1!= s3
s1.equal(s3) --> true 内容相同。
下面看intern的用法。
s3.intern() 将s3内容加入到常量池中,但是常量池中已有同样的内容。则不在新建。
s1==s3
StringBuffer会在一开始就默认声明一个固定大小的char数组,值为16。在编译期间能确定字符串大小情况下,使用"+"效率更高。
StringBuffer是为了解决String不可变性提出。
例题:
String A,B,C;
A = "a";
B = "b";
A = A + B;
StringBuffer D = new StringBuffer("abc");
D = D.append("567");
上述共创建了多少对象?
A aa ;aa叫做引用变量,不是对象。对象是通过new创建的。所以题目中D只是一个引用变量,不是对象。而字符串"abc"是对象。
StringBuffer D = new StringBuffer("abc")创建了两个变量,一个是StringBuffer,一个是"abc"。D是引用变量指向了StringBuffer对象。