JAVA的基本數據類型以及常見面試題

一、JAVA基本數據類型介紹

基本類型,或者叫做內置類型,是JAVA中不同於類的特殊類型。它們是我們編程中使用最頻繁的類型,因此面試題中也總少不了它們的身影,在這篇文章中我們將

從面試中常考的。

幾個方面來回顧一下與基本類型相關的知識。

基本類型共有八種,它們分別都有相對應的包裝類。關於它們的詳細信息請看下錶:

基本類型可以分爲三類,字符類型char,布爾類型boolean以及數值類型byte、short、int、long、float、double。數值類型又可以分爲整數類型byte、

short、int、long和浮點數類型float、double。JAVA中的數值類型不存在無符號的,它們的取值範圍是固定的,不會隨着機器硬件環境或者操作系統的改變而

改變。實際上,JAVA中還存在另一種基本類型void,它也有對應的包裝類 java.lang.Void,不過我們無法直接對它們進行操作。對於數值類型的基本類型的

取值範圍,我們無需強制去記憶,因爲它們的值都經以常量的形式定義在對應的包裝類中了。請看下面的例子:

public class PrimitiveTypeTest {  
    public static void main(String[] args) {  
        // byte  
        System.out.println("基本類型:byte 二進制位數:" + Byte.SIZE);  
        System.out.println("包裝類:java.lang.Byte");  
        System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);  
        System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);  
        System.out.println();  
  
        // short  
        System.out.println("基本類型:short 二進制位數:" + Short.SIZE);  
        System.out.println("包裝類:java.lang.Short");  
        System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);  
        System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);  
        System.out.println();  
  
        // int  
        System.out.println("基本類型:int 二進制位數:" + Integer.SIZE);  
        System.out.println("包裝類:java.lang.Integer");  
        System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);  
        System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);  
        System.out.println();  
  
        // long  
        System.out.println("基本類型:long 二進制位數:" + Long.SIZE);  
        System.out.println("包裝類:java.lang.Long");  
        System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);  
        System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);  
        System.out.println();  
  
        // float  
        System.out.println("基本類型:float 二進制位數:" + Float.SIZE);  
        System.out.println("包裝類:java.lang.Float");  
        System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);  
        System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);  
        System.out.println();  
  
        // double  
        System.out.println("基本類型:double 二進制位數:" + Double.SIZE);  
        System.out.println("包裝類:java.lang.Double");  
        System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);  
        System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);  
        System.out.println();  
  
        // char  
        System.out.println("基本類型:char 二進制位數:" + Character.SIZE);  
        System.out.println("包裝類:java.lang.Character");  
        // 以數值形式而不是字符形式將Character.MIN_VALUE輸出到控制檯  
        System.out.println("最小值:Character.MIN_VALUE="  
                + (int) Character.MIN_VALUE);  
        // 以數值形式而不是字符形式將Character.MAX_VALUE輸出到控制檯  
        System.out.println("最大值:Character.MAX_VALUE="  
                + (int) Character.MAX_VALUE);  
    }  
}  

輸出結果:

基本類型:byte 二進制位數:8
包裝類:java.lang.Byte
最小值:Byte.MIN_VALUE=-128
最大值:Byte.MAX_VALUE=127


基本類型:short 二進制位數:16
包裝類:java.lang.Short
最小值:Short.MIN_VALUE=-32768
最大值:Short.MAX_VALUE=32767


基本類型:int 二進制位數:32
包裝類:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647


基本類型:long 二進制位數:64
包裝類:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808
最大值:Long.MAX_VALUE=9223372036854775807


基本類型:float 二進制位數:32
包裝類:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45
最大值:Float.MAX_VALUE=3.4028235E38


基本類型:double 二進制位數:64
包裝類:java.lang.Double
最小值:Double.MIN_VALUE=4.9E-324
最大值:Double.MAX_VALUE=1.7976931348623157E308


基本類型:char 二進制位數:16
包裝類:java.lang.Character
最小值:Character.MIN_VALUE=0
最大值:Character.MAX_VALUE=65535

Float和Double的最小值和最大值都是以科學記數法的形式輸出的,結尾的“E+數字”表示E之前的數字要乘以10的多少倍。比如3.14E3就是3.14×1000=3140,

3.14E-3就是3.14/1000=0.00314。

大家將運行結果與上表信息仔細比較就會發現float、double兩種類型的最小值與Float.MIN_VALUE、 Double.MIN_VALUE的值並不相同,這是爲什麼呢?實際上

Float.MIN_VALUE和Double.MIN_VALUE分別指的是 float和double類型所能表示的最小正數。也就是說存在這樣一種情況,0到±Float.MIN_VALUE之間的值

float類型無法表示,0 到±Double.MIN_VALUE之間的值double類型無法表示。這並沒有什麼好奇怪的,因爲這些範圍內的數值超出了它們的精度範圍。

基本類型存儲在棧中,因此它們的存取速度要快於存儲在堆中的對應包裝類的實例對象。從Java5.0(1.5)開始,JAVA虛擬機(Java Virtual Machine)可以

