String类的特性

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类的特性_第1张图片
String内存结构

是否可以重写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

你可能感兴趣的:(String类的特性)