值類型和引用類型的區別

一、定義

引用類型表示你操作的數據是同一個,也就是說當你傳一個參數給另一個方法時,你在另一個方法中改變這個變量的值,那么調用這個方法是傳入的變量的值也將改變。

值類型表示復制一個當前變量傳給方法,當你在這個方法中改變這個變量的值時,最初生命的變量的值不會變。

值類型

也就是基本數據類型 基本數據類型常被稱為四類八種。

四類八種:

  • 整型(4種):byte(1 byte)、short(2 byte)、int(4 byte)、long(8 byte)

  • 浮點型(2種):float(4 byte)、double(8 byte)

  • 字符型(1種):char(2 byte)

  • 邏輯型(1種):boolean

引用類型

除了八種基本數據類型外,其他所有的類型都稱為引用類型(數組、類、接口、字符串等)

在弄清楚值類型與引用類型之后,最后一點就是值傳遞與引用傳遞,這才是關鍵

值傳遞

基本數據類型賦值都屬于值傳遞,值傳遞傳遞的是實實在在的變量值,是傳遞原參數的拷貝,值傳遞后,實參傳遞給形參的值,形參發生改變而不影響實參。

引用傳遞

引用類型之間賦值屬于引用傳遞。引用傳遞傳遞的是對象的引用地址,也就是它的本身(自己最通俗的理解)。引用傳遞:傳的是地址,就是將實參的地址傳遞給形參,形參改變了,實參當然被改變了,因為他們指向相同的地址。

引用和我們的指針差不多,但是它不又不需要我們去具體的操作。

二、區別

這里寫圖片描述

三、內存分配

值類型

值類型(value type)的數據存放在棧內的一個變量中。即是在棧中分配內存空間,直接存儲所包含的值,其值就代表數據本身。

但是也有特殊情況,如果某個類的實例有個值類型的字段,那么實際上該字段會和類實例保存在同一個地方,即堆中。不過引用類型的對象總是存儲在堆中;如果一個結構的字段是引用類型,那么只有引用本身是和結構實例存儲在一起的(在棧或堆上,視情況而定)。

值類型的數據具有較快的存取速度。

引用類型

引用類型(reference type)的數據并不駐留在棧中,而是存儲于堆中。即是在堆中分配內存空間,存儲所包含的值,而棧中存儲的是指向該值的地址。當訪問一個具有引用類型的數據時,需要到棧中檢查變量的內容,該變量引用堆中的一個實際數據。引用類型的數據比值類型的數據具有更大的存儲規模和較低的訪問速度。

注:

棧(stack)是一種后進先出的數據結構。在內存中,變量會被分配在棧上來進行操作。堆(heap)是用于為類型實例(對象)分配空間的內存區域,在堆上創建一個對象,會將對象的地址傳給棧上的變量(反過來叫變量指向此對象,或者變量引用此對象)。

值類型總是分配在它聲明的地方:作為字段時,跟隨其所屬的變量(實例)存儲;作為局部變量時,存儲在棧上。

值類型在內存管理方面具有更好的效率,并且不支持多態,適合用做存儲數據的載體;

引用類型支持多態,適合用于定義 應用程序的行為。

四、回收機制

當一個堆內存中的對象沒有被棧內存中表示地址的值“引用”時,這個對象就被稱為垃圾對象,它無法被使用但卻占據著內存中的區域,好比這樣:

String s = new String("person"); 
s = new String("man"); 

s本來是指向堆內存中值為person的對象的,但是s突然討厭person了,它指向了堆內存中的man對象了,person就像一個孤兒一樣被s遺棄了,但是person比孤兒還要慘,因為沒有什么能找的到它,除了位高權重的‘垃圾回收器’,不過被當官的找到往往沒什么好事,尤其是這個‘垃圾回收器’,它會豪不留情把‘垃圾’們清理走,并且無情的銷毀,以便釋放內存。

Java中有垃圾回收機制,棧內存中的變量隨著方法的結束內存自然銷毀了,而用引用類型的時候,當方法結束的時候,這個對象可能被另一個引用類型所應用,不會銷毀,只有當一個對象沒有任何引用變量引用的時候,垃圾回收機制才會回收。