完成基本類型和它們對應包裝類之間的自動轉換。因此我們在賦值、參數傳遞以及數學運算的時候像使用基本類型一樣使用它們的包裝類,但這並不意味着你可以

通過基本類型調用它們的包裝類才具有的方法。另外,所有基本類型(包括void)的包裝類都使用了final修飾,因此我們無法繼承它們擴展新的類,也無法重寫

它們的任何方法。

二、Java基本數據類型之間的轉換

Java 語言是一種強類型的語言。強類型的語言有以下幾個要求:

變量或常量必須有類型:要求聲明變量或常量時必須聲明類型,而且只能在聲明以後才能使用。

賦值時類型必須一致:值的類型必須和變量或常量的類型完全一致。

運算時類型必須一致:參與運算的數據類型必須一致才能運算。

但是在實際的使用中,經常需要在不同類型的值之間進行操作,這就需要一種新的語法來適應這種需要,這個語法就是數據類型轉換。

在數值處理這部分,計算機和現實的邏輯不太一樣,對於現實來說,1和 1.0 沒有什麼區別,但是對於計算機來說,1 是整數類型,而 1.0 是小數類型,其在內

存中的存儲方式以及佔用的空間都不一樣,所以類型轉換在計算機內部是必須的。

Java 語言中的數據類型轉換有兩種:

自動類型轉換:編譯器自動完成類型轉換,不需要在程序中編寫代碼。

強制類型轉換:強制編譯器進行類型轉換,必須在程序中編寫代碼。

由於基本數據類型中 boolean 類型不是數字型,所以基本數據類型的轉換是出了 boolean 類型以外的其它 7 種類型之間的轉換。下面來具體介紹兩種類型轉換

的規則、適用場合以及使用時需要注意的問題。

1、自動類型轉換

自動類型轉換,也稱隱式類型轉換,是指不需要書寫代碼,由系統自動完成的類型轉換。由於實際開發中這樣的類型轉換很多,所以 Java 語言在設計時,沒有爲該操作設計語法,而是由 JVM 自動完成。

轉換規則:從存儲範圍小的類型到存儲範圍大的類型。

具體規則爲:byte→short(char)→int→long→float→double

也就是說 byte 類型的變量可以自動轉換爲 short 類型,示例代碼:

byte b=10;
short sh=b;

這裏在給sh賦值時,JVM首先將b的值轉換成short類型然後再賦值給sh。

當然,在類型轉換的時候也可以跳躍,就是byte也可以自動轉換爲int類型的。

注意問題:在整數之間進行類型轉換的時候數值不會發生變化,但是當將整數類型特別是比較大的整數類型轉換成小數類型的時候,由於存儲精度的不同,可能

會存在數據精度的損失。

2、強制類型轉換

強制類型轉換,也稱顯式類型轉換,是指必須書寫代碼才能完成的類型轉換。該類類型轉換很可能存在精度的損失,所以必須書寫相應的代碼,並且能夠忍受該種

損失時才進行該類型的轉換。

轉換規則:從存儲範圍大的類型到存儲範圍小的類型。

具體規則爲:double→float→long→int→short(char)→byte

語法格式爲:(轉換到的類型)需要轉換的值

double d=3.14;
int i=(int) d;

注意問題:強制類型轉換通常都會存儲精度的損失,所以使用時需要謹慎。

三、常見面試題:

1、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 +=1;有什麼錯?

答:對於short s1=1;s1=s1+1來說,在s1+1運算時會自動提升表達式的類型爲int,那麼將int賦予給short類型的變量s1會出現類型轉換錯誤。

對於short s1=1;s1+=1來說 +=是java語言規定的運算符,java編譯器會對它進行特殊處理,因此可以正確編譯。

2、char類型變量能不能儲存一箇中文的漢子,爲什麼?

char類型變量是用來儲存Unicode編碼的字符的,unicode字符集包含了漢字,所以char類型當然可以存儲漢字的,還有一種特殊情況就是某個生僻字沒有包含在

unicode編碼字符集中,那麼就char類型就不能存儲該生僻字。

3、Integer和int的區別

int是java的8種內置的原始數據類型。Java爲每個原始類型都提供了一個封裝類,Integer就是int的封裝類。

int變量的默認值爲0,Integer變量的默認值爲null,這一點說明Integer可以區分出未賦值和值爲0的區別,比如說一名學生沒來參加考試,另一名學生參加考

試全答錯了,那麼第一名考生的成績應該是null,第二名考生的成績應該是0分。關於這一點Integer應用很大的。

Integer類內提供了一些關於整數操作的一些方法,例如上文用到的表示整數的最大值和最小值。

4、switch語句能否作用在byte上,能否作用在long上,能否作用在string上?

byte的存儲範圍小於int,可以向int類型進行隱式轉換,所以switch可以作用在byte上

long的存儲範圍大於int,不能向int進行隱式轉換,只能強制轉換,所以switch不可以作用在long上

string在1.7版本之前不可以,1.7版本之後switch就可以作用在string上了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章