// 源码
public final class Stringimplements 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 //省略其他
}
1.创建字符串
// 1.直接赋值
String str = "Hello BubbleoOoo"
存储方式:str -> 常量池的地址空间 -> "Hello BubbleoOoo"// 2.构造方法中传入字符串
String str = new String("Hello BubbleoOoo");
存储方式:str -> 堆中String对象的地址空间 -> 常量池的地址空间 -> "Hello BubbleoOoo"// 3.构造方法中传入字符数组:将字符数组转为字符串
char[] data = new char[] {'a', 'b', 'c'};
String str = new String(data);// 4.调用String类的静态方法valueOf(任意数据类型):将其他数据类型转为String类型
String str = String.valueOf(10);
2.字符串不可变性
1)被private修饰,故只能在String类中被访问,在类外是无法直接拿到value属性的。类内只有通过成员方法才能访问value,但是类内对外提供的所有方法没有能对value进行修改的
2)被final修饰,则实例化完后value可以看成是一个常量,即其对字符数组对象的指向不能再被更改,但是value指向的字符数组的内容仍然可以被修改
3)将 String 类声明为 final 保证不可继承,子类无法改写方法
3.字符串比较
对于引用类型,== 比较的是地址。对于基本类型变量,==比较的是存储的值
String类重写了父类Object中equals方法,Object中equals默认按照==比较,String重写equals方法后,就会发生动态绑定
// 举例
public class StringExercise04 {public static void main(String[] args) {String s1 = "hspedu"; //指向常量池”hspedu”String s2 = "java"; //指向常量池”java”String s4 = "java"; //指向常量池”java”String s3 = new String("java"); //指向堆中对象System.out.println(s2 == s3); //FSystem.out.println(s2 == s4); //TSystem.out.println(s2.equals(s3)); //TSystem.out.println(s1 == s2); //F}
}