Java之關(guān)于基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的存放位置
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的存放位置
1、基本數(shù)據(jù)類型存放在哪?
基本類型的變量存在棧里或者堆里不是由"大小可知,生存期可知"就能確定了。
關(guān)鍵是上下文。
比如:
void method(){ int a = 3; }
這自然是存在棧里的。局部方法嘛。
而:
class Test { int a = 3; }
這就肯定是隨對象放到堆里的。
**因此,不要孤立的看到基本類型就說放到棧里,看到引用類型就說放到堆里。
**從更深層次去理解它們會更好,例如為什么是在基本類型的實例變量在堆上創(chuàng)建,局部變量在棧上創(chuàng)建,這樣做有什么好處
2、思考
如果你熟悉java的內(nèi)存結(jié)構(gòu)的話就會知道,堆 是所有線程共享的內(nèi)存區(qū)域,棧 是每個線程獨享的,如果你將一個實例變量放在棧內(nèi),那么就不存在多個線程訪問同一個對象資源了,這顯然是不對的,所以實例變量要在堆上創(chuàng)建,也不是線程安全的。
但是對于局部變量,是在棧上創(chuàng)建的,每一次方法調(diào)用創(chuàng)建一個幀,獨享一份內(nèi)存區(qū)域,其他的線程是不會訪問到該線程的資源,在 棧上創(chuàng)建也會減輕GC的壓力,隨著該方法的結(jié)束,幀出棧,相對應(yīng)的內(nèi)存消除,這種局部變量占用的內(nèi)存自然就消失了,因此局部變量是線程安全的。
3、注
基本數(shù)據(jù)類型是放在棧中還是放在堆中,這取決于基本類型聲明的位置。
一:在方法中聲明的變量
即使變量是局部變量,每當(dāng)程序調(diào)用方法時,系統(tǒng)都會為該方法建立一個方法棧,其所在方法中聲明的變量就放在方法棧中,當(dāng)方法結(jié)束系統(tǒng)會釋放方法棧,其對應(yīng)在該方法中聲明的變量隨著棧的銷毀而結(jié)束,這就局部變量只能在方法中有效的原因。
在方法中聲明的變量可以是基本類型的變量,也可以是引用類型的變量。
(1)當(dāng)聲明是基本類型的變量的時,其變量名及值(變量名及值是兩個概念)是放在方法棧中
(2)當(dāng)聲明的是引用變量時,所聲明的變量(該變量實際上是在方法中存儲的是內(nèi)存地址值)是放在方法的棧中,該變量所指向的對象是放在堆類存中的。
二:在類中聲明的變量是成員變量
也叫全局變量,放在堆中的(因為全局變量不會隨著某個方法執(zhí)行結(jié)束而銷毀)。
同樣在類中聲明的變量即可是基本類型的變量 也可是引用類型的變量
(1)當(dāng)聲明的是基本類型的變量其變量名及其值放在堆內(nèi)存中的
(2)引用類型時,其聲明的變量仍然會存儲一個內(nèi)存地址值,該內(nèi)存地址值指向所引用的對象。引用變量名和對應(yīng)的對象仍然存儲在相應(yīng)的堆中.
總結(jié):
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的區(qū)別
眾所周知Java是一種強類型語言,在Java語言中,Java的數(shù)據(jù)類型一共分為兩大類,分別為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,其中基本數(shù)據(jù)類型細分小類可分為整數(shù)類型、浮點類型、字符類型、布爾類型這四小類。
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
1. 基本數(shù)據(jù)類型
只有8種,可按照如下分類 :
- 整數(shù)類型: long、int、short、byte
- 浮點類型: float、double
- 字符類型: char
- 布爾類型: boolean
No. | 數(shù)據(jù)類型 | 大小/位 | 可表示數(shù)據(jù)范圍 | 默認(rèn)值 |
---|---|---|---|---|
1 | byte(字節(jié)型) | 8 | -128~127 | 0 |
2 | short(短整型) | 16 | -32768~32767 | 0 |
3 | int(整型) | 32 | -2147483648~2147483647 | 0 |
4 | long(長整型) | 64 | -9223372036854775808~9223372036854775807 | 0 |
5 | float(單精度) | 32 | -3.4E38~3.4E38 | 0.0 |
6 | double(雙精度) | 64 | -1.7E308~1.7E308 | 0.0 |
7 | char(字符) | 16 | 0~255 | ‘\u0000’ (其實就是一個空格) |
8 | boolean(布爾) | - | true或false | false |
2. 引用數(shù)據(jù)類型
引用數(shù)據(jù)類型非常多,大致包括:類Class、 接口類型Inteface、 數(shù)組類型Array、 枚舉類型Enum、 注解類型、 字符串型
例如,String類型就是引用類型。簡單來說,所有的非基本數(shù)據(jù)類型都是引用數(shù)據(jù)類型。
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的區(qū)別
1. 存儲位置區(qū)別
a). 基本變量類型
在方法中定義的非全局基本數(shù)據(jù)類型變量的具體內(nèi)容是存儲在棧中的,基本數(shù)據(jù)類型在被創(chuàng)建時,在棧上給其劃分一塊內(nèi)存,將數(shù)值直接存儲在棧上的。
b). 引用變量類型
只要是引用數(shù)據(jù)類型變量(類class、接口interface、數(shù)組array),其變量或者對象的具體內(nèi)容信息都是存放在堆中的,而棧中存放的是其具體內(nèi)容所在內(nèi)存的引用地址
Tips : 通過變量地址可以找到變量的具體內(nèi)容,就如同通過房間號可以找到房間一般
public class Main{ public static void main(String[] args){ //基本數(shù)據(jù)類型 int i=1; double d=1.2; //引用數(shù)據(jù)類型 String str="helloworld"; } }
c)內(nèi)存劃分:
2. 傳遞方式區(qū)別
a. 基本變量類型
方法中定義的非全局基本數(shù)據(jù)類型變量,調(diào)用方法時作為參數(shù)是按數(shù)值傳遞的
//基本數(shù)據(jù)類型作為方法參數(shù)被調(diào)用 public class Main{ public static void main(String[] args){ int msg = 100; System.out.println("調(diào)用方法前msg的值:\n"+ msg); //100 fun(msg); System.out.println("調(diào)用方法后msg的值:\n"+ msg); //100 } public static void fun(int temp){ temp = 0; } }
內(nèi)存空間
b. 引用變量類型
引用數(shù)據(jù)類型變量,調(diào)用方法時作為參數(shù)是按引用傳遞的
//引用數(shù)據(jù)類型作為方法參數(shù)被調(diào)用 class Book{ String name; double price; public Book(String name,double price){ this.name = name; this.price = price; } public void getInfo(){ System.out.println("圖書名稱:"+ name + ",價格:" + price); } public void setPrice(double price){ this.price = price; } } public class Main{ public static void main(String[] args){ Book book = new Book("Java開發(fā)指南",66.6); book.getInfo(); //圖書名稱:Java開發(fā)指南,價格:66.6 fun(book); book.getInfo(); //圖書名稱:Java開發(fā)指南,價格:99.9 } public static void fun(Book temp){ temp.setPrice(99.9); } }
調(diào)用時為temp在棧中開辟新空間,并指向book的具體內(nèi)容,方法執(zhí)行完畢后temp在棧中的內(nèi)存被釋放掉
內(nèi)存空間
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springcloud + mybatis + seate集成示例
本文主要介紹了springcloud + mybatis + seate集成示例,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06Spring+quartz實現(xiàn)定時發(fā)送郵件功能實例
spring提供的定時發(fā)送郵件功能一直深受廣大web開發(fā)者的喜愛,這篇文章主要介紹了Spring+quartz實現(xiàn)定時發(fā)送郵件功能實例,有興趣的可以了解一下。2017-03-03spring boot idea maven依賴找不到問題處理方法
這篇文章主要介紹了spring boot idea 偶爾maven依賴找不到問題,這里總結(jié)了幾種處理方法,方便嘗試排查,對spring boot idea maven依賴找不到問題感興趣的朋友跟隨小編一起看看吧2023-08-08Springboot使用influxDB時序數(shù)據(jù)庫的實現(xiàn)
項目中需要存放大量設(shè)備日志,且需要對其進行簡單的數(shù)據(jù)分析,信息提取工作,所以本文就介紹一下Springboot使用influxDB時序數(shù)據(jù)庫,感興趣的可以了解一下2021-08-08