您好,登錄后才能下訂單哦!
我們從零開始學習大數據技術,從java基礎,到Linux技術涉獵,再深入到大數據技術的Hadoop、Spark、Storm技術,最后到大數據企業平臺的搭建,層層遞進,由點到面!希望技術大牛能過來指導學習。
上一節了解Java基礎語法,本節我們開始學習Java基礎-運算符,將會圍繞以下幾個知識點進行展開學習:
算術運算符
賦值運算符
比較運算符
邏輯運算符
位運算符
三元運算符
PS:開始之前我們先針對上節數據類型中補充的幾個小問題
一、數據類型中補充的幾個小問題
1、byte值的問題
byte b1=127;
byte b2=(byte)128; //-128
byte b3=(byte)129//-127
byte b3=(byte)130; //-126
byte的范圍:-128 ~ 127
128: 10000000
-128:10000000(這里的1即是符號位,也是數值位)
2、數據類型轉化之默認轉換(遵循從小到大轉換)
byte,short,char ---int ---long---float---double
long:8個字節
float:4個字節
雖然是默認轉換,但因為以下原因,long默認轉換為float
a、它們底層的存儲結構是不同的。
b、float表示的數據范圍比long的范圍大
long: 2^63-1
float: 3.4*10^38 > 2*10^38 >2*8^38 = 2*2^3^38 = 2*2^114 > 2^63-1
3、Java語言中的字符char可以存儲一個中文漢字嗎,為什么呢?
可以,因為Java語言中的字符占用兩個字節。
Java語言采用的是Unicode編碼,所有的字符都是依照Unicode進行編碼的
二、運算符
運算符總覽表
在我們數學中也會經常用到運算(加減乘除等),那在Java程序中也是經常要做一些運算操作都有哪些呢,那么先看一下以下針對運算和運算符的定義:
運算:是對常量和變量進行操作的過程成為運算
運算符:是對常量和變量進行操作的符號稱為運算符
分類(6種):算術運算符,賦值運算符,比較運算符,邏輯運算符,位運算符,三目運算符
那么,我們現在對各類運算符逐一的進行了解
符號:
+,-,*,/,%,++,--
注意事項:
a、整數相除只能得到整數,如果想得到小數,必須把數據變換為浮點數類型
b、/ 獲取的是除法操作的商,% 獲取的是除法操作的余數
下面我們先編寫程序代碼執行看下效果
程序執行結果:
(1)++,--運算符的使用
A:單獨使用:
放在操作數的前面和后面效果一樣,(這種情況是比較常見的)
B:參與運算使用:
放在操作數的前面,先自增1或者自減1,然后再參與運算。
放在操作數的后面,先參與運算,再自增1或者自減1。
C:作用:就是對變量進行自增或者自減。
程序舉例:
放后面,程序打印出來的結果:
放前面,程序打印出來的結果
可見,我們前面總結的是對的。
放在操作數的前面,先自增1或者自減1,然后再參與運算。
放在操作數的后面,先參與運算,再自增1或者自減1。
接下來,我們進一步看一下+的用法(主要有三種):
A:加法
B:正號
C:字符串的連接符
程序舉例:
程序執行結果:
可見:
* 運算規則是從左到右做運算的,"hello"+'a'+1 ,系統會先識別到hello是一個字符串,則后面的加號就是作為字符串連接符使用,與字符a連接后,形成一個新的字符串,再拼接1。
* 同樣的,在'a'+1+"hello"則是先運算'a'+1(這里的加號是作加法使用),再連接字符串hello.
符號:
=,+=,-=,*=,/=,%=等
可以劃分為以下兩種:
基本的賦值運算符:=
把右邊的數據賦值給左邊。
擴展的賦值運算符:+=,-=,*=,/=,%=
+=把左邊和右邊做加法,然后賦值給左邊
同理,-=,*=,/=,%=的用法參照上述說明
程序舉例:
程序執行結果:
思考題:
接下來,來思考兩個問題,
short s=1,s=s+1;
short s=1,s+=1;
判斷上面兩個代碼有沒有問題,如果有,哪里有問題?
編寫程序代碼驗證下:
第一種:
程序執行結果:
注意:還記得,前面我們學的 short類型做運算的時候,默認是先轉換成int類型,int類型占用4個字節數,short類型占用2個字節數,遵從從小到大的轉換原則,所以本程序中s=s+1做運算會損失進度。
第二種:
程序執行結果:
可見,擴展的賦值運算符其實隱含了一個強制類型轉換。
s +=1;并不等價于s = s + 1;而是等價于s = (s的數據類型)(s+1);
所以通過s +=1;的執行結果是沒有報錯。
符號:
== 表示等于
!= 表示不等于
> 表示大于號
>= 表示大于等于
< 表示小于
<= 表示小于等于
特點:
無論你的操作是簡單還是復雜的,結果都是Boolean類型的 (false和true)
注意事項:
"=="不能寫成"=";否則會變成賦值運算。
程序舉例:
程序執行結果:
可見,比較運算符對應的結果是Boolean類型的
符號:
&,|,^,!
基本用法:
& 與運算,(注意,但&兩邊為布爾值為邏輯與運算,當&兩邊為數字為位運算符)
| 或運算
^ 異或運算
! 非運算
特殊用法:
&& 雙與運算
|| 雙或運算
特點:
邏輯運算符一般用于連接boolean類型的表達式或者值。
表達式:
就是用運算符把常量或者變量連接起來的符合java語法的式子
算術表達式:a + b
比較表達式:a == b
結論:
(1)& 邏輯與:有false則false
(2)| 邏輯或:有true則true
(3) ^ 邏輯異或:相同為false,不同為true
^異或舉例:
情侶關系: 男男,男女,女男,女女,
可見: 正常的情侶關系中,異性是之間才是true的
特別聲明:這里絕對沒有歧視同性之間的關系,純屬為了學習交流的^-^
(4) !邏輯非:非false則true,非true則false
特點:偶數個!不改變本身的運算結果
編寫以下程序對上述幾種邏輯運算進行驗證:
程序舉例:
程序執行結果:
可見,我們的結論是正確的,邏輯運算符的基本用法也都講完了,下面我們看看特殊用法。
程序舉例(雙與&& 用法):
程序執行結果:
可見,&&與&的區別?||與|的區別?
兩種運算符的運算結果是一樣的
&&具有短路效果,如果左邊是false,則右邊不執行
||與|就不再多做代碼演示,可以自行嘗試驗證:
兩種運算符的運算結果是一樣的
||具有短路效果,如果左邊是true,則右邊就不執行,結果就為true
注意:開發中常用的邏輯運算符:
&&
||
!
符號:
& 與位運算
| 或位運算
^ 異或運算
~ 翻轉運算
<< 左移運算
>> 右移運算
>>>無符號右移運算
注意:
要做位運算,首先要把數據轉換為二進制
案例:
通過下述案例,了解下位運算符的特點:
我們先分析下幾條位運算符打印出來的結果:
分析: 因為是位運算,所以我們必須要把數據換算成二進制
3的二進制: 11
00000000 00000000 00000000 00000011
4的二進制:100
00000000 00000000 00000000 00000100
&位與運算:有0則0
00000000 00000000 00000000 00000011
& 00000000 00000000 00000000 00000100?
---------------------------------------------
00000000 00000000 00000000 00000000
結果是:0
|位或運算:有1則1
00000000 00000000 00000000 00000011
| 00000000 00000000 00000000 00000100
-------------------------------------------------
00000000 00000000 00000000 00000111
結果是:7?
^位異或運算:相同則0,不同則1
00000000 00000000 00000000 00000011
^ 00000000 00000000 00000000 00000100
---------------------------------------------
00000000 00000000 00000000 00000111
結果是:7?
~按位取反運算:0變1,1變0
00000000 00000000 00000000 00000011
----------------------------------------------
~ 11111111 11111111 11111111 11111100 (補碼)?
因為該值得出來是原數值的補碼,所以我們要進一步的求出它的原碼才是我們最終要的值。如果不知道怎么運算,可以參照上一節的Java基礎語法
補碼:11111111 11111111 11111100
反碼:11111111 11111111 11111011
原碼:10000000 0000000 00000100
結果是:-4?
通過分析執行程序代碼,可見我們的分析是正確的:
*另外,針對^還有以下特點:
一個數據對另一個數據位異或兩次,該數據本身不變。
程序舉例:
執行結果如下:
可見,^異或運算可以用于兩個數值對調的運算,建議自行編寫如下代碼做驗證:
a = a ^ b;
b = a ^ b;
a = a ^ b;
這個留給大家自己動手操作。
接下來,我們進一步看一下以下幾種運算:
<<:左移,左邊最高位丟棄,右邊補齊0
>>: 右移,正數最高位是0,左邊補齊0;負數最高位是1,左邊補齊1
>>>: 無符號右移,無論最高位是0還是1,左邊補齊0
舉例:
在執行運算之前,我們先做以下分析:
<<的移動:
首先,我們需要先計算出3的二進制:11
00000000 00000000 00000000 00000011
(00)00000000 00000000 00000000 00001100
--------------------------------------------------------
左移2位,結果為:12?
可見,<<是把<<左邊的數據*2的移動次冪,即3*2^2=12
同理,>>是把>>左邊的數據除以2的移動次冪,即24/2^2 = 24/4 = 6
>>的移動:
計算出24的二進制:11000
原碼:10000000 00000000 00000000 00011000
反碼:11111111 11111111 11111111 11100111
補碼:11111111 11111111 11111111 11101000
1111111111 11111111 11111111 111010(00)
右移2位,最高位補1,生成新的補碼?
然后再通過以下方式求出原碼,就是我們需要的結果。
補碼:1111111111 11111111 11111111 111010
反碼:1111111111 11111111 11111111 111001
原碼:1000000000 00000000 00000000 000110
-----------------------------------------------------
結果是:-6?
>>>的移動:
計算出24的二進制:11000
原碼:10000000 00000000 00000000 00011000
反碼:11111111 11111111 11111111 11100111
補碼:11111111 11111111 11111111 11101000
0011111111 11111111 11111111 111010(00)
右移2位,最高位補0,生成新的補碼?
新的補碼:0011111111 11111111 11111111 111010
因為新生成的補碼最高位為0,所以為正數,即它的原碼、反碼和補碼的值都相同。
所以11111111 11111111 11111111 111010對應的十進制結果是:1073741818
程序的執行結果為:
可見,我們最終可以總結如下幾點:
<<是把<<左邊的數據*2的移動次冪
>>是把>>左邊的數據除以2的移動次冪
>>:有符號右移。正數右移高位補0,負數右移高位補1
>>>:無符號右移。無論是正數還是負數,高位通通補0。
對于正數而言,>>和>>>沒區別。
最后,還有一個三元運算符沒講,我們將放到下一節做專題說明。
往期文章:
從0開始學大數據-Java基礎開篇(1)
從0開始學大數據-Java基礎語法(2)
本人能力有限,如有不足,還望指正
感謝大家一如既往的支持
希望一起分享給更多的人
讓大家一起學習大數據技術
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。