Stirng.intern和java类加载机制

73 阅读1分钟

String

常量找池,加变量找堆

public class TestString {
    public static void main(String[] args) {
        String s1=new String("abc");
        String s2="abc";
        String s3=new String("abc");
        System.out.println(s1==s2); //false
        System.out.println(s1==s3); //false
        System.out.println(s2==s3); //false

        System.out.println("==============");
        // intern 直接去常量池中找,看图
        System.out.println(s1==s1.intern());// fasle
        System.out.println(s2==s2.intern());// true
        System.out.println(s1.intern()==s2.intern()); // true

        //
        String s4= "java";
        String s5= "ja";
        String s6 ="va";
        System.out.println("==============");
        System.out.println(s4=="java");// ture
        System.out.println(s4==(s5+s6)); // false
        System.out.println(s4=="ja"+s6); // false
        System.out.println(s4=="ja"+"va"); // true

    }
}

java 类加载机制

类加载顺序:从父到子,静态先行,普通代码块优于构造方法。

class Father{
    //构造方法
    public Father(){
        System.out.println("11111");
    }
    //普通代码块
    {
        System.out.println("22222");
    }
    // 静态代码块 静态代码块只加载一次
    static {
        System.out.println("33333");
    }
}
class Son extends Father{
    // 构造方法
    public Son(){
        System.out.println("44444");
    }
    // 普通代码块
    {
        System.out.println("55555");
    }
    // 静态代码块 静态代码块只加载一次
    static {
        System.out.println("66666");
    }

}
public class Test {
    public static void main(String[] args) {
        System.out.println("===============1===================");
        //第一次:
        Son son1 = new Son();
        /*
        * 运行后的执行顺序和结果:
        * 33333 # 先Father 中的静态代码块
        * 66666 # #再Son中的静态代码块
        * 22222 # Father 中的普通代码块
        * 11111 # Father 构造方法中的代码
        * 55555 # Son中的普通代码块
        * 44444 # Son 构造方法中的代码
        * 口诀:从父到子,静态先行,普通代码块由于构造方法中的代码块。
        *
        *
        * */
        System.out.println("===============2===================");
        //第二次:
        Son son2 = new Son();

        System.out.println("===============3===================");
        //第3次:
        Father father = new Father();

    }

}

运行以上代码的结果:

image.png