五、為什么Java中數據的存放有堆和棧之分?

答:當一個方法執行時,每個方法都會建立自己的內存棧,在這個方法內定義的變量將會逐個放入這塊棧內存里,隨著方法的執行結束,這個方法的內存棧也將自然銷毀了。因此,所有在方法中定義的變量都是放在棧內存中的;當我們在程序中創建一個對象時,這個對象將被保存到運行時數據區中,以便反復利用(因為對象的創建成功通常較大),這個運行時數據區就是堆內存。堆內存中的對象不會隨方法的結束而銷毀,即使方法結束后,這個對象還可能被另一個引用變量所引用(方法的參數傳遞時很常見),則這個對象依然不會被銷毀。只有當一個對象沒有任何引用變量引用它時,系統的垃圾回收機制才會在合適的時候回收它。

六、裝箱與拆箱

裝箱:

裝箱就是值類型到引用類型的轉化過程。將一個值類型變量裝箱成一個引用類型變量,首先會在托管堆上為新的引用類型變量分配內存空間,然后將值類型變量拷貝到托管堆上新分配的對象內存中,最后返回新分配的對象內存地址。

拆箱:

裝箱操作是可逆的,所以還有拆箱操作。拆箱操作獲取只想對象中包含值類型部分的指針,然后由程序員手動將其對應的值拷貝給值類型變量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447022.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447022.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447022.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面向區塊鏈的高效物化視圖維護和可信查詢論文學習

物化視圖介紹 如何維護物化視圖仍舊是一個開放問題.在關系數據庫中,增量刷新的物化視圖維護策略可劃分為立即維護和延遲維護兩大類.立即維護策略的優點是實現較為簡單,在單數據源下不 存在一致性問題;然而該策略將物化視圖維護過程嵌入到更新事務之中,延長了更新事務的提交時間…

Java基礎知識(一)

一、接口 類描述了一個實體,包括實體的狀態,也包括實體可能發出的動作。 接口定義了一個實體可能發出的動作。但是只是定義了這些動作的原型,沒有實現,也沒有任何狀態信息。 所以接口有點象一個規范、一個協議,是一個…

密碼學數字信封的介紹

對稱密碼和非對稱密碼 對稱密碼:加解密運算非常快,適合處理大批量數據,但其密碼的分發與管理比較復雜非對稱密碼:公鑰和私鑰分離,非常適合密鑰的分發和管理 數字信封的定義 如果將對稱密碼算法和非對稱密碼算法的優點…

Android設計模式之——狀態模式

一、介紹 狀態模式中的行為是由狀態來決定的,不同的狀態下有不同的行為。狀態模式和策略模式的結構幾乎完全一樣,但它們的目的、本質卻完全不一樣。狀態模式的行為是平行的、不可替換的,策略模式的行為是彼此獨立、可相互替換的。用一句話來…

Android設計模式之——責任鏈模式

一、介紹 責任鏈模式(Iterator Pattern),是行為型設計模式之一。什么是”鏈“?我們將多個節點首尾相連所構成的模型稱為鏈,比如生活中常見的鎖鏈,就是由一個個圓角長方形的鐵環串起來的結構。對于鏈式結構…

目前基于區塊鏈的檔案防篡改系統的設計如何實現防篡改

架構設計圖 分析 為了保障檔案數據的安全性和隱私性,存儲檔案附件和檔案屬性存儲加密存儲在私有IPFS集群,檔案的IPFS地址和數字指紋存儲在私有區塊鏈上。公有區塊鏈定期存儲和檢查私有區塊鏈最新不可逆區塊的高度和哈希值,以保障私有區塊鏈上…

IPFS的文件存儲模式

IPFS是如何進行文件存儲的 IPFS采用的索引結構是DHT(分布式哈希表),數據結構是MerkleDAG(Merkle有向無環圖) DHT(分布式哈希表) 參考鏈接MerkleDAG(Merkle有向無環圖) 參考鏈接MerkleDAG功能…

Android設計模式之——解釋器模式

一、介紹 解釋器模式(Interpreter Pattern)是一種用的比較少的行為型模式,其提供了一種解釋語言的語法或表達式的方式,該模式定義了一個表達式接口,通過該接口解釋一個特定的上下文。在這么多的設計模式中&#xff0c…

