App下載

總結(jié)歸納Java基礎(chǔ)知識(shí)點(diǎn)之?dāng)?shù)據(jù)類型

軟妹販賣機(jī) 2021-08-10 15:15:46 瀏覽數(shù) (2628)
反饋

一、基本數(shù)據(jù)類型

1.1 整形

1.1.1 int

int a = Integer.MAX_VALUE;//int最大值
int b = Integer.MIN_VALUE;//int最小值

在java中int占4個(gè)字節(jié),和操作系統(tǒng)每任何關(guān)系。這也是java的可移植性。

int 能表示的范圍為-231~231-1,如果超出最大值或者小于最小值則會(huì)發(fā)生溢出。

public static void main(String[] args) {
            int a = Integer.MAX_VALUE;//int最大值
            int b = Integer.MIN_VALUE;//int最小值
            System.out.println("MAX_VALUE="+a);
            System.out.println("MIN_VALUE="+b);
            a = a+1;
            b = b-1;
            System.out.println("---------------");
            System.out.println("MAX_VALUE+1="+a);
            System.out.println("MIN_VALUE-1="+b);
}

202104230854132

我們發(fā)現(xiàn)int的最大值加1會(huì)等于int的最小值,而int的最小值減1會(huì)等于int的最大值。這種情況不僅在int,在long和short都存在

202104230854133

1.1.2 長(zhǎng)整形:long

long占8個(gè)字節(jié),可表示的范圍是 -263~-263-1

long a = 100L;
long b = 100l;
long c = 100;

在創(chuàng)建長(zhǎng)整形變量時(shí),a,b,c三種都可以,當(dāng)我們一般用第一種,大寫(xiě)L更好識(shí)別它時(shí)長(zhǎng)整形

1.1.3 短整形:short

short占2個(gè)字節(jié),所能表示的范圍為-215~215-1
short能表示的范圍 -32768~32767 ,所表示的范圍比較小一般不推薦使用,所以我們以后 int 和 long 時(shí)使用的比較多的。

1.2 浮點(diǎn)型

1.2.1 雙精度浮點(diǎn)型:double

public static void main(String[] args) {
            int a1 = 1;
            int a2 = 2;
            double b1 = 1.0;
            double b2 = 2.0;
            System.out.println("a1/a2="+a1/a2);
            System.out.println("b1/b2="+b1/b2);
}

在這里插入圖片描述

在java當(dāng)中int除以 int 只能得到 int 類型,因?yàn)樾?shù)部分會(huì)被舍去。如果要得到小數(shù)則需要用浮點(diǎn)數(shù)來(lái)計(jì)算。

再來(lái)看一個(gè)有意思的代碼

public static void main(String[] args) {
            double a = 1.1;
            System.out.println(a*a);

}

202104230854145

這里a*a理論上說(shuō)時(shí)等于1.21的但這里為什么不是呢?

1.Java 中的 double 雖然也是 8 個(gè)字節(jié), 但是浮點(diǎn)數(shù)的內(nèi)存布局和整數(shù)差別很大, 不能單純的用 2n 的形式表示數(shù)據(jù)范

2.Java 的 double 類型的內(nèi)存布局遵守 IEEE 754 標(biāo)準(zhǔn)(和C語(yǔ)言一樣), 嘗試使用有限的內(nèi)存空間表示可能無(wú)限的小數(shù), 勢(shì)
必會(huì)存在一定的精度誤差圍,而且計(jì)算機(jī)中小數(shù)是沒(méi)有精確的數(shù)字的

1.2.2 單精度浮點(diǎn)型:float

flaot占4個(gè)字節(jié)

public static void main(String[] args) {
            float a1 = 1.1;
            float a2 = (float)1.1;
            float b = 1.1F;
            float c = 1.1f;
}    

202104230854146

這里為什么報(bào)錯(cuò)呢?因?yàn)镴ava是一個(gè)強(qiáng)類型語(yǔ)言,安全性更高。在Java當(dāng)中小數(shù)默認(rèn)是double類型的,在創(chuàng)建float變量的時(shí)候,需要在小數(shù)后面加上一個(gè)F(f)或者強(qiáng)制類型轉(zhuǎn)換。

不過(guò)float能表示的精度較小,所以我們一般都是用double

1.3 字符類型變量char

在java中char不同于C語(yǔ)言它是占兩個(gè)字節(jié)的,計(jì)算機(jī)中的字符本質(zhì)上是一個(gè)整數(shù). 在 C 語(yǔ)言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一個(gè)字符占用兩個(gè)字節(jié), 表示的字符種類更多, 包括中文.

