一谈火、基本數(shù)據(jù)類型:
byte:Java中最小的數(shù)據(jù)類型舌涨,在內(nèi)存中占8位(bit),即1個字節(jié)温技,取值范圍-128~127扭粱,默認值0
short:短整型,在內(nèi)存中占16位系任,即2個字節(jié)虐块,取值范圍-32768~32717嘉蕾,默認值0
int:整型,用于存儲整數(shù)儡率,在內(nèi)在中占32位以清,即4個字節(jié),取值范圍-2147483648~2147483647掷倔,默認值0
long:長整型,在內(nèi)存中占64位浪汪,即8個字節(jié)-2^63~2^63-1,默認值0L
float:浮點型广恢,在內(nèi)存中占32位呀潭,即4個字節(jié),用于存儲帶小數(shù)點的數(shù)字(與double的區(qū)別在于float類型有效小數(shù)點只有6~7位)糠聪,默認值0
double:雙精度浮點型踏幻,用于存儲帶有小數(shù)點的數(shù)字,在內(nèi)存中占64位该面,即8個字節(jié),默認值0
char:字符型题造,用于存儲單個字符猾瘸,占16位,即2個字節(jié)淮悼,取值范圍0~65535揽思,默認值為空
boolean:布爾類型,占1個字節(jié)羹令,用于判斷真或假(僅有兩個值损痰,即true、false)卢未,默認值false
二、Java數(shù)據(jù)類型基本概念:
數(shù)據(jù)類型在計算機語言里面显拜,是對內(nèi)存位置的一個抽象表達方式,可以理解為針對內(nèi)存的一種抽象的表達方式矮固。接觸每種語言的時候譬淳,都會存在數(shù)據(jù)類型的認識,有復雜的守伸、簡單的浦妄,各種數(shù)據(jù)類型都需要在學習初期去了解,Java是強類型語言蠢涝,所以Java對于數(shù)據(jù)類型的規(guī)范會相對嚴格阅懦。數(shù)據(jù)類型是語言的抽象原子概念,可以說是語言中最基本的單元定義耳胎,在Java里面怕午,本質(zhì)上講將數(shù)據(jù)類型分為兩種:基本類型和引用數(shù)據(jù)類型。
基本類型:簡單數(shù)據(jù)類型是不能簡化的郁惜、內(nèi)置的數(shù)據(jù)類型、由編程語言本身定義,它表示了真實的數(shù)字恨樟、字符和整數(shù)疚俱。
引用數(shù)據(jù)類型:Java語言本身不支持C++中的結(jié)構(gòu)(struct)或聯(lián)合(union)數(shù)據(jù)類型,它的復合數(shù)據(jù)類型一般都是通過類或接口進行構(gòu)造养晋,類提供了捆綁數(shù)據(jù)和方法的方式,同時可以針對程序外部進行信息隱藏逊抡。
三零酪、Java中的數(shù)據(jù)類型與內(nèi)存的關(guān)系
在Java中,每個存放數(shù)據(jù)的變量都是有類型的四苇,如:
char ch; float x蟀架; int a,b,c榆骚;
ch是字符型的,就會分配到2個字節(jié)內(nèi)存穆碎。不同類型的變量在內(nèi)存中分配的字節(jié)數(shù)不同职恳,同時存儲方式也是不同的。
所以給變量賦值前需要先確定變量的類型色徘,確定了變量的類型操禀,即確定了數(shù)據(jù)需分配內(nèi)存空間的大小,數(shù)據(jù)在內(nèi)存的存儲方式斤寂。
四揪惦、Java數(shù)據(jù)類型在內(nèi)存中的存儲:
1)基本數(shù)據(jù)類型的存儲原理:所有的簡單數(shù)據(jù)類型不存在“引用”的概念,基本數(shù)據(jù)類型都是直接存儲在內(nèi)存中的內(nèi)存棧上的溪猿,數(shù)據(jù)本身的值就是存儲在棧空間里面讲弄,而Java語言里面八種數(shù)據(jù)類型是這種存儲模型依痊;
2)引用類型的存儲原理:引用類型繼承于Object類(也是引用類型)都是按照Java里面存儲對象的內(nèi)存模型來進行數(shù)據(jù)存儲的,使用Java內(nèi)存堆和內(nèi)存棧來進行這種類型的數(shù)據(jù)存儲驹饺,簡單地講缴渊,“引用”是存儲在有序的內(nèi)存棧上的,而對象本身的值存儲在內(nèi)存堆上的蝌借;
區(qū)別:基本數(shù)據(jù)類型和引用類型的區(qū)別主要在于基本數(shù)據(jù)類型是分配在棧上的指蚁,而引用類型是分配在堆上的(需要java中的棧、堆概念)稍坯,
基本類型和引用類型的內(nèi)存模型本質(zhì)上是不一樣的搓劫。
例1:我們分析一下”==“和equals()的區(qū)別。
首先枪向,我定以兩個String對象
Stringa="abc";
Stringb="abc";
然后
if(a==b){
System.out.println("a==b");
}else{
System.out.println("a!=b");}
程序輸出a!=b
原因:a和b的地址是不相同的秘蛔,a==b比較的是兩個變量的地址
例2:定義兩個基本類型
int a=4;
int b=4;
if(a==b){System.out.println("a==b");}
else
{System.out.println("a!=b");}
輸出:a==b
原因:==比較的是兩個變量的內(nèi)容
猜想:不論是基本數(shù)據(jù)類型還是引用類型,他們都會先在棧中分配一塊內(nèi)存负蠕,對于基本類型來說倦畅,這塊區(qū)域包含的是基本類型的內(nèi)容;而對于對象類型來說止吁,這塊區(qū)域包含的是指向真正內(nèi)容的指針燎悍,真正的內(nèi)容被手動的分配在堆上。
五忆某、Java基本類型取值范圍計算
從計算機組成原理的角度可以解釋:
byte在計算機中是占8個字節(jié)的奏路,而且byte 是有符號整形,用二進制表示時候最高位為符號位 0代表正數(shù) 1代表負數(shù)斜脂。
最大值:127? ? ? 即2的7次方減去1触机;最小值:即2的7次前面加個負符號:-128 。(包含開始片任,不包含結(jié)尾)蔬胯;
正數(shù)在計算機中是以原碼形式存在的;
負數(shù)在計算機中是以其補碼形式存在的产场,就是負數(shù)的絕對值的原碼轉(zhuǎn)為二進制再按位取反后加1泼橘。
下邊這個10和-10為例來介紹的 :10原碼:00001010? 它在計算機中的存儲就是 0000 1010,-10 按照前面說的算除其絕對值為10醋粟,轉(zhuǎn)為二進制 0000 1010 按位取反 1111 0101 再加1后:1111 0110重归,此為-10補碼,好的育苟,計算機中的1111 0110就是代表-10了椎木。
我們來看 -128? 絕對值128的二進制表示:1000 0000 按位取反 0111 1111 加1后:1000 0000博烂,也就是說 -128在計算機中的表示就是 1000 0000 了禽篱,再來看一下-129 在計算機中的表示馍惹,絕對值129的范圍已經(jīng)超出了了byte的位數(shù)。所以要注意這類問題万矾。