1. 程式人生 > >一篇文章讀懂Java語言運算子(即操作符)

一篇文章讀懂Java語言運算子(即操作符)

計算機的最基本用途之一就是執行數學運算。在最底層,JAVA中的資料是通過使用操作符來操作的。

將操作符以功能為區分進行分組:

  • 算術運算子(執行加減乘除,自增、自減)
  • 關係運算符(判斷值與值的關係為真或為假 例如1>2為false)
  • 位運算子(進行按位運算)
  • 邏輯運算子(&&、|| 與 ! 參與邏輯運算)
  • 賦值運算子(賦值予變數)
  • 其他運算子(三元操作符;instance of判斷等等)

操作符應用範圍

操作符操作一個或多個引數,併產生一個新的引數。在JAVA語言中,   +、-、*、/、=    (加減乘除和等於)的用法與其他語言類似。

操作符一般只能操作“基本型別”,例外是    ①、"=" "==" "!=" 可以操作所有物件    ②、String型別支援"+"和"+="

 

優先順序

①、先乘除後加減。

②、括號優先

 

賦值

賦值使用操作符“=”,意思是“將右邊的值複製給左邊”,賦值的條件是左邊必須為一個明確,已命名的變數。必須有一個物理空間以儲存右邊變數的值。

package javaThinking_03;

class Tank{
    int level;
}
public class Assignment {
    public
static void main(String[] args) { Tank t1 = new Tank(); Tank t2 = new Tank(); t1.level = 1; t2.level = 2; System.out.println("t1:"+t1.level+" t2:"+t2.level); t1 = t2; //將t2的引用賦予t1,此時t1的引用將和t2的引用指向同一個物件 System.out.println("t1:"+t1.level+" t2:"+t2.level); t2.level
= 3; //將t2指向的物件中的level屬性改成3 System.out.println("t1:"+t1.level+" t2:"+t2.level); } }

輸出:

t1:1 t2:2
t1:2 t2:2
t1:3 t2:3

原因在程式碼註釋中已經說明。 這個現象被稱為“別名問題”,解決方案是將t1=t2修改為t1.level=t2.level,直接複製右邊的值給左邊。

 

自動遞增與遞減

package javaThinking_03;

public class AutoInc {
    /**
     * 作為操作符++指的是對資料的操作,而i是儲存資料的變數;
     * i++指先執行程式,再進行i=i+1操作;
     * ++i指先進行i=i+1操作,再執行程式;
     */
    public static void main(String[] args) {
        int i = 1;
        System.out.println("i++:" + i++);
        System.out.println("++i:" + ++i);
        System.out.println("i:  " + i);
        System.out.println("i--:" + i--);
        System.out.println("--i:" + --i);
        System.out.println("i:  " + i);
    }
}

輸出結果:

i++:1
++i:3
i: 3
i--:3
--i:1
i: 1

 

關係操作符

主要應用於測試物件的等價性。

①、使用==或!=比較物件的引用;

②、使用equals()同樣比較物件的引用;

Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1==n2);
System.out.println(n1!=n2);
//輸出結果:  false true

即使物件n1與n2儲存的內容是相同的int型別資料47,但操作符“==”比較的是物件的引用。                

 * equals()方法同樣預設比較物件的引用,通過重寫equals()也可以達到比較物件內容的效果。                

                                                         

邏輯操作符

邏輯操作符“與”(&&)、“或”(||)、“非”(!)能根據引數的邏輯關係生成一個布林值。

概念比較簡單,其中需要重視的有“短路”的概念,即一旦能夠準確無誤地確定整個表示式的值,則不再計算表示式餘下部分了。短路操作也就是我們常用的"&&" "||"等等,而非短路操作則是對應的"&" "|"等等,非短路條件操作符即使是已經能確定結果也會執行完畢邏輯運算。

那麼什麼時候用短路操作符,什麼時候用非短路操作符呢?為了獲得潛在的效能提升,我們在邏輯表示式可能有一部分不必計算的時候推薦使用短路操作符。

 

移位操作符(小數點移位操作)

①、作用。移位操作符只可用於操作int型別,左移位操作符(<<)能夠按操作符右側指定的位數將操作符左邊的運算元向左移動(在低位補0),右移位操作符(>>)則按指定的位數將操作符左邊的運算元向右移動。

②、作用範圍。char,short,byte等型別進行移位處理時,在移位進行之前,它們會先轉化為int型別。

 

三元操作符(一種程式碼簡化寫法)

當我們書寫if-else表示式的時候,有時候要花費多行的錄入,而只是完成簡單的判斷和擇值操作,那麼我們如何簡化這個過程?

三元操作符的表示式:boolean-exp ? value0:value1  最終得到的結果,仍舊是一個值。

它的邏輯:如布林值為真,則選擇左邊的值value0,如布林值為假,則選擇右邊的值value1。但是,如果不夠熟悉,使用它仍舊可能引起令程式碼難以理解的問題,請考慮後予以使用。

 

型別轉換操作符

在適當的時候,java會將一種資料型別自動轉換為另一種。加入我們為一個float變數賦予一個1的整數值,編譯器會將int自動轉換為float。Java允許我們把任何基本資料型別轉化為其他基本資料型別,但布林值不允許轉換。

①、截尾和攝入

java.lang是所有類預設的導包,呼叫時不需要額外匯入。我們在做四捨五入的時候,只需要呼叫java.lang.Math中的round()方法:

//四捨五入測試
public class mathRound(){
    public static void main(){
         double b1=0.7,b2=0.4;
         float f1=0.7f,f2=0.4f;            
         System.out.print(Math.round(b1)+" "+Math.round(b2));
         System.out.printf(Math.round(f1)+" "+Math.round(f2));
    }
}

列印結果:

1,0 

1,0

②、基本資料型別操作提升

高精度與相對低精度型別執行算數運算,則最生成結果為高精度型別。比如int值與float值做運算,最終生成的結果為float。float值與double值做運算,得出結果為double

 

總結:Java語言的操作符其實與C語言很類似,是實現一門程式語言數學運算的令箭。通過在用途上理解,在實際工作中會經常用到,當我們熟悉使用後,應該總結的下一步是,如果在應用操作符解決問題時取得最優解?