String巩固

About String in Java

				如今做了一个重大决定,不定期温习The Basement Of Java
  1. String对象的认知简述
    首先 String不属于 8种基本数据类型, String是一个对象。 因为对象的默认值是null。但它又是一种特殊的对象,有其对象没有的一些特性。
    new String()和new String("")都是声明一个空字符串,而不是null。
  2. 常量池(constant pool)
    常量池指的是在编译期被确定,并保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
  3. 字符串池
    在JVM中存在着一个字符串池,其中保存着许多String对象,并且可以被共享使用,因此它提高了效率。String类是final的,它的值一经创建便不可改变,因此我们不用担心String由于共享而带来的程序混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。
  • 例1
    public class Test {
    public static void main(String args[]) {
    String str0 = "abc";
    String str1 = "abc";
    String str2 = "a" + "bc";
    System.out.println(str0 == str1);
    System.out.println(str0 == str2);
    }
    }
    运行结果:
    true
    true
    解释:Java会确保一个字符串常量只有拷贝, 因为例子中的 str0和 str1中的” 中的” abc ”都是字符串常量, 它们在编译期就被确定了,所以 str0== str1为 true ;而” a”和” ” 和bc ”也都是字符,当一个字符由多个字符串连接而成时它自己肯定也是字符串常量,所以 s2 也同样在编译期就被解析为一个字符串常量。所以得出
    str0 = str1 = str2
  • 例2
    public class Test {
    public static void main(String args[]) {
    String str0 = "kvill";
    String str1 = new String("kvill");
    String str2 = "k" + new String("ill");
    System.out.println(str0 == str1);
    System.out.println(str0 == str2);
    System.out.println(str1 == str2);
    }
    }
    运行结果:
    false
    false
    false
    例2中str0还是常量池中”kvill”的应用,str1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,str2因为有后半部分new String(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的应用。
    明白了这些也就知道为何得出此结果了
原文地址:https://www.cnblogs.com/wzk1992/p/9000297.html