public static void main(String[] args) {
            char a = 97;
            char b = 65;
            char c = '好';
            System.out.println(a);
            System.out.println(b);
            System.out.println(c);
}       

202104230854147

在Java當(dāng)中字符類型就是字符類型不要和數(shù)字掛鉤,記住java中字符類型是不能夠給負(fù)數(shù)的。

在這里插入圖片描述

1.4 字節(jié)類型變量byte

byte占1個(gè)字節(jié),能表示的范圍為 -128~127
byte不能賦值超過(guò)它范圍外的數(shù)字,從而可以推到出其它類型也是一樣的。

來(lái)看一段代碼:

202104230854149

這里的 b3和b5都報(bào)錯(cuò),而b4沒(méi)有報(bào)錯(cuò)呢?

1.這是因?yàn)閳?zhí)行 b3 這段代碼時(shí),b1和b2都是變量編譯器不知道里面是什么,為了安全起見(jiàn)所以報(bào)錯(cuò)。

2.而b4不報(bào)錯(cuò)時(shí)因?yàn)樵诰幾g的時(shí)候 5+10就已經(jīng)被替換為15了,相當(dāng)于 b4 = 15.

3.那b5報(bào)錯(cuò)又是為什么呢?這里就牽扯到了整形提升,

簡(jiǎn)單說(shuō)一下整形提升:當(dāng)變量小于4個(gè)字節(jié)的時(shí)候,比如這里的byte在計(jì)算時(shí)會(huì)把它先提升為整形int再進(jìn)行計(jì)算。而byte是1個(gè)字節(jié)接收不了int類型的變量,所以報(bào)錯(cuò)。后面會(huì)再提到整形提升

1.5 布爾類型變量 boolean

boolean a = false;
boolean b = true;

1.在java中布爾類型只有兩個(gè)取值 falsetrue 。

2.java中的boolean和int 類型不能相互轉(zhuǎn)換,不存在1表示true ,0表示false這種用法

3.boolean 類型有些 JVM 的實(shí)現(xiàn)是占 1 個(gè)字節(jié), 有些是占 1 個(gè)比特位。并沒(méi)有明確規(guī)定大小

1.6 字符串類型變量 String

Java的字符串可以用+進(jìn)行拼接

public static void main(String[] args) {
            String str1 = "這是一個(gè)字符串";
            String str2 = "java";
            String tmp = str1 + str2;
            System.out.println(tmp);
}

2021042308541410

同樣也可以拼接數(shù)字

public static void main(String[] args) {
            String str1 = "這是一個(gè)字符串";
            String str2 = "java";
            String tmp = str1 + str2;
            System.out.println(tmp);
            int a = 10;
            int b = 20;
            System.out.println(tmp+a+b);
            System.out.println(a+b+tmp);
}

2021042308541411

輸出的時(shí)候如果前面是字符串則后面的數(shù)字會(huì)被當(dāng)作字符進(jìn)行拼接,可以根據(jù)自己的需要進(jìn)行運(yùn)算或者拼接

1.Java 使用 雙引號(hào) + 若干字符 的方式表示字符串字面值.

2. 和上面的類型不同, String 不是基本類型, 而是引用類型(在以后的文章會(huì)說(shuō)到).

二、常量

上面討論的都是各種規(guī)則的變量, 每種類型的變量也對(duì)應(yīng)著一種相同類型的常量.

常量指的是運(yùn)行時(shí)類型不能發(fā)生改變.

常量主要有以下兩種體現(xiàn)形式

2.1 字面常量

2021042308541412

2.2 … final 關(guān)鍵字修飾的常量

在這里插入圖片描述

final修飾的常量是不能被直接修改的

三、 類型轉(zhuǎn)換和數(shù)值轉(zhuǎn)換

3.1 類型轉(zhuǎn)換

java 作為一個(gè)強(qiáng)類型編程語(yǔ)言, 當(dāng)不同類型之間的變量相互賦值的時(shí)候, 會(huì)有教嚴(yán)格的校驗(yàn).來(lái)看一下列子

2021042308541414

long 表示的范圍更大, 可以將 int 賦值給 long, 但是不能將 long 賦值給 int.

double 表示的范圍更大, 可以將 int 賦值給 double, 但是不能將 double 賦值給 int.

結(jié)論: 不同數(shù)字類型的變量之間賦值, 表示范圍更小的類型能隱式轉(zhuǎn)換成范圍較大的類型, 反之則不行.

