String类
该类一旦产生一个字符串,其对象就不可变。
- String类使用private final char value[]来实现字符串的存储,也就是说,String对象创建够,就不能再改变此对象中存储的字符串内容。
String类有一个特殊的创建方法,就是使用”“双引号来创建,例如new String(“jinder”)实际创建了2个String对象。一个是”jinder”通过”“创建的。另一个是通过new创建的。只不过他们创建的时期不同。一个在编译期,一个在运行期。
运行时期,调用String类的intern方法,就可以向String Pool中动态添加对象。
String类的创建方法
- 直接使用”“引号创建
- 使用new String()创建
- 使用new String(“someString”)创建以及其他一些重载构造函数创建
- 使用重载的字符串连接符”+”创建
在Java中使用new关键字会创建一个新的对象。不管在String Pool中是否已经有值相同的对象,都会在heap中创建一个新的对象。
String s1 = new String("777");
String s2 = "aaa777";
Stirng s3 = "aaa" + "777";
String s4 = "aaa" + s1;
System.out.println(s2 == s3); //true
System.out.println(s2 == s4); //false
System.out.println(s2 == s4.intern()); true
line6: 由于s1是变量,在编译期不能确定它的值是多少,所以会在执行的时候创建一个新的String对象存储在heap中,然后赋值给s4.
line7:S4调用intern方法,是s4所引用的对象动态的添加到常量池中。然后与s2比较。因为都在常量池中所以”==”返回true。
StringBuffer
StringBuffer类是字符串缓冲区,跟String类似用来存储字符串数据。如果要修改一个StringBuffer类的字符串,就不需要再穿坚信的字符串对象。StringBuffer类属于java.lang包。
示例:在一下程序中,创建了几个对象?
String A, B, C;
A = "a";
B = "b";
A = A + B;
StringBuffer D = new StringBuffer("abc");
D = D.append("567");
line2: 创建一个对象”a”和一个引用A;
line3: 创建一个对象”b”和一个引用B;
line4: 创建一个对象,并由原来的A来引用,原来A所指向的对象就会变成垃圾对象,等待回收。
line5: StringBuffer的特点是改变对象本身而不创建新的对象,因此第6行都是对同一个对象进行处理。而字符串对象也是一个对象,固有两个对象。
所以,一共创建了5个对象。
面试题目
一、字符串字面量是否自动生成一个String对象
答案是肯定的,字符串类具有一定的特殊性,JVM在执行双引号操作符的时候,会自动创建一个String对象,并返回这个对象的引用
二、StringBuffer和StringBuilder存在的作用是什么?
在Java程序里,如果需要大量拼接字符串的话,应该使用StringBuffer和StringBuilder类,他们可以避免不必要的String对象的产生,以提高程序的性能。他们功能相似,只不过StringBuilder是线程安全的。