String、StringBuffer和StringBuilder

习题一

// 画出如下几行代码的结构
       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对象的规范化表现形式。

你可能感兴趣的:(String、StringBuffer和StringBuilder)