Java的int和Integer 与自动装箱拆箱

https://blog.csdn.net/chenliguan/article/details/53888018中的介绍很详细

补充内容如下:

public static Integer c;
    public static int d;
    public static void main(String[] args) {
        System.out.print(c);   //null
        System.out.print(",");
        System.out.println(d); //0

        Integer x = new Integer(100);
        Integer y = new Integer(100);
        System.out.print(x == y);    //false 不是同一对象,不在同一地址
        System.out.print(",");
        System.out.println(x.equals(y));  //数值是相等的

        Integer i = 100;
        Integer j = 100;
        System.out.print(i == j);   //true -128到127之间自动装箱为Integer对象时会缓存(享元模式) 因此是同一对象,在同一地址
        System.out.print(",");
        System.out.println(i.equals(j));//true 数值是相等的

        Integer a = 128;
        Integer b = 128;
        System.out.print(a == b);   //false -128到127之外自动装箱为Integer对象时不会缓存 因此不是同一对象,不在同一地址
        System.out.print(",");
        System.out.println(a.equals(b));//ture数值是相等的

        Integer m = 1;
        Double n = 2.0;
        System.out.println(true ? m : n); // 1.0 在一个条件表达式中混合使用 Integer 和 Double 类型, Integer 值就会拆箱,提升为 double, 再装箱为 Double

        //== 比较两个变量的数值地址是否相同(确切的说,是堆内存地址)   equals比较两个数值的内容是否相同只在装饰器类中是这样,其他用户自定义类比较多时对象内存地址 
        //创建字符串的方式 String a1="a"; String a2=new String("a"); String a3="a"+"b"; String a4 = a1  
        String s1,s2,s3 = "abc", s4 ="abc", s5;
        s1 = new String("abc");
        s2 = new String("abc");
        s5 = s1;
        System.out.println("s1==s2:"+(s1==s2));//false s1 s2创建对象的方式则每次new的对象都不是同一个对象
        System.out.println("s1==s3:"+(s1==s3));//false
        System.out.println("s3==s4:"+(s3==s4));//true  s3 s4创建对象的方式JVM首先会去String池中找这个对象是否存在 如果存在相同数值的对象则不再去创建新的对象 因此s3和s4实际是同一对象
        System.out.println("s1==s5:"+(s1==s5));//ture
        System.out.println("s1.equals(s2):"+(s1.equals(s2)));//true
        System.out.println("s1.equals(s3):"+(s1.equals(s3)));//true
        System.out.println("s3.equals(s4):"+(s3.equals(s4)));//true
        System.out.println("s1.equals(s5):"+(s1.equals(s5)));//true

        String str1 = "abc";
        String str2 = "a"+"b"+"c";
        System.out.println(str1==str2); //true
    }

通过堆栈理解上述内容

关于定义String的堆栈问题  原文链接:https://blog.csdn.net/weixin_39727976/article/details/114181292

String s =new String()分析堆与栈,是先定义S,还是先new string()

1. String str1 = "abc";

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

步骤:

1) 栈中开辟一块空间存放引用str1;

2) String池中开辟一块空间,存放String常量"abc";

3) 引用str1指向池中String常量"abc";

4) str1所指代的地址即常量"abc"所在地址,输出为true;

2. String str2 = new String("abc");

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

步骤:

1) 栈中开辟一块空间存放引用str2;

2) 堆中开辟一块空间存放一个新建的String对象"abc";

3) 引用str2指向堆中的新建的String对象"abc";

4) str2所指代的对象地址为堆中地址,而常量"abc"地址在池中,输出为false;

3. String str3 = new String("abc");

System.out.println(str3 == str2);

步骤:

1) 栈中开辟一块空间存放引用str3;

2) 堆中开辟一块新空间存放另外一个(不同于str2所指)新建的String对象;

3) 引用str3指向另外新建的那个String对象 ;

4) str3和str2指向堆中不同的String对象,地址也不相同,输出为false;

4. String str4 = "a" + "b";

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

步骤:

1) 栈中开辟一块空间存放引用str4;

2) 根据编译器合并已知量的优化功能,池中开辟一块空间,存放合并后的String常量"ab";

3) 引用str4指向池中常量"ab";

4) str4所指即池中常量"ab",输出为true;

5. final String s = "a"; //注意:这里s用final修饰,相当于一个常量

String str5 = s + "b";

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

步骤:

同四

6. String s1 = "a";

String s2 = "b";

String str6 = s1 + s2;

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

步骤:

1) 栈中开辟一块中间存放引用s1,s1指向池中String常量"a",

2) 栈中开辟一块中间存放引用s2,s2指向池中String常量"b",

3) 栈中开辟一块中间存放引用str5,

4) s1 + s2通过StringBuilder的最后一步toString()方法还原一个新的String对象"ab",因此堆中开辟一块空间存放此对象,

5) 引用str6指向堆中(s1 + s2)所还原的新String对象,

6) str6指向的对象在堆中,而常量"ab"在池中,输出为false

7. String str7 = "abc".substring(0, 2);

步骤:

1) 栈中开辟一块空间存放引用str7,

2) substring()方法还原一个新的String对象"ab"(不同于str6所指),堆中开辟一块空间存放此对象,

3) 引用str7指向堆中的新String对象,

8. String str8 = "abc".toUpperCase();

步骤:

1) 栈中开辟一块空间存放引用str6,

2) toUpperCase()方法还原一个新的String对象"ABC",池中并未开辟新的空间存放String常量"ABC",

3) 引用str8指向堆中的新String对象

9.String s="abc";

String s1=s;

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

s=s+"hello";

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

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

步骤:

1)栈中开辟一块空间存放s;

2)Sting池中开辟一块空间用于存放"abc",栈中开辟一块空间存放变量s1;

3)系统输出true,在堆中开辟一块空间用于存放"abchello";

4)引用s指向堆中的"abchello";

5)系统输出true,然后输出false;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值