从数据类型看堆栈存储

Java中的基本数据类型:
这里写图片描述
JavaScript中的基本数据类型:
这里写图片描述
因为操作系统中 栈的体积相对小但是他的运行速度相对快,可以进行一些方法操作;而堆的体积大但是运行速度相对慢。所以在Java和JavaScript中堆栈的存储是同一个原则的,即基本数据类型(体积小)存储在栈中,引用(复杂)数据类型(体积大)存储在堆中;(Java 中String特殊);


Java:

一:基本数据类型

        int test1 = 22;
        int test2 = test1;
        test2 =33;
        System.out.println(test1);//输出22
        System.out.println(test2);//输出33

实验代码和实验结果如上述代码
解释:在Java中基本数据类型存储在栈中,他的引用(变量名)和值全都在同一个地方,所以当将test1赋值给test2时是将值直接复制给test2;此时test1和test2是分开的截然不同的两个变量;所以当改变test2时test1不会跟着改变;

二:引用数据类型

        int[] arr1 = {1,2,3,4};
        int[] arr2 = arr1;
        arr2[0] = 10;
        for(int i = 0;i < arr1.length;i++){
            System.out.println(arr1[i]);
        }//输出结果为:  [10,2,3,4]

实验代码和实验结果如上述代码;
解释:在Java中引用数据类型是存储在堆中的,当声明创建数组arr1时,在堆中开辟出来一个连续的空间用来存储数组中的数据,而在栈中存放的则是这个数组的引用—arr1(存放着堆中数据的地址);当再次声明一个数组arr2时并且将arr1赋值给arr2,这一步操作是在栈中进行的所以赋值过去的只是一个引用,一个地址,所以此时的arr1和arr2都是指向堆中的同一个数组。

下边是堆栈中存储数据的原理图。要注意的就是基本类型在栈中是单独的一块内存区域,他们的变量名和变量值是存在一起的;而对于引用数据类型他的存储 ,变量名和值是分开的,栈中存储的只是引用(变量名)和地址,而真正的值是存储在堆中的;
这里写图片描述
三:独树一帜的String类型

        String str1 = "kaka";
        String str2 = str1;
        str2 = "ccc";
        System.out.println(str1 == str2);//输出false
        System.out.println(str1);//输出kaka
        System.out.println(str2);//输出ccc

按照前边的原则来讲String不是一个基本数据类型,所以他应该存储在堆中啊,栈中存的只是引用,一个String改变了另一个肯定也是改变啊,可是为什么两个不一样呢;奇葩的String类自己管理了一块区域——字符串常量池(在方法区);而字符串常量池中有一个原则字符串的不可改变性,只要你在栈中改变了,那么他就在常量池中新开辟一个空间存储新的值,这两个是完全不同!!!
注意:String str = new String(”kaka”);值是存储在堆中的,因为new出来的都是对象,object类型的数据都存储在堆中;


JavaScript:

众所周知js是一个弱类型的语言,声明变量时不进行区分数据类型,但是这就说明他底层就没有数据类型的区分了吗? 答案肯定是否定的,我们使用var进行声明变量,js的底层有一套自动检索机制用于自动识别数据类型并且在相应的内存空间中开辟出相应大小的空间;

一:基本数据类型

    var test1 = 1;
    var test2 = test1;
    test2 = 4;
    console.log(test1);//输出1
    console.log(test2);//输出4

运行程序和运行结果如图所示;
其实现原理和Java中的一样,所以一个值改变不会影响到另一个值;

二:引用数据类型

    var arr1 = [1,2,3];
    var arr2 = arr1;
    arr2[0] = 4;
    console.log(arr1);//(3) [4, 2, 3]
    console.log(arr2);//(3) [4, 2, 3]

运行程序和运行结果如图所示;
因为在JavaScript中数组是属于object的一种,所以是存储在堆中的;因此它的赋值只是赋值的位置而不是开辟一个新的存储。原理和Java中的相同;
三:String
在JavaScript中String属于基本数据类型,因此存储在栈中;


总结:
1:栈中存储基本数据类型,堆中存储引用数据类型;
2:Java中的String存储在字符串常量池中而不是堆;
3:js为弱类型语言,所以在声明变量的时候只需要使用var即可,但是在js的底层有数据类型自动检索机制;
4:计算机操作系统是一切的原理,皮毛终究是皮毛,不仅要知道他是用来做what 更要明白他为什么去这么做;追根溯源。

最后的话:
其实寂寞真的很难熬啊,可是有什么办法呢,你需要把自己该走的路自己专心致志的走过去。所有的天才都只是更加专注而已,你知道差在哪就需要逼自己一把。否则真的会一无所有。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值