java学习笔记-String相关知识点

时间:2023-02-25 22:40:35
  1. java的类成员变量,java会自动初始化,默认初始化类型的零值。局部变量必须显式初始化才能使用,否则编译器会报错。
  2. java对String的”+”运算符提供了特别支持,使用的是StringBuilder或StringBuffer的append()方法
  3. Arrays.copyOf(char []original,int newLength); 复制char数组的方法,复制original数组到一个新数组并返回新数组,newLength为新数组的长度,若newLength大于原数组长度,返回新数组多余部分填充空值,若小于则截断。
  4. 凡用字面量创建的字符串对象存储在虚拟机方法区的常量池中,如 String s = "abc"。而通过 new 创建的对象储存在java堆中。
public class TestString {
    public static void main(String[] args) {
        String  str = "abcd";  //字符串常量,在编译期就确定了
        String s = "d";
        String str1 = "abc"+"d"; //多个字符串常量连接,结果也为字符串常量,在编译期确定
        System.out.println(str1==str); //true

        String str2 = "abc"+new String("s"); //后部分在编译期不能确定,str2为在java堆新创建的对象
        System.out.println(str==str2);  //false

        String str3 = "abc"+s;   //s引用在编译期仍不能确定,str3为在java堆新创建的对象
        System.out.println(str==str3);  //false


        //str.intern() String的intern方法:当String实例调用intern方法时,
        // 到常量池查找是否有该实例的常量,若有返回常量引用,若无,创建该实例常量并返回其引用。
        String str4  = str.intern();
        System.out.println(str==str4); //true,str指向字面量,两者指向常量池同一内存。
        System.out.println(str2==str4); //false ,str2的对象在java堆上,不在常量池
        System.out.println(str3==str4); //false ,str3同样在java堆,不相等

        //String类的不可变性带来的结果就是,每一次"+"连接操作都会生成一个String对象,
        // 具体在java堆生成还是常量池生成取决于是否能在编译期确定,如str在常量池生成,str2、str3在java堆中
        String str5 = "welcome "+"to "+"java "+"world"; //除4个直接量对象和最终的str5对象,还生成了
        //"welcomet to"、"welcome to java "2个临时对象。因此,存在多个字符串连接时使用StringBuilder

        //补充
        //基本数据类型常量及经final修饰过的字段也能在编译期确定
        String string = "abc1";
        String str6 = "abc"+1;
        System.out.println(string==str6);  //true,1为基本数据类型,可在编译期确定
        final String d = "d";
        String str7 = "abc"+d;
        System.out.println(str==str7);  //true,final修饰的变量在编译期可确定

    }
}