溫故而知新---Java(一)

學習不只要學習新的東西,並且還要時不時的回過頭撿漏...編程

本文參考老馬說編程系列等文,在此推薦你們關注老馬說編程系列文章數組

正文學習

基礎知識spa

數據類型主要是爲了對數據進行分類,方便理解和操做,在Java中,有以下基本數據類型:code

  • 整數類型:有四種整型 byte/short/int/long,內存空間分別佔用1/2/4/8個字節
  • 小數類型:有兩種類型 float/double,,內存空間分別是佔用4/8個字節
  • 字符類型:char,表示單個字符,內存空間是佔用2個字節
  • 真假類型:boolean,表示真假

對象是一種基本數據類型、數組和其餘對象組合而成的一個比較複雜的數據類型對象

內存能夠直接理解成一個很長的數組,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

邏輯運算符具體有以下幾種

  • 與(&):兩個都爲true纔是true,只要有一個是false就是false
  • 或(|):只要有一個爲true就是true,都是false纔是false
  • 非(!):針對一個變量,true會變成false, false會變成true
  • 異或(^):兩個相同爲false, 兩個不相同爲true
  • 短路與(&&): 和&相似,不一樣的是A&B,若是A是false還需在判斷B是false,而A&&B,若是A是false,那麼直接就是false
  • 短路或 (||):與|相似,不一樣的是A|B,若是A是true還需在判斷B是true,而A||B,若是A是true,那麼直接就是true

補充

補碼

二進制使用最高位表示符號位,用1表示負數,用0表示正數。但負數表示不是簡單的將最高位變爲1,好比:

  • byte a = -1,若是隻是將最高位變爲1,二進制應該是10000001,但實際上,它應該是11111111。
  • byte a=-127,若是隻是將最高位變爲1,二進制應該是11111111,但實際上,它卻應該是10000001。

這種表示法稱爲補碼錶示法,而符合咱們直覺的表示稱爲原碼錶示法,補碼錶示就是在原碼錶示的基礎上取反而後加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

相關文章
相關標籤/搜索