String的特性
- String类:代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
- String是一个final类,不可被继承。
- String实现了Serializable接口:表示字符串是支持序列化的
- String实现了Comparable接口:表示String可以比较大小
- Stirng内部定义了final char[] value用于存储字符串数据
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
String:代表不可变的字符串序列。简称“不可变性”。
- 1、当对字符串重写赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 2、当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 3、当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值
- 通过字面量的方式(String s1=”abc”),区别于new,给一个字符串赋值,此时的字符串声明在字符串常量池中。
- 字符串常量池中是不会存储相同内容的字符串的。
String对象的创建
String str = "hello";
//本质上this.value = new char[0];
String s1 = new String();
//this.value = original.value;
String s2 = new String(String original);
//this.value = Arrays.copyOf(value, value.length);
String s3 = new String(char[] a);
String s4 = new String(char[] a,int startIndex,int count);
面试题
String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?
答案
两个。一个是在堆空间中new结构,另一个是char[]对应的常量池中的数据:”abc”。