方式一: String s = "abc"
方式二: String s2 = new String("abc")
分析: 方式一,先从常量池看有没有“abc”的字符串,如果有s直接指向该字符串,如果没有则在常量池中创建一个,然后再指向。s最终指向的是常量池的空间地址;
方式二,先在堆中创建一个String对象维护一个value属性值,value直接指向常量池的“abc”,如果没有则在常量池中创建一个,然后再指向“abc”。S2最终指向的是堆中的对象。(间接指向常量池的“abc”)。
练习题1
String s = "abc";
String p = "abc";
System.Out.Println (s.equals(p));
System.Out.Println (s == p);
输出:
true
true
练习题2
package WrapperClass;
public class StringExercises {
public static void main(String[] args) {
String a = "abc"; //指向常量池的“abc”
String b = new String("abc"); //指向堆中的对应的对象
System.out.println( a.equals(b)); //String的equals源码,是比较的字符数组
System.out.println(a == b);
System.out.println(a == b.intern());
System.out.println(b == b.intern());
// 调用intern方法时,如果池中已经包含由equals(object)
// 方法确定的等于此string对象的字符串,则返回池中的字符串。
// 否则,此String对象将被添加到池中,并返回对此String对象的引用。
}
}
练习题3、4
package WrapperClass;
public class StringExercises01 {
public static void main(String[] args) {
//问题一
String a = "abc"; //a 指向常量池中的"abc"
String b = "bbc"; //b 指向常量池中的"bbc"
String c = "abc"+"bbc"; //编译器运算字符串相加后,c 指向常量池中的"abcbbc"
//请问以上代码一共创建了几个对象,请画出内存结构图
//
//问题二
String p = "abc"; //p 指向常量池中的"abc"
String q = "bbc"; //q 指向常量池中的"bbc"
String s = p+q; //1、底层先创建一个StringBuilder
// 2、调用append将p,q追加到数组
// 3、创建一个String new String(value,0,count)
// 4、s指向堆中的String对象,该对象的value指向常量池中的"abcbbc"
System.out.println(s == c); //false, 验证s 不等于 c
//请问以上代码一共创建了几个对象,请画出内存结构图
}
}
练习题5
public class StringExercises02 {
public static void main(String[] args) {
String s1 = "java";
String s2 = "python";
String s3 = "javapython";
String s4 = (s1+s2).intern();
System.out.println(s3 == s4); //T
System.out.println(s3.equals(s4)); //T
//知识点
// intern(), equals() , s1+s2
}
}
练习题6
package WrapperClass;
public class StringExercise03 {
public static void main(String[] args) {
test ex = new test();
ex.change(ex.str, ex.ch);
//传值机制:仅仅是一份复制拷贝, 相当于复制了一份"python"的引用给
//change方法的参数,修改改参数的引用,并不影响ex.str
//但是修改数组值,可以改变ex.ch的值
System.out.print(ex.str + " and ");
System.out.println(ex.ch);
//请画出以上过程的内存结构并分析输出结果
//输出 python and hava
}
static class test {
String str = "python";
char[] ch = {'j','a','v','a'};
public void change (String str,char[] ch) {
str = "java";
ch[0] = 'h';
}
}
}