String类的特性
String实质是字符数组,两个特点:
1、该类不可被继承;
2、不可变性(immutable),是线程安全的;
private final char value[];
源码注释:
Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings.Because String objects are immutable they can be shared.
这句话总结归纳了String的一个最重要的特点:String是值不可变(immutable)的常量,是线程安全的(can be shared)。接下来,String类使用了final修饰符,表明了String类的第二个特点:String类是不可继承的。
String s1 = "mystring";
String s1 = new String("myString");
是否可以重写String?
不可以,因为String是final类,是不可变的,即使重写后,在类加载时,双亲委派模型检查时也不会加载重写的String类。
String的三种定义方法?
直接定义,如:String s1 = “myString”;
使用关键字new,如:String s1 = new String(“myString”);
串联生成,如:String s1 = “my” + “String”;
1 直接定义
直接定义过程:在程序编译期,编译程序先去字符串常量池检查,是否存在“myString”,如果不存在,则在常量池中开辟一个内存空间存放“myString”;如果存在的话,则不用重新开辟空间。然后在栈中开辟一块空间,命名为“s1”,存放的值为常量池中“myString”的内存地址。
2 使用关键字new
String str2 = new String(“ABC”);至少创建一个对象,也可能两个。因为用到new关键字,肯定会在heap中创建一个str2的String对象,它的value是“ABC”。同时如果这个字符串再java String池里不存在,会在java池里创建这个String对象“ABC”。
3 串联生成
示例一:
String str1 = "java";
String str2 = "java";
System.out.println(str1 == str2); //true
示例二:new会在堆中生成对象实例
String str1 = new String("java");
String str2 = new String("java");
System.out.println(str1 == str2); //false
示例三:
String str1 = "java";
String str2 = "blog";
String s = str1 + str2;
System.out.println(s == "javablog"); //false
示例四:
String str1 = "javablog";
String str2 = "java"+"blog"; //在编译时被优化成String str2 = "javablog";
System.out.println(str1 == str2); //true
示例五:
String s1 = "java";
String s2 = new String("java");
System.out.println(s1.intern() == s2.intern()); //true
System.out.println(v1 == v2); //false
Boy-20180507