<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                如同前面我們已經總結過的標示符、關鍵字、注釋一樣,**運算符和表達式**也是Java的基礎語言要素和一個Java程序的重要組成部分**。** 這是因為任何程序通常都會涉及到對數據的運算,因為所謂的編程工作,實際也就是將現實生活中的一系列復雜問題,抽象出來編寫成為程序,方便更加容易的處理的過程。所以正如同我們在日常生活中也會涉及到一系列類似加減乘除的運算一樣,一個程序也離不開“運算”。 **運算符指明對操作數的運算方式**,就如同數學中用“+”完成對操作數的加法運算一樣,Java也與其類似,不同的是Java中運算的方式要比數學中多。 了解了運算符的基本概念之后,就不得不提及到“表達式”。簡單來說,**表達式可以認為是數據和運算符的結合**。 二者實際可以認為是相輔相成的,因為就如同在數學運算中一樣,如果我們對兩個數進行加法運算,實際我們的目的是想要得到這兩個數相加后的值。 這個時候我們自然就需要一個方式來表達這個值,而這個“表達方式”正是所謂的表達式。 舉個簡單的例子來說,在數學中一個一元方程式求兩個數的和,被描述為:x = 3+5; 在這個一元方程式中,"+"就是執行數學加法運算的運算符,而整個方程“x = 3+5”則是運算的表達式。 這個原理在Java中是一樣的,而x是我們定義的一個int型的變量。 廢話少說,我們已經了解了Java中提供了很多不同功用的運算符。 那么,接下來就讓我們通過這些運算符的功能對其進行分類,從而分別了解它們的功能及使用。 總的來講,Java中的運算符可以被分為如下幾個大類: ![](https://box.kancloud.cn/2016-08-17_57b43160669d1.jpg) 除此之外,還有一個最最常用和特別的運算符“=”,這個運算符被稱為賦值運算符。我們知道了表達式是數據和運算符的結合,所以,賦值運算符就是將它們結合起來的橋梁。 接著,就分別來看一看這些不同的運算符的功能及使用。 **一、算術運算符的使用:**(算術運算符實際是最易理解的,其原理都和數學中算數運算是相同的) ~~~ //算數運算符的應用 private void arithmeticOperatorDemo(int a,int b){ int result = 0; //加法運算符:+。 result = a + b; //減法運算符: -。 result = a - b; //乘法運算符: *。 result = a * b; //除法運算符:/。 result = a / b; //求余運算符:%。 result = a % b; } ~~~ 需要注意的是:使用除法運算符對兩個整數做除法運算時,運算的結果同樣會被提升為整數,也就是說小數點后的數字會被忽略。 例如,我們對兩個整數5和2進行除法運算,得到其運算結果。那么: 表達式:int a = 5/2;的運算結果為2。 表達式:double a = 5/2;的運算結果為2.0。 如果想要得到完整的運算結果2.5,那么被用作除法運算的數也必須使用浮點數的形式:double a = 5.0/2.0。 **二、自增自減運算符的使用:** 首先,顧名思義,自增自減運算,也就是指一個操作數對自身的值進行增加或減少的運算。簡單的來說例如我們有一個整形變量“a”, 那么,實際上自增運算:a++的運算效果就等同于a = a + 1; 這樣的應用實際上是很簡單的,而需要我們注意的是:自增自減運算符有作為“前綴”和“后綴”的兩種不同的使用方式,也就是說可以使用“a++”或者“++a”兩種方式對一個數進行自增自減運算。那么,這兩種方式的區別在于什么?看一段代碼: ~~~ private static void selfArithmeticOperatorDemo() { ??? ?int a = 0; ??? ?int b = 0; ??? ? ??? ?int sum_1 = 5 + (a++); ??? ?int sum_2 = 5 + (++b); ??? ? ??? ?System.out.println("a="+a+",b="+b); ??? ?System.out.println("sum_1="+sum_1+",sum_2="+sum_2); ?} ~~~ 這段代碼運行的打印結果為: a=1,b=1 sum_1=5,sum_2=6 讓我們分析一下上面的代碼: 首先,我們定義了兩個值同樣為0的整形變量“a”與“b”; 之后,我們分別對“a”與“b”進行了自增運算,并讓其結果與同一個數5進行加法運算。 不同的是,變量“a”我們使用“后綴”自增運算方式,變量“b”我們使用“前綴”的方式。 同時,我們定義了另外兩個整型變量sum_1與sum_2分別存放兩次運算的結果。 通過程序的輸出結果我們發現: 1.“a”與“b”經過自增運算之后,值都由初始值0增長為了1。 2.然而變量a執行自增并與5進行加法運算后得到的結果為5,而變量b執行自增并與5進行加法運算后得到的結果為6. 這也正是自增自減運算符作為“前綴”和“后綴”兩種方式使用的不同效果。 我們簡單總結來說,自增自減運算符的使用可以分為兩種情況: - 如果我們僅僅是對一個變量自身進行單純的自增自減運算,使用“前綴”和“后綴”前兩種方式達到的效果實際上是相同的。 - 但是如果在將自增自減運算和表達式結合使用的話,二者就有了一定的不同。通常來說,我們會這樣歸納其不同之處:當自增自減運算符作為前綴結合表達式使用時,會先執行變量的自增自減運算,再執行表達式;而如果作為后綴,則將先執行表達式,然后再進行自增自減運算。 我們當然可以這樣理解“前綴”和“后綴”的不同。但實際上這兩種使用方式在內存中的運算過程究竟是怎么樣的呢? 隨著我們的深入學習,就應當明白:并不是說,自增自減運算符作為前綴,則先執行自增自減運算;而作為后綴,則先執行表達式運算。 例如現有一個值等于1的整形變量num。那么,以表達式int a = num++;和int a = ++num為例,其在內存中的運算過程實際上是: - 當使用“num++”的方式時:在整個運算過程最初,JVM會將num的初始值“1”取到,然后在內存中開辟一塊區域作為“預存區”,并將“1”存儲到該區域內。而緊接著,就會對num進行自增運算得到新的值“2”。所以,在這個時候num在內存中的值實際上已經由“1”變成了“2”。當完成這個運算過程后,JVM則會在“預存區”中將事先存放的num初始值“1”取出,參與整個表達式的運算,將“1”賦值給變量a,所以這時得到的“a”的值為1。 - 而當使用“++num”的方式時,JVM則會直接將num的初始值“1”取到,進行自增運算。然后將自增運算后得到的值“2”,參與到整個表達式運算當中,將該值賦值給變量“a”。所以,通過這種方式,變量“a”的值為2。 **三、關系運算符的使用:** 所謂“關系運算符”,自然是指:用于判斷兩個變量之間的關系的運算符。而在Java中,所有的關系運算符的比較結果,都返回為一個boolean類型的數據。也就是說比較結果非真即假。同樣通過一段簡單的代碼來看一下Java中各個關系運算符的使用: ~~~ private static void relationshipOperatorDemo(int a,int b) { boolean result = false; // == ,比較兩個變量是否相同,相等返回true,不等返回 false result = a == b; // != ,比較兩個變量是否不同 result = a != b; // > ,比較一個變量是否大于另一個變量 result = a > b; // < ,比較一個變量是否小于另一個變量 result = a < b; // >=,比較一個變量是否大于或等于另一個變量 result = a >= b; // <=,比較一個變量是否小于或等于另一個變量 result = a <= b; } ~~~ **四、位運算符的使用:** 在計算機中,所有的整數都是通過二進制進行保存的,也就是一串由“0”和“1”組成的數字,每一個數字占一個比特位,8個比特位就被稱為一個字節。 那么顧名思義,位運算符就是指對一個數進行按比特位的運算。而按位運算最大的好處就在于: 位運算是直接被cpu所支持的,所以其運算速度與效率上就遠遠高于其它運算方式。 Java中提供了以下4種位運算符: - 按位與運算符 &? :如果對應位的值都為1,則運算結果為1,否則則0. - 按位或運算符 |? :如果對應位的值都為0,則運算結果為0,否則為1. - 按位異或運算符 ^:如果對應位的值相同 ,則運算結果為0,否則為1. - 按位取反運算符 ~:將操作數的每一位按位取反,也就是:0變1,1變0. ~~~ private static void bitOperatorDemo(){ System.out.println("5與8進行按位與運算的結果是:"+(5&8)); System.out.println("5與8進行按位或運算的結果是:"+(5|8)); System.out.println("5與8進行按位異或運算的結果是:"+(5^8)); System.out.println("5進行按位取反運算的結果是:"+ (~5)); } ~~~ 這一段測試代碼的輸出結果為: 5與8進行按位與運算的結果是:0 5與8進行按位或運算的結果是:13 5與8進行按位異或運算的結果是:13 5進行按位取反運算的結果是:-6 為了驗證其輸出結果,首先我們將兩個整型數5和8還原為二進制形式,值分別為:0101和1000。接著,就讓我們根據各個位運算符的運算原理進行一次驗證: 1.與運算:0101和1000按照與運算的運算原理,得到的運算結果為:0000,也就是十進制當中的0 附:與運算的特性:兩個數相與,只要有一個數為0,那么結果就為0。 2.或運算:0101和1000按照或運算的運算原理,得到的運算結果為:1101,轉換為十進制的值也就是:13 3.異或運算:0101和1000按照異或運算的運算原理,得到的運算結果為:1101,同樣也就是十進制的13. 附:對于異或運算的應用,值得一提的是,異或運算有一個特性:一個數異或運算同一個數兩次,得到的結果還是這個數。 就以0101和1000為例,0101異或1000運算一次的結果是1101,1101再與1000進行異或運算,得到的結果為0101.也就是說0101^1000^1000 = 5^8^8 =5。 這實際上也是一種最基礎的加密解密的應用方式,例如你的數據為5,與8進行異或后,得到的結果是13,13再與8進行異或運算后,得到的結果為5。 這個過程中,5是原始數據,13是加密后的數據,而8則是密匙。 4.取反運算:這是值得一提的運算方式,0101按位取反得到1010,你可能會想,這不就是十進制當中的10嗎?會什么取反運算后變成了-6呢。 這是因為在Java中的,int型的數據在內存中實際長度32位,也就是說5在Java內存中的完整表現形式為: 0000 0000 - 0000 0000 - 0000 0000 - 0000 0101,所以在取反運算后,其值變為了: 1111 1111 - 1111 1111 - 1111 1111 - 1111 1010。而該二進制數正對應于十進制當中的-6. 值得一提的是,在計算機中: 0000 0000 - 0000 0000 - 0000 0000 - 0000 0101這樣一個數的絕對值轉換為的二進制數,被稱為原碼。 1111 1111 - 1111 1111 - 1111 1111 - 1111 1010這樣一個對原碼進行按位取反運算得到的二進制數,則被稱為反碼。 而對一個數的反碼加1,運算后得到的二進制數則被稱為補碼。 所以,通過位運算符“~”對一個數進行取反運算,實際上正是在獲取這個數的反碼。 到此,我們觀察發現:我們對5進行取反運算后,獲取的反碼對應的正是十進制當中的-6. 如果我們對-6加1,得到的結果正是:-5.而-5則正是5的負數形式。 這也正是為什么說,在計算機中,一個負數的二進制表現形式是由其補碼表示的。 **五、移位運算符的使用:** 與位運算符類似,移位運算符則是指對一個數的二進制表現形式按指定位數進行移位的運算。 Java中提供了三種移位運算符: - 左移運算符“<<”:將操作數的比特位向左移動指定位數,移位后右邊空缺的位用0填補。 - 右移運算符“>>”:將操作數的比特位向右移動指定位數,移動后用于表示符號的最高位按原有的符號位填補,也就是說如果原本符號位為0,則移動后填補0,為1則補1 - 無符號右移運算符">>>":與">>"的移位運算規則相同,不同之處在于:無論原有最高位為1還是0,填補時都補0(也就是說無論正數還是負數,移位后都將變為正數) 那么,假如我們就以“-6”(1111 1111 - 1111 1111 - 1111 1111 - 1111 1010)為例: 如果對其進行左移3位運算得到的結果為:1111 1111 - 1111 1111 - 1111 1111 - 1101 0000,對應于十進制中的-48. 如果對其進行右移3位運算得到的結果為:1111 1111 - 1111 1111 - 1111 1111 - 1111 1111,對應于十進制中的-1 如果對其進行無符號右移3位運算得到的結果為:0001 1111 - 1111 1111 - 1111 1111 - 1111 1111,對應于十進制中的536870911 然后,我們用一段代碼對其加以驗證: ~~~ private static void bitMoveOperatorDemo(){ System.out.println((-6)<<3); System.out.println((-6)>>3); System.out.println((-6)>>>3); } ~~~ 運行發現其輸出結果正是: -48 -1 536870911 而提到移位運算,想起曾經看到過類似這樣的一道面試題:用最有效率的方法算出2乘以8的結果。 其實解題思路很簡單,我們注意到兩個關鍵字:效率和運算。當涉及到操作數的運算,且要求保證最快的效率時,首先應該想到的,就是位運算。 而我們在二進制數中,可以發現這樣一個規律:一個數向左移n位,就相當于乘了2的n次方;同理,向右移n位,則相當于除以2的n次方。 然后,我們再看這道面試題發現,8正好是2的3次方,也就是說,我們將2進行左移運算3位,則等于乘以2的3次方8. 所以這道題的答案就是:int result = 2<<3; 之所以這樣做最有效率,我們已經說過,是因為位運算是直接被cpu支持的,所以不需要做任何額外操作。 **六、邏輯運算符的使用:** 通俗的說,邏輯運算符用于對多個表達式進行條件判斷,與關系運算符相同,其返回結果也為boolean。我們分別來看一下其判斷規則: &:非短路邏輯與運算符,當判斷的兩個條件都為真時,則判斷結果為真;否則只要有一個條件為假,則返回假。 |:非短路邏輯或運算符,用于判斷的條件中只要有一個為真,則為真;當判斷條件結果全為假,則返回假。 !:對條件判斷結果取反,例如:boolean b = !(5>2) 的返回結果為false。 &&:短路與運算符,與&的判斷規則大致相同,不同的是:&&只要判斷到有一個條件的判斷結果為假,則會立即“短路”,即刻返回判斷結果為假。而&無論結果,都會一次將所有條件判斷完后,才會返回最終的判斷結果。 ||:短路或運算符,與|的判斷規則大致相同,不同的是仍是:||只要判斷到有任一一個條件為真,則會立即“短路”,返回判斷結果為真。 我們仍然通過一個簡單的例子來看一下非短路邏輯運算符合短路運算符之間的區別: ~~~ private static void logicOperatorDemo() { int a = 5; int b = 5; if ((++a) > 5 | (++b) > 5) { System.out.println("非短路邏輯或運算:"); } System.out.println("a:" + a); System.out.println("b:" + b); a = 5; b = 5; if ((++a) > 5 || (++b) > 5) { System.out.println("短路邏輯或運算"); } System.out.println("a:" + a); System.out.println("b:" + b); } ~~~ 這段程序的輸出結果為: 非短路邏輯或運算: a:6 b:6 短路邏輯或運算 a:6 b:5 這正是體現了非短路邏輯運算符與短路邏輯運算符的區別: 當我們使用非短路邏輯或運算的時候:會依次將判斷條件執行完畢后,再返回判斷結果,所以(++a) > 5 | (++b) > 5會執行完6>5|6>5,返回結果true。執行后a與b的值都為6。 而當我們使用短路邏輯或運算的時候:只要判斷到有任何一個條件結果為true,則會馬上返回true,所以(++a) > 5 | (++b) > 5執行到(++a)=6 > 5后,就已經返回了判斷結果為true。所以后面的(++b) > 5根本沒有執行,自然最后得到的結果就是a=6,而b=5了。 ** ** **七、三元運算符的使用**: 簡單的來說,三元運算符就是對類似于下面的一種代碼的一種簡化書寫方式: ~~~ ?? private static void demo(int a){ ??? ?int num = 0; ??? ?if(a>0){ ??? ??? ?num =1; ??? ?}else{ ??? ??? ?num =2; ??? ?} ?} ~~~ 通過三元運算符,我們可以將其簡化為: ~~~ private static void demo(int a) { int num = a > 0 ? 1 : 2; } ~~~ 到這里,對于Java當中各個運算符的使用的總結就告一段落了,更多的使用方法可以自己在實際操作中加以體會、鞏固和深入。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看