Java基礎 - 數據類型和運算符

Java 語言支持的類型分爲兩類:基本數據類型(Primitive Type)和引用類型(Reference Type)。算法

基本數據類型

數值類型

整數類型

byte

一個 byte 類型在內存中佔 8 位(1字節)範圍-128(-2^7) ~ 127(2^7 -1)express

short

一個 short 類型在內存中佔 16 位(2字節)範圍-32768(-2^15) ~ 32767(2^15-1)數組

int

一個 int 類型在內存佔 32 位(4字節)範圍-2147483648(-2^31) ~ 2147483647(2^31-1)編碼

long

一個 long 類型在內存中佔 64 位(8 字節)範圍-2^63 ~ 2^63-13d

若是直接將一個較小的整數值(在 byte 或者 short 類型的範圍內)賦給一個 byte 或者 short 的變量,系統會自動把這個整數值當成 byte 或者 short 類型來處理.
若是使用一個巨大的整數值(超出 int 類型的範圍)時,Java 不會自動把這個整數值當成 long 類型來處理。若是但願系統把一個整數值當成 long 類型來處理,應在這個整數值後增長 l 或者 L 作後綴。code

浮點類型

Java 的浮點類型有固定的表數範圍和字段長度,字段長度和表數範圍與機器無關,Java 的浮點類型遵循 IEEE 標準,採用二進制的科學計數法來表示。對象

float

一個 float 類型在內存中佔 4 字節,32 位,第 1 位是符號位,接下來的 8 位表示指數,在接下來的 23 位表示位數。blog

double

一個 double 類型在內存中佔 8 字節,64 位,第 1 位表示符號位,接下來的 11 位表示指數,在接下來的 52 位表示尾數。接口

由於 Java 浮點數是用二進制的科學計數法來表示浮點數,所以可能不能精確表示一個浮點數。例如把 5.12345f賦值給一個 float 類型的變量,接着輸出這個變量時看到這個變量的值已經發生了改變。 若是須要一個精確的浮點數,可使用 BigDecimal 類。
浮點類型默認的是 double 若是但願 Java 把一個浮點類型值當成 float 來處理,應當在這個浮點類型值後面緊跟一個 f 或者 F
Java 還提供了三個特殊的浮點數值:正無窮大,負無窮大和非數,用於表示溢出或者出錯。正浮點數除以 0(Java會自動把和浮點數進行運算的整數 0 當成浮點數 0.0 處理)獲得正無窮大(Double/Float 類中的 POSITIVE_INFINITY).使用一個負浮點數除以 0 獲得負無窮大(Double/Float 類中的 NEGATIVE_INFINITY)
表示。0.0/0.0 將獲得一個非數 NaN.
全部的正無窮大以及負無窮大都相等,全部的非數都不相等。
100_000_000_000數值中的_方便閱讀。無實際含義。內存

Java的基本數據類型

字符型

char

字符型有三種表示形式

  • 直接經過單個字符來指定字符型值,例如'A''9''0' 等.
  • 經過轉移字符標識特殊字符型值,例如'\n''\t'
  • 直接使用 Unicode 值來表示字符型值,格式是'\uXXXX',其中 XXXX 表明 一個十六進制的整數。

Java 語言中經常使用的轉移字符

字符類型也可使用十六進制編碼方式來表示,範圍是'\u0000'~'\uFFFF',一共能夠表示 65535 個字符,其中前 256 個('\u0000'~'\u00FF')字符和 ASCII 碼中的字符徹底重合。
計算機底層保存字符時,實際上保存的是該字符對應的編號,所以 char 類型的值能夠直接做爲整形使用,它至關於一個 16 位的無符號整數,表數範圍是 0~65535.
若是把 0~65535 範圍內的一個 int 整數賦給 char 類型變量,系統自動會把這個 int 整數當成 char 類型來處理

布爾類型

boolean

用於表示邏輯上的, boolean類型的數值只能是 true 或者 false, 不能用 0 或者非0 來表示,其餘基本數據類型也不能轉換成 boolean 類型。

Java 規範沒有強制指定 boolean 類型的變量所佔用的內存空間。因爲大部分計算機在內存分配時容許的最小內存單元是字節(8 位),所以 bit 大部分時候實際佔用 8 位。
Java虛擬機規範一書提到 :

  • 在Java虛擬機中沒有任何供 boolean值專用的字節碼指令,Java語言表達式所操做的
    boolean值,在編譯以後都使用Java虛擬機中的int數據類型來代替。
  • Java虛擬機直接支持 boolean類型的數組,虛擬機的 navarra指令參見第6章的newarray小節能夠建立這種數組。boolean類型數組的訪問與修改共用byte類型數組的baload和 bastore指令。
    由於在虛擬機規範中說了,boolean值在編譯以後都使用Java虛擬機中的int數據類型來代替,而int是4個字節,那麼boolean值就是4個字節。
  • boolean類型數組的訪問與修改共用byte類型數組的baload和 bastore指令,由於二者共用,只有二者字節同樣才能通用呀,因此byte數組中一個byte是1個字節,那麼boolean數組中boolean是1個字節。

總結:boolean在數組狀況下爲1個字節,單個boolean爲4個字節。

基本數據類型的轉換

