八種基本數據類型


先說理論,八種基本數據類型:byte、short、int、long、float、double、boolean、char。

概念

byte

  • 8位、有符號的以二進制補碼表示的整數
  • min :    -128(-2^7)
  • max:   127(2^7-1)
  • default: 0
  • 對應包裝類:Byte

short

  • 16位、有符號的以二進制補碼表示的整數
  • min :    -32768(-2^15)
  • max:   32767(2^15 - 1)
  • default: 0
  • 對應包裝類:Short

int

  • 32位、有符號的以二進制補碼表示的整數
  • min :    -2,147,483,648(-2^31)
  • max:   2,147,483,647(2^31 - 1)
  • default: 0
  • 對應包裝類:Integer

long

  • 64位、有符號的以二進制補碼表示的整數
  • min :    -9,223,372,036,854,775,808(-2^63)
  • max:   9,223,372,036,854,775,807(2^63 -1)
  • default: 0
  • 對應的包裝類:Long

float

  • 單精度、32位、符合IEEE 754標准的浮點數
  • float 在儲存大型浮點數組的時候可節省內存空間
  • 浮點數不能用來表示精確的值,如貨幣
  • default: 0.0f
  • 對應的包裝類:Float

double

  • 雙精度、64位、符合IEEE 754標准的浮點數
  • 浮點數的默認類型為double類型
  • double類型同樣不能表示精確的值,如貨幣
  • default: 0.0d
  • 對應的包裝類:Double

char

  • char類型是一個單一的 16 位 Unicode 字符
  • 最小值是 \u0000(即為0)
  • 最大值是 \uffff(即為65,535)
  • char 數據類型可以儲存任何字符
  • 對應的包裝類:Character

boolean

  • boolean數據類型表示一位的信息
  • 只有兩個取值:true 和 false
  • 這種類型只作為一種標志來記錄 true/false 情況
  • 對應的包裝類:Boolean

實例

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

復制代碼
public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        // 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。

關系

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;

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

3.運算

同類型之間運算,只需注意考慮臨界值的問題。 

非同類型之間,會用到上面的1、2 轉換相同類型進行運算。

經典面試題

 

 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上了

 

5.是否存在 x>x+1?為什么?

  這就是臨界值,當x=最大值  時; 再加1(根據二進制運算+1)就超過了它的臨界值,剛好會是它最小值。  

舉個例子吧,byte  8位, -128 ~ 127    

127  二進制: 0111 1111

1 二進制 :     0000 0001

相加結果:     1000 0000

byte  8位 有符號,   1000 0000  剛好 為  -128

 

復制代碼
public class Test {

    public static void main(String[] args) {

        // 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(Integer.MAX_VALUE+1);


    }

}
復制代碼

結果: 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM