public class StringTest1 {

    public static void main(String[] args) {

        //=================题1:字符串创建有两种方式,这两种方式有何区别是什么????==============================

        //方式1: 字面量赋值创建

        String str1 = "inbai";
        String str2 = "inbai";
        String str3 = "net";

        //这样创建字符串,首先会去常量池里找有没有这个字符串,有就直接指向常量池的该字符串,没有就先往常量池中添加一个,再指向它


        //方式2: 用new创建
        String str4 = new String("inbai");
        String str5 = new String("inbai");
        String str6 = new String("net");

        //new一个字符串时,做了两件事:
        // 第一件: 首先在堆中生成了该字符串对象,
        // 第二件: 去看常量池中有没有该字符串,如果有就不管了,没有就往常量池中添加一个, 所以第二种方式,会创建更多的对象.

        System.out.println( str1 == str2 ? "str1 和 str2 等" : "str1 和 str2 不等" ); //我们都在常量池,当然相等

        System.out.println( str4 == str5 ? "str4 和 str5 等" : "str4 和 str5 不等" ); //我们存放的地址不同, 用 == 比较的是我们的地址

        System.out.println( str4.equals(str5) ? "str4 和 str5 等" : "str4 和 str5 不等" ); //我们的值相同, 用 equals 比较的是我们的值

    }

}
public class StringTest2 {

    /**
     * 原理分析:
     *
     *
     * @param args
     */
    public static void main(String[] args) {

        // 请问下题中, str2 和 str3 是否是相等?

        String str1 = "inbai";
        String str2 = str1 +  "net";

        String str3 = "inbainet"; //创建的时候, 先看看常量池里有没有这么个字符串, 一看, 已经有了, 所以str3的地址,就指向常量池地址

        System.out.println(str2== str3 ? "str2 和 str3相等" : "不等"); //因为我们都是来自String的常量池


    }


}