字符串的特性
- String是一个final类,代表不可变的字符序列
- 字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的
举例
//以下语句创建了几个对象?画出内存布局图。
String s1 = "hello";
s1 = "haha";
//创建了两个对象
//下面语句创建了几个对象
String a = "hello" + "abc";
//创建了一个对象
//String a = "hello" + "abc"; //===> 编译器优化后 String a = "helloabc";
//创建了几个对象?画出内存图
public class StringExercise08 {
public static void main(String[] args) {
String a = "hello"; //创建 a 对象
String b = "abc"; //创建 b 对象
//分析源码
//1.先创建一个 StringBuilder()
//2.执行 sb.append("hello");
//3.sb.append("abc");
//4.String c = sb.toString()
//最后其实是 c 指向堆中的对象(String) value[] -> 池中 "helloabc"
String c = a + b;
//String c = "hello" + "abc"; //注意与上面完全不同
//一共有三个对象,但是并不简单
//小结:底层是 StringBuilder sb = new StringBuilder();sb.append(a);sb.append(b);sb是在堆中,并且append 是在原来字符串的基础上追加的
//重要提示:String c1 = "ab" + "cd"; 常量相加,看的是池。String c1 = a + b;变量相加,是在堆中
}
}
//下面代码输出什么,并说明原因
String s1 = "hspedu";
String s2 = "java";
String s5 = "hspedujava";
String s6 = (s1 + s2).intern(); //指向 s1 + s2字符串的的常量池地址
System.out.println(s5 == s6); //T
System.out.println(s5.equals(s6)); //T
public class StringExercise04 {
String str = new String("taotao");
final char[] ch = {'j','a','v','a'};
public void change(String str,char ch[]){
str = "java";
ch[0] = 'h';
}
public static void main(String[] args) {
StringExercise04 ex = new StringExercise04();
ex.change(ex.str,ex.ch); //str = taotao, ch = java
System.out.println(ex.str + "and"); //taotao and hava
System.out.println(ex.ch); //
}
}