在Docker里面安裝Ubuntu,并且使用ssh進行連接

創建Ubuntu鏡像 1,拉取Ubuntu系統的鏡像 docker pull ubuntu2、查看拉取是否成功 docker images3,運行容器 docker run --name 新建的容器的名字 -ti -v /AAA:/BBB -d -p 3316:22 ubuntu(這個是鏡像的名字)宿主機根目錄中的AAA文件夾就映射到了容器…

Android設計模式之——命令模式

一、介紹 命令模式(Command Pattern),是行為型設計模式之一。命令模式相對于其他的設計模式來說并沒有那么多的條條框框,其實它不是一個很”規范“的模式,不過,就是基于這一點,命令模式相對于其…

C++ 序列化和反序列化學習

定義 程序員在編寫應用程序的時候往往需要將程序的某些數據存儲在內存中,然后將其寫入某個文件或是將它傳輸到網絡中的另一臺計算機上以實現通訊。這些過程將會涉及到程序數據轉化成能被存儲并傳輸的格式,因此被稱為“序列化”(Serializatio…

Android設計模式之——觀察者模式

一、介紹 觀察者模式是一個使用率非常高的模式,它最常用的地方是GUI系統、訂閱——發布系統。因為這個模式的一個重要作用就是解耦,將被觀察者和觀察者解耦,使得它們之間的依賴性更小,甚至做到毫無依賴。以GUI系統來說&#xff0…

Android設計模式之——備忘錄模式

一、介紹 備忘錄模式是一種行為模式,該模式用于保存對象當前狀態,并且在之后可以再次恢復到此狀態,這有點像我們平時說的”后悔藥“。備忘錄模式實現的方式需要保證被保存的對象狀態不能被對象從外部訪問,目的是為了保護好被保存…

c++ memory 頭文件詳細介紹

類 指針特征 pointer_traits (C11) 提供關于指針式類型的信息 (類模板) 垃圾收集器支持 pointer_safety (C11) 列出指針安全模式 (枚舉) 分配器 allocator 默認的分配器 (類模板) allocator_traits (C11) 提供關于分配器類型的信息 (類模板) allocator_arg_t (C11) 標簽類型…

C++ using的三種使用策略以及具體的用法

Using的使用方法 1,命名空間的使用 為了防止代碼沖突,都會使用到命名空間。假設這樣一種情況,當一個班上有兩個名叫 Zara 的學生時,為了明確區分他們,我們在使用名字之外,不得不使用一些額外的信息&#…

Android設計模式之——迭代器模式

一、介紹 迭代器模式(Iterator Pattern)又稱為游標(Cursor)模式,是行為型設計模式之一。迭代器模式算是一個比較古老的設計模式,其源于對容器的訪問,比如Java中的List、Map、數組等&#xff0c…

Android設計模式之——模板方法模式

一、介紹 在面向對象開發過程中,通常會遇到這樣的一個問題,我們知道一個算法所需的關鍵步驟,并確定了這些步驟的執行順序,但是,某些步驟的具體實現是未知的,或者說某些步驟的實現是會隨著環境的變化而改變…

Android設計模式之——訪問者模式

一、介紹 訪問者模式是一種將數據操作與數據結構分離的設計模式,它是《設計模式》中23種設計模式中最復雜的一個,但它的使用頻率并不高,正如《設計模式》的作者GOF對訪問者模式的描述:大多數情況下,你不需要使用訪問者…

C++類模板template <class T>簡單使用方法

一個簡單的例子 兩個數比大小 如果兩個數都是int類型 class Compare_int { public :Compare(int a,int b){xa;yb;}int max( ){return (x>y)?x:y;}int min( ){return (x<y)?x:y;} private :int x,y; }; 如果兩個數是float類型 class Compare_float { public :Compare(…

Android設計模式之——中介者模式

一、介紹 中介者模式&#xff08;Mediator Pattern&#xff09;也稱為調解者模式或調停者模式&#xff0c;Mediator本身就有調停者和調解者的意思。 在日常生活中調停者或調解者這個角色我們見得比較多的是“和事老”&#xff0c;也就是說調解兩個有爭端的人的角色&#xff0…