1. 程式人生 > >從資料型別看堆疊儲存

從資料型別看堆疊儲存

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 更要明白他為什麼去這麼做;追根溯源。

最後的話:
其實寂寞真的很難熬啊,可是有什麼辦法呢,你需要把自己該走的路自己專心致志的走過去。所有的天才都只是更加專注而已,你知道差在哪就需要逼自己一把。否則真的會一無所有。

相關推薦

資料型別堆疊儲存

Java中的基本資料型別: JavaScript中的基本資料型別: 因為作業系統中 棧的體積相對小但是他的執行速度相對快,可以進行一些方法操作;而堆的體積大但是執行速度相對慢。所以在Java和JavaScript中堆疊的儲存是同一個原則的,即基本資料

彙編–資料型別WORD與DWORD

剛接觸彙編與逆向,記錄一些學習筆記。 原始碼: IDA彙編程式碼: 首先 1字=2位元組  1位元組=8位(8位元)=2位16進位制 var_6=dword ptr -6: ptr-6表示指標上移6個單位處,這裡的單位是指計算機的定址單位,一般按位元組定址,[

資料分析王祖賢的電影人生

作者:唐亦六安知乎專欄:https://www.zhihu.com/people/tang-yi

資料角度人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用 資料角度人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用

轉 從資料角度看人臉識別中Feature Normalization,Weight Normalization以及Triplet的作用 2018年10月19日 16:42:52

資料檔案timestamp範圍限制

建立表:mysql> desc test_timestamp1; +-------+-----------+------+-----+---------+-------+ | Field | T

資料:誰才是漫威的絕對C位

復聯4上映了!這次比美國還早了兩天。當然,我還沒看,不會給你們劇透,當然也不想不劇透。 這一部不僅是滅霸這一線劇情的結局,也

C#中記憶體空間的角度資料型別,並延申到static方法的分析

資料型別這篇文章主要討論的是值型別和引用型別,值型別在定義的時候就會將該值儲存在棧中,而引用型別是分配在堆中,在堆中存放的是資料區域地址,它用來指向一塊記憶體空間。棧可以理解為儲存的都是一些資料變數,而堆中放的都是一些例項化物件。在對值型別操作時不會影響其他值,而當引用變數引用其他引用變數時

C語言資料型別儲存位置及堆疊說明

一、預備知識—程式的記憶體分配一個由C/C++編譯的程式佔用的記憶體分為以下幾個部分1、棧區(stack)  由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2、堆區(heap)   般由程式設計師分配釋放, 若程式設計師不釋放

資料結構書筆記(六)--樹的定義、抽象資料型別儲存結構

樹:樹(Tree)是n(n>=0)個結點的有限集。n=0時稱為空樹,在任意一顆非空樹中:(1)有且只有一個特定的稱之為根(Root)的結點;(2)當n>1時,其餘結點可分為m(m>0)個互不相交的有限集T1、T2、……、Tm,其中每一個集合本身又是一棵樹,

《c語言入門到精通》書筆記——第3章 資料型別

auto 區域性變數(自動儲存) break無條件退出程式最內層迴圈 case   switch語句中選擇項 char單位元組整型資料 const定義不可更改的常量值 continue中斷本次迴圈,並轉向下一次迴圈 default switch語句中的預設選擇項 do  用於構成do.....while迴圈

資料儲存(1):資料儲存人類文明-資料儲存器發展歷程

傳統文字儲存 泥版/鐘鼎/甲骨/莎草紙/羊皮紙等文字儲存 傳統的考古學家和歷史學家認為,楔形文字起源於美索不達米亞特殊的漁獵生活方式。這是較為通行的看法,西方的各種百科全書大都持這一觀點。約在公元前3400年左右,楔形文字雛形產生,多為影象。到公元前 500 年左右, 這種文字甚至成了西亞大部分地區通用的商業

“馬蜂窩事件”,投資人如何避免資料盡職調查背後的交易風險?

來源:Career In 投行PEVC 本文約4400字,建議閱讀10分鐘。 本文列舉三個網際網路行業典型場景,幫助投資人對相關問題有一個更為感性的理解。 10月21日,一篇名為《估值175億的旅遊獨角獸,是一座殭屍和水軍構成的鬼城?》在社交網路廣為流傳,該篇文章作者

11.1 js中級,資料型別資料儲存方式、作用域記憶體空間的區別以及例識別。

一. 基本資料型別和引用資料型別的區別。     1.基本資料型別:基本資料型別就是簡單的操作值。     2.引用資料型別:就是把引用的地址賦給變數。   堆記憶體:     就是存放程式碼塊的,存放形式有兩種       1)物件以鍵值對的形式存放       2)引用資料型別的賦值,是把引用

JavaScript兩種資料型別儲存方式

JavaScript中資料型別的儲存 區別: 兩種型別的區別是:儲存位置不同 基本資料型別 原始資料型別是直接儲存在棧(stack)中的簡單資料段。因為佔據空間小、大小固定,屬於被頻繁使用資料,所以放入棧中儲存。 引用資料型別 引用資料型別儲存在堆(heap)中的物件,佔據空間大、大小不固定。如果

(六)Hive SQL之資料型別儲存格式

(六)Hive SQL之資料型別和儲存格式   目錄 一、資料型別 1、基本資料型別 2、複雜型別 二、儲存格式 (1)textfile  (2)SequenceFile 

JAVA入門到精通-第2講-變數-資料型別

不同資料型別資料大小範圍的計算  位元組x8-1    至    位元組x8-1    資料可以自動從低精度向高精度轉

零開始學Python【1】--資料型別及結構

一直想靜下心來、花點時間學習Python3這門火爆的高階語言,但總是事與願違,故只能擠點時間,做到每天進步一點點。從今天開始我把積累的點滴知識與大家做個分享,也歡迎感興趣的朋友指教與提議。 首先從Python的基礎資料型別和資料結構說起,資料型別主要包含三種,分別是數值型、字元型和日

HIVE資料型別儲存格式

https://www.cnblogs.com/qingyunzong/category/1191578.html一、資料型別1、基本資料型別Hive 支援關係型資料中大多數基本資料型別boolean true/false TRUE tinyint 1位元組的有符號整數 -128~127 1Y smallin

python 程式設計入門到實踐 第二章 變數和簡單資料型別

-- 變數  message = "hello python word" print(message) -- 練習  vi simple_message.py #!/usr

Hive-5-Hive SQL之資料型別儲存格式

原文地址:https://www.cnblogs.com/qingyunzong/p/8733924.html 一、資料型別 1.1、基本資料型別 Hive 支援關係型資料中大多數基本資料型別,和其他的SQL語言一樣,這些都是保留字。需要注意的是所有的這些資料型別都是對Java中介面的實