习题一
// 画出如下几行代码的结构
String s1 = "hello"; // value存储在常量池内
String s2 = "hello"; // value存储在常量池内 和s1指向同一个值
String s3 = new String("hello"); // 创建两个对象一个是在堆中创建, 一个是在char [] 中创建 指向常量池
s1 += "world"; // value改变到堆中,堆中指向一个地址值, 然后这个地址值指向常量池,在常量池中新建一个value被指向
s1 和 s2指向同一个值,值储存在常量池内。
s3 会引用一个新的对象。
习题二:如何理解String类的不可变性
不可变性,是因为我们在改变一个 String
的值时其实不是对以前的值进行修改
而是建立一个新的值并把新的引用指向这个新的值。
习题三 String s = new String("hello");
在内存中创建几个对象
当JVM遇到上述代码时,会先检索常量池中是否存在“abc”,如果不存在“abc”这个字符串,则会先在常量池中创建这个一个字符串。
然后再执行 new
操作,会在堆内存中创建一个存储“abc”的String对象,对象的引用赋值给str2。此过程创建了2个对象。
习题四 String
, StringBuffer
, StringBuild
三者的对比
String
是不可变的字符序列 效率三者最差
StringBuffer
可变的字符序列 线程安全,效率三者中等
StringBuilder
可变的字符序列 线程不安全, 效率三者第一
三者的底层都是char [] 存储
习题五 判断下列输出内容
String str1 = "老王";
String str2 = "老王";
String str3 = new String("老王");
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1.equals(str3)); // true
str1 = "老张隔壁";
str2 = "老张";
String str4 = "隔壁";
String str5 = "老张" + "隔壁";
System.out.println(str1 == str5); // true
String str6 = (str2 + str4).intern();
System.out.println(str1 == str6);// true
intern()
方法返回String对象的规范化表现形式。