學習不只要學習新的東西,並且還要時不時的回過頭撿漏...編程
本文參考老馬說編程系列等文,在此推薦你們關注老馬說編程系列文章數組
正文學習
基礎知識spa
數據類型主要是爲了對數據進行分類,方便理解和操做,在Java中,有以下基本數據類型:code
對象是一種基本數據類型、數組和其餘對象組合而成的一個比較複雜的數據類型對象
內存能夠直接理解成一個很長的數組,CPU能夠直接定位到內存中的任何一個位置blog
變量的起源是因爲將數據類型置於內存後,爲了方便地找到和操做這個數據,給這個位置起的一個名字;因此叫變量,是由於它僅僅表示的是內存中的位置,這個位置存放的值是能夠變化的內存
內存表示ci
一個基本類型變量,內存中只會有一塊對應的內存空間。但數組有兩塊,一塊用於存儲數組內容自己,另外一塊用於存儲內容的位置。class
上圖在進一步解釋,就是咱們常常說的,基本數據類型保存的是值自己,而引用類型保存的是值所在的位置
運算規則
運算時要注意結果的範圍,使用恰當的數據類型。兩個正數均可以用int表示,但相乘的結果可能就會超,超出後結果會使人困惑
int a = 2147483647*2; //2147483647是int能表示的最大值
a的結果是-2。爲何是-2咱們暫不解釋,要避免這種狀況,咱們的結果類型應使用long,但只改成long也是不夠的,由於運算仍是默認按照int類型進行,須要將至少一個數據表示爲long形式,即在後面加L或l,下面這樣纔會出現指望的結果:
long a = 2147483647*2L;
另外,須要注意的是,整數相除不是四捨五入,而是直接捨去小數位:
double d = 10/4;
結果是2而不是2.5,若是要按小數進行運算,須要將至少一個數表示爲小數形式,或者使用強制類型轉化,即在數字前面加(double),表示將數字看作double類型,以下所示任意一種形式均可以:
double d = 10/4.0; double d = 10/(double)4;
在進行小數運算的時候,常常會出現一些很奇怪的值,好比執行
這是因爲計算機底層對於浮點數(小數)表示並不精確致使的,歸根到底都是因爲2進制的緣由
自增/自減是對本身作加一和減一操做,但每一個都有兩種形式,一種是放在變量後,例如a++, a--,另外一種是放在變量前,例如++a, --a
1 int a = 0; 2 System.out.println(a++);//0 3 int b = 0; 4 System.out.println(++b);//1 5 int c = 0; 6 System.out.println(c--);//0 7 int d = 0; 8 System.out.println(--d);//-1
邏輯運算符具體有以下幾種
補充
補碼
二進制使用最高位表示符號位,用1表示負數,用0表示正數。但負數表示不是簡單的將最高位變爲1,好比:
這種表示法稱爲補碼錶示法,而符合咱們直覺的表示稱爲原碼錶示法,補碼錶示就是在原碼錶示的基礎上取反而後加1。取反就是將0變爲1,1變爲0。爲何負數要使用補碼的形式呢?這是由於補碼在計算加減的時候能保證是正確的!
位移操做
左移:操做符爲<<,向左移動,右邊的低位補0,高位的就捨棄掉了,將二進制看作整數,左移1位就至關於乘以2。
無符號右移:操做符爲>>>,向右移動,右邊的捨棄掉,左邊補0。
有符號右移:操做符爲>>,向右移動,右邊的捨棄掉,左邊補什麼取決於原來最高位是什麼,原來是1就補1,原來是0就補0,將二進制看作整數,右移1位至關於除以2。
有的小數計算爲何是正確的
System.out.println(0.1f+0.1f); //0.2
System.out.println(0.1f*0.1f); //0.010000001
按照上面所說的,第一行應該不等於0.2纔是正確的,可是爲何等於0.2呢?其實,這只是Java語言給咱們形成的假象,計算結果其實也是不精確的,可是因爲結果和0.2足夠接近,在輸出的時候,Java選擇了輸出0.2這個看上去很是精簡的數字,而不是一箇中間有不少0的小數。在偏差足夠小的時候,結果看上去是精確的,但不精確其實才是常態。若是真的須要比較高的精度,一種方法是將小數轉化爲整數進行運算,運算結束後再轉化爲小數,另外的方法通常是使用十進制的數據類型,這個沒有統一的規範,在Java中是BigDecimal