Java 全部的數值類型能夠相互轉換,若是系統支持把某種基本類型的值直接賦給另外一種基本類型的變量,則這種方式被稱爲自動類型轉換.當把一個表述範圍小的數值或者變量直接賦給另外一個表數範圍大的變量時,系統能夠進行自動類型轉換.不然就須要強制轉換.

自動類型轉換

表數範圍小的數值賦給表數範圍的變量.
Java 支持自動類型轉換圖:
Java自動類型轉換圖

除了基本類型的自動轉換外,把任何基本類型的值和字符串進行鏈接運算時,基本類型的值將自動轉爲字符串類型(ps:將基本類型轉化爲字符串類型時,能夠把基本類型的值與空字符串相加).

強制類型轉換

若是想把上圖箭頭右邊的數據類型轉換爲左邊的類型,則必須進行強制類型轉換.強轉的格式爲(TargetType)value強制類型轉換的運算符是圓括號.
須要注意強制類型轉換會形成數據溢出,從而致使數據丟失.

表達式類型的自動提高

當一個算術表達式中包含多個基本類型的值時, 整個算術表達式的數據類型將發生自動提高.
Java 自動提高規則:

  • 全部的 byte 類型,short 類型和 char 類型將被提高到 int 類型.
  • 整個算術表達式的數據類型自動提高到與表達式中最高等級操做一樣的類型.操做數的等級如上如所示,箭頭右邊的等級高於箭頭左邊類型的等級.

引用數據類型

接口

數組

運算符

算術運算符

  • +: 加法運算符(還能夠做爲字符串的鏈接運算符)
  • -: 減法運算符
  • *: 乘法運算符
  • /: 除法運算符
    若是除法運算的兩個操做數都是整數類型,則計算結果也是整數,就是將天然除法的結果截取取整。若是除法運算兩個操做數都是整數類型,則除數不能夠是 0,不然將引起除以 0 異常。若是一個或兩個操做數是浮點數,則計算結果也是浮點數,這個結果就是天然除法的結果,並且此時容許除數是 0 或者 0.0,獲得的結果是正無窮大揮着負無窮大。
  • %: 求餘運算符
  • ++: 自加。
    1. 自加是單目運算符,只能操做一個數。
    2. 自加運算符只能操做單個數值型(整形、浮點型)變量,不能操做常量或表達式。
    3. 若是 ++ 放在左邊,則先把操做數加 1,而後才把操做數放入表達式中運算。若是 ++ 放在右邊,則先把操做數放入表達式中運算,而後才把操做數加 1
  • --: 自減。單目運算符。與++ 相似,只是將操做數 -1

位運算符

  • &: 按位與。當兩位同時爲 1 時才返回 1.
  • |: 按位或。只要有一位爲 1 便可返回 1。
  • ~: 按位非。單目運算符,將操做數的每一個位(包括符號位)所有取反。
  • ^: 按位異或。當兩位相同時返回0,不一樣時返回 1。
  • <<: 左移運算符。
  • >>: 右移運算符.
  • >>>: 無符號右移運算符.

位運算符運算法則

邏輯運算符

  • &&: 與,先後兩個操做數必須都是 true 才返回 true,不然飯後 false.
  • &: 不短路與,與 &&做用相同,但不會短路.
  • ||:或,只要兩個操做數一個爲true,則返回 true,不然返回 false
  • |: 不短路或, 做用與 ||相同,但不會短路.
  • !: 非. 取反
  • ^: 異或. 當兩個操做數不一樣時返回 true,相同時返回 false

三目運算符

  • ?: 三目運算符只有一個,語法格式爲(expression) ? if-true-statement : if-false-statement

注意:
自加和自減只能用於慚怍變量,不能用於操做數值直接量、常量或表達式。

賦值運算符

  • =

擴展後的賦值運算符

  • +=: 對於 x+=y,即對應於 x = x + y
  • -=: 對於 x-=y,即對應於 x = x - y
  • *=: 對於 x*=y,即對應於 x = x * y
  • /=: 對於 x/=y,即對應於 x = x / y
  • %=: 對於 x%=y,即對應於 x = x % y
  • |=: 對於 x|=y,即對應於 x = x | y
  • ^=: 對於 x^=y,即對應於 x = x ^ y
  • <<=: 對於 x<<=y,即對應於 x = x << y
  • >>=: 對於 x>>=y,即對應於 x = x >> y
  • >>>=: 對於 x>>>=y,即對應於 x = x >>> y

比較運算符

  • >: 大於,只支持左右兩邊操做數是數值類型.
  • >=: 大於等於,只支持左右兩邊操做數是數值類型.
  • <: 小於,只支持左右兩邊操做數是數值類型.
  • <=: 小於等於,只支持左右兩邊操做數是數值類型.
  • ==: 等於,若是比較的兩個操做數都是數值類型,即便兩個操做數的類型不一樣,只要他們值相等,也返回true. 若是兩個操做數都是引用類型,那麼比較的是兩個操做數的引用地址.
  • !=: 不等於.數據類型比較,無關類型,只進行值比較.引用類型比較對象的引用地址.

運算符的優先級

運算符的優先級

  • 不要把一個表達式寫的過於複雜,若是一個表達式複雜,則應該拆成幾步來執行
  • 不要過多的依賴運算符的優先級來控制表達式的執行順序,儘可能用 () 來控制
相關文章
相關標籤/搜索