java中栈与堆的内存关系

 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中。

 堆:存放new出来的对象,注意创建出来的对象只包含各自的成员变量,不包括成员方法。

public class ZhanDui {
    public static void main(String[] args) {
        int a=400;
        int b=400;
        //a和b均是普通类型(int)的变量,所以数据直接存储在栈中,而栈有一个很重要的特性:栈中的数据可以共享。当我们定义了int a = 400;,再定义int b = 400;
        // 这时候会自动检查栈中是否有400这个数据,如果有,b会直接指向a的400,不会再添加一个新的400。
        System.out.println("a==b"+(a==b));
        Integer i=400;//他们维护的常量仅仅是【-128至127】这个范围内的常量
        Integer ii=400;//如果常量值超过这个范围,就会从堆中创建对象,不再从常量池中取
        System.out.println("i==ii"+(i==ii));//很明显超过了127,无法从常量池获取常量,就要从堆中new新的Integer对象
        Integer i2=new Integer(100);
        Integer i3=new Integer(100);
        System.out.println("i2==i3"+(i2==i3));
        //i2和i3均是引用类型,在栈中存储地址,因为Integer是包装类。
        // 但是由于他们各自都是new出来的,因此不再从常量池寻找数据,而是从堆中各自new一个对象,然后各自保存指向对象的地址,所以i2和i3不相等,因为他们所存地址不同,所引用到的对象不同。
        Double d1=2.0;
        Double d2=2.0;
        System.out.println("d1==d2"+(d1==d2));
        // d1和d2均是引用类型,在栈中存储对象地址,因为Double是包装类。
        // 但Double包装类没有实现常量池技术,因此Doubled1=2.0;相当于Double d1=new Double(2.0);
        // 是从堆new一个对象,d2同理。因此d1和d2存放的地址不同,指向的对象不同,所以不相等。

        System.out.println("-------------------------------");
        //String类型
        //对于字符串,其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。
        // 对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
        String s1="aa";
        String s4="aa";
        String s2=new String("aa");
        String s3=new String("aa");
        System.out.println(s1==s4);//true  "==" 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。
        System.out.println(s2.equals(s3));//true  equals()方法用来比较的是两个对象的内容是否相等
        System.out.println(s2==s3);//false
        System.out.println(s1==s2);//false
        System.out.println(s1.equals(s2));//true
        //使用双引号直接定义的String对象会指向常量池中的同一个对象,通过new产生一个字符串(假设为“aa”)时
        // 会先去常量池中查找是否已经有了“aa”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”aa”对象的拷贝对象。

    }
}

输出结果:

a==btrue
i==iifalse
i2==i3false
d1==d2false
-------------------------------
true
true
false
false
true

Process finished with exit code 0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值