自动装箱和拆箱(包装和解包)

自动装箱:就是把基础数据类型自动封装并转换成对应的包装类的对象。
拆 箱 :就是把包装类的对象自动解包并转换成对应的基础数据类型。

public class BoxDemo {

    public static void main(String[] args) {
        //demo1();
        demo2();

    }
    private static void demo2() {
        //Integer类型的自动装箱细节:一个字节范围内的整数(-128~127),是把值直接放在栈中的。一个字节范围以外的数据是放在堆中的,栈中放的是地址
        Integer a1 = 100;
        Integer a2 = 100;
        System.out.println(a1==a2);//true

        Integer a3 = 200;
        Integer a4 = 200;
        System.out.println(a3==a4);//false

        Integer a5 = 100;//是装箱,且数据范围在一个字节之内,数据放在栈中
        Integer a6 = new Integer(100);//显式new的,数据是在堆中开的---不是装箱
        System.out.println(a5==a6);//false

        System.out.println("================");

        //Integer类型对象如果和一个具体的数值比较,那么会自动拆箱(把其中的值取出来) 再和数值比较
        Integer a7 = new Integer(200);
        Integer a8 = 200;
        System.out.println(a7==200);//true
        System.out.println(a8==200);//true

    }
    private static void demo1() {
        Integer a1 = 100; //自动装箱 ---把基本数据类型的数据直接赋给一个包装类对象(引用),Java自动帮我们封装成一个对象
        System.out.println("a1="+a1);

        Integer a2 = new Integer(100);
        int i = a2;//自动拆箱
        System.out.println("i="+i);
        System.out.println(a1==a2);//false
        System.out.println(a1==100);//true
        System.out.println(a1==i);//true

        System.out.println("============");
        System.out.println(a1.hashCode());
        System.out.println(a2.hashCode());
    }

}
public class BoxDemo2 {

    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";
        System.out.println(str1==str2); //true
        System.out.println( str1.equals(str2) );//true

        System.out.println("============");

        String str3 = new String("abc"); //只要一new就在堆中新开一块内存空间
        String str4 = new String("abc");
        System.out.println(str3==str4); //false
        System.out.println( str3.equals(str4) );//true

        System.out.println("============");
        System.out.println(str1==str3); //false
        System.out.println(str1=="abc");//true   拆箱后再比较---把具体的数据取出来比较
        System.out.println(str3=="abc");//false  str3本身就是显式new出来,不存在拆箱问题,因此直接拿栈中的数据去比较


        //总之,以后要比较字符串的内容是否相等,
        //一定用 str.equals() 或 str.equalsIgnoreCase()

        //※String类中的所有字符串处理方法,都不会在原对象上修改,而是返回一个新对象。
        //※因此凡是String型变量(对象),无论是不是new出来,判断"=="都是使用基本数据类型的用法,即判断栈中的数据 ---传参也一样,可以直接理解成值传递

        String s="2";
        String s2="23";
        s2=s2.substring(0, 1);//返回的是一个新new的String对象
        System.out.println(s==s2);//false
        System.out.println(s.equals(s2));

        String ss = "abc";
        aa(ss);
        System.out.println("ss: "+ss);
        String ss2 = new String("abc");
        aa(ss2);
        System.out.println("ss2: "+ss2);


        String sss="aa"+"bb"+"cc"+"dd"; //StringBuffer StringBuilder
    }

    public static void aa(String str){
        str=str+"ok";
    }

}

猜你喜欢

转载自blog.csdn.net/qq_38431927/article/details/77845972