天天看点

揭开java的堆、栈的神秘面纱

欢迎来到程序员的世界,现在是凌晨3点中。。。(瞎扯,其实是下午1点),大家好,我是小铁。没错,就是实力与逗比的结合体,今天我们来聊聊java中的堆、栈

程序员驾到,神魔皆退,哇渣渣渣渣!!!(其实我是一个很正经的程序员)

揭开java的堆、栈的神秘面纱

一、什么是堆、栈

java会把电脑中的内存分为两个部分堆(heap)和栈(stack)。java是自动管理堆和栈的,咱们不能手动的去设置。(不能就不能呗,我觉得咱们java挺幸福的)

二、堆、栈的区别

栈:栈的运行速度比堆快,可以说cpu是老大,他就是老二的那种(哈哈哈哈,就是快没办法啊),但是缺点是必须确定数据和生存周期都必须确定,数据可以共享但是灵活性没有堆高,没有默认值需要手动设置。

堆:聪明的咱们肯定能想到,他们肯定是相对的互补的。没错,堆的灵活性高,适用动态分配地址。因为总是要分配地址,所以相比较的速度就会低,有默认值不需要设置。(聪明的你们想到了么,哈哈哈哈 咳咳咳,咱们继续)

三、java中什么类型存入到栈,什么类型存入到堆呢???

咱们java中数据分为两大类型,一个是8基本数据类型char,byte,short,boolean , int,float,double(注意看 注意看没有String)另外一个就是非基本类型 就是String、List 等等

基本数据类型会存储到栈当中,非基本类型的会存储到堆当中。

四、java程序是如何运行的呢??

第一步 —— main方法是java程序的入口,jvm会先执行,首先会将main方法压入栈中,从栈中开辟出一块空间。(这也就是咱们俗称的压栈)。

第二步 ——.假如咱们定义了一个变量int i = 0; i就会存储到栈当中并且赋值给0

第三步—— 假如咱们创建了一个Person(大写)对象,栈中会存储引用类型的变量,咱们起名为person(小写)并且会在堆中也开辟出一块空间(同时也会有一个内存地址,咱们暂定为x0001) 存储和创建person对象,并且指定到person(小写)引用类型的变量。(这样子就指定好啦)

第四步——对象创建结束后(如果下面还有代码就继续往下走,走), i变量立即释放,空间消失,注意:不是main空间消失只是i的这块空间消失了,但是main的空间依然存在。全部执行完毕之后,main方法弹出,main空间消失(俗称的弹栈)程序结束。

最后我给大家画一张图片吧!!!这样子你们能够更好的理解

揭开java的堆、栈的神秘面纱

五、下面是一些简单的代码测试

1)8基本类型以及实例化对象

package com;

public class Test{

    public static void main(String[] args) {
        int n1 = 0;
        int n2 = 0;
        int n3 = 1;
        String s1 = "s1";
        String s2 = "s2";
        String s3 = "s1";
        System.out.println(n1 == n2); //true
        System.out.println(n1 == n3); //false
        System.out.println(s1 == s2); //false
        System.out.println(s3 == s1); //true

        String s4 = new String("abc");
        String s5 = new String("abc");
        System.out.println(s4 == s5); // false
        System.out.println(s4.equals(s5)); //true
    }

}
           

结论

八大基本类型 == 比较的是值,而实例化对象的时候用 == 比较的就是地址。这就导致了s4 == s5 为false 而 equals 是比较值的而不是地址。(那有的小伙伴就会问了,为啥s1 与 s3 就为true)

因为String s1 = “s1” 与 String s4 = new String(“abc”) 是有区别的 s1 是在栈中开辟了一块空间将s1赋值给s1 而 s4 是在堆中new了一个String 并赋值给abc的。前者是变量进行比较后者是实例化对象进行比较,前者比较的是值,后者比较的是地址。

揭开java的堆、栈的神秘面纱

月黑风高加班夜,早睡早起身体好。既然选择了,就不要放弃。加油吧骚年

——小铁(一个实力与逗比的结合体)

如果以上内容对您有帮助,就请点个赞吧!!!!