3.1.1 強(qiáng)制類型轉(zhuǎn)換

2021042308541415

結(jié)論: 使用 (類型) 的方式可以將 double 類型強(qiáng)制轉(zhuǎn)成 int. 但是

1.強(qiáng)制類型轉(zhuǎn)換可能會(huì)導(dǎo)致精度丟失. 如剛才的例子中, 賦值之后, 20.5 就變成 20 了, 小數(shù)點(diǎn)后面的部分被忽略.

2.強(qiáng)制類型轉(zhuǎn)換不是一定能成功, 互不相干的類型之間無(wú)法強(qiáng)轉(zhuǎn)

在這里插入圖片描述

比如這個(gè)列子 int 和 boolean這兩種完全不相關(guān)的類型是不可以強(qiáng)轉(zhuǎn)的。

類型轉(zhuǎn)換小結(jié):

1. 不同數(shù)字類型的變量之間賦值, 表示范圍更小的類型能隱式轉(zhuǎn)換成范圍較大的類型.
2. 如果需要把范圍大的類型賦值給范圍小的, 需要強(qiáng)制類型轉(zhuǎn)換, 但是可能精度丟失.
3. 將一個(gè)字面值常量進(jìn)行賦值的時(shí)候, Java 會(huì)自動(dòng)針對(duì)數(shù)字范圍進(jìn)行檢查.

3.2 數(shù)值提升

2021042308541415

結(jié)論: 當(dāng) int 和 long 混合運(yùn)算的時(shí)候, int 會(huì)提升成 long, 得到的結(jié)果仍然是 long 類型, 需要使用 long 類型的變量來(lái)
接收結(jié)果. 如果非要用 int 來(lái)接收結(jié)果, 就需要使用強(qiáng)制類型轉(zhuǎn)換.

再來(lái)看一個(gè)例子,前面在byte類型的時(shí)候就已經(jīng)說(shuō)到了,這里再詳細(xì)說(shuō)一下。

2021042308541517

結(jié)論: byte 和 byte 都是相同類型, 但是出現(xiàn)編譯報(bào)錯(cuò). 原因是, 雖然 a 和 b 都是 byte, 但是計(jì)算 a + b 會(huì)先將 a 和 b 都提升成 int, 再進(jìn)行計(jì)算, 得到的結(jié)果也是 int, 這時(shí)賦給 c, 就會(huì)出現(xiàn)上述錯(cuò)誤。

由于計(jì)算機(jī)的 CPU 通常是按照 4 個(gè)字節(jié)為單位從內(nèi)存中讀寫(xiě)數(shù)據(jù). 為了硬件上實(shí)現(xiàn)方便, 諸如 byte 和 short 這種低于4 個(gè)字節(jié)的類型, 會(huì)先提升成 int, 再參與計(jì)算。
簡(jiǎn)單來(lái)說(shuō)類型提升就是為了加快cpu運(yùn)算速度

如果非要這樣計(jì)算,則需要強(qiáng)轉(zhuǎn)。

類型提升小結(jié):

1.不同類型的數(shù)據(jù)混合運(yùn)算, 范圍小的會(huì)提升成范圍大的.

2.對(duì)于 short, byte 這種比 4 個(gè)字節(jié)小的類型, 會(huì)先提升成 4 個(gè)字節(jié)的 int , 再運(yùn)算.

四、 int 和 String 之間的相互轉(zhuǎn)換

4.1 int轉(zhuǎn)String

public static void main(String[] args) {
            int a = 10;
            //方法1
            String str1 = 10+" ";
            //方法2
            String str2 = String.valueOf(a);
}

4.2 String轉(zhuǎn)int

public static void main(String[] args) {
            String str = "123456";
            int b = Integer.valueOf(str);
            int c = Integer.parseInt(str);
}

五、總結(jié)

2021042308541519

內(nèi)置數(shù)據(jù)類型共有8種,每一個(gè)內(nèi)置類型都會(huì)對(duì)應(yīng)一個(gè)包裝類,這里也不深入講解。簡(jiǎn)單來(lái)說(shuō)就是方便了數(shù)據(jù)的處理
感謝閱讀!

關(guān)于Java基礎(chǔ)知識(shí)的數(shù)據(jù)類型內(nèi)容到這里就已經(jīng)結(jié)束了,想要對(duì)Java基礎(chǔ)知識(shí)有更多的了解,可以搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章。希望本篇文章能給大家一個(gè)幫助,同時(shí)也希望大家能夠多多支持!


0 人點(diǎn)贊