基礎型別的簡單運算,三目運算和字串的加法
[1]基本型別分類
- 整數類:
型別名 | 型別長度 |
---|---|
byte | 1 byte |
short | 2 byte |
int | 4 byte |
long | 8 byte |
2. 浮點數類
型別名 | 型別長度 |
---|---|
float | 4 byte |
double | 8 byte |
3. 字元類
型別名 | 型別長度 |
---|---|
char | 2 byte |
4. 布林類
型別名 | 型別長度 |
---|---|
boolean | true & false |
[2]同基本型別變數間簡單四則運算
同基本型別變數的簡單四則運算大致分為3種類型
1. 返回原型別不變
其中int,long,float和double四種基本型別的簡單四則運算返回值均為原基本型別.
2. 返回值型別改變
其中byte,short和char型別的基本型別變數的在簡單四則運算過程會隱式自動轉換為int值進行計算,且返回值型別也是int值,無法將結果直接賦值給原型別變數.
注:整數直接量(或只包含字面量的表示式)可以直接給char/byte/short賦值
3. boolean型別變數無法進行運算
[3]不同基本型別變數間簡單四則運算
根據同類型間四則運算的規則可以知道,byte/short/char型別變數在計算時都是轉換為對應的等值int型別進行計算的. 所以在討論前我們可以將byte/short/int/char四者歸為一談.
- 統一大類下的子項基本型別間的計算,結果值為較大的型別,char做整數型別進行計算比如:
byte/short/int/char (+-*/) long = long
float (+-*/) double = double
- 任何整數型別變數和char型別變數和float/double型別變數進行計算,結果為對應的浮點數型別
- boolean型別變數無法進行計算
[4]基礎型別的三目運算子
三目運算的大概格式可以分為三個部分如下所示
判斷表示式?結果表示式1:結果表示式2
判斷表示式的結果必須是true/false,否則運算不成立. 若判斷表示式為true則返回結果表示式1的值,若為false則返回結果表示式2的值.
以上是三目運算子簡單的運算規則,在基本資料型別配合三目運算子進行簡單的賦值運算時也有幾個注意點需要關注,為了便於書寫規定結果表示式1的變數名為fv(first value),結果表示式2的變數名為sv(second value)
- fv與sv是同類型變數則該運算的返回值型別也為同類型(包括byte/short/char)
- fv與sv一為整數型別,另一為浮點數型別變數,則返回值型別為對應的浮點數型別
[5]字串與基本型別的加法
字串不是基本型別,但是由於字串的重要性和Java在設計String類時給予它的諸多特性,導致我們字串物件也有了一部分基本型別的特徵. 我們可以對字串物件使用加法(只有加法),可以直接使用字面量建立字串物件等.
字串物件與基本型別變數的加法的規則如下
注意字串物件在表示式中的位置. 當字串物件進入計算時,之後的計算方式都為將值拼接進字串而不是按照基本型別變數的計算方法
與基本型別間的四則運算不同
char型別在與字串物件進行拼接時不會轉換為int型別的值,而是使用原本的字元.
boolean型別變數也可以參與與字串物件的加法中,它的拼接規則為將變數轉換為對應的”true”/”false”字串然後進行拼接
[6]最後的三點注意點
注意基本型別間的小型別變數可以直接向大型別變數隱式轉換,返回值型別若為char/byte,使用int型別變數也可以成功獲取而不報錯.
但是這只是針對使用大型別去獲取小型別的值,而大型別值若想轉變為小型別的值則必須要使用顯示的強制轉換,但不保證精度問題.浮點數型別的計算結構有較大可能丟失精度,比如
int i = 2; double d = 1.00000001; System.out.println(i-d);//output:0.9999999900000001
問題出自於底層二進位制與十進位制浮點數間的轉換過程. 在十進位制向二進位制的轉換過程中小數位需要不斷的乘以2一直到小數部分乘淨為止(即小數位為0).
但是許多浮點數因為小數位的值乘不淨,就會導致最後的計算結果值在換算成十進位制時會產生進度丟失問題.String型別物件時不可變物件,使用”+”拼接字串是一項比較消耗JVM運算時間和效能的操作.當我們需要對一個字串物件進行大量的拼接更改操作時,推薦使用StringBuffer/StringBuilder.