我們從零開始學(xué)習(xí)大數(shù)據(jù)技術(shù),從java基礎(chǔ),到Linux技術(shù)涉獵,再深入到大數(shù)據(jù)技術(shù)的Hadoop、Spark、Storm技術(shù),最后到大數(shù)據(jù)企業(yè)平臺的搭建,層層遞進(jìn),由點到面!希望技術(shù)大牛能過來指導(dǎo)學(xué)習(xí)。
創(chuàng)新互聯(lián)致力于成都網(wǎng)站制作、做網(wǎng)站,成都網(wǎng)站設(shè)計,集團網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇創(chuàng)新互聯(lián),就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!上一節(jié)了解Java基礎(chǔ)語法,本節(jié)我們開始學(xué)習(xí)Java基礎(chǔ)-運算符,將會圍繞以下幾個知識點進(jìn)行展開學(xué)習(xí):
算術(shù)運算符
賦值運算符
比較運算符
邏輯運算符
位運算符
三元運算符
PS:開始之前我們先針對上節(jié)數(shù)據(jù)類型中補充的幾個小問題
一、數(shù)據(jù)類型中補充的幾個小問題
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即是符號位,也是數(shù)值位)
2、數(shù)據(jù)類型轉(zhuǎn)化之默認(rèn)轉(zhuǎn)換(遵循從小到大轉(zhuǎn)換)
byte,short,char ---int ---long---float---double
long:8個字節(jié)
float:4個字節(jié)
雖然是默認(rèn)轉(zhuǎn)換,但因為以下原因,long默認(rèn)轉(zhuǎn)換為float
a、它們底層的存儲結(jié)構(gòu)是不同的。
b、float表示的數(shù)據(jù)范圍比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語言中的字符占用兩個字節(jié)。
Java語言采用的是Unicode編碼,所有的字符都是依照Unicode進(jìn)行編碼的
二、運算符
運算符總覽表
在我們數(shù)學(xué)中也會經(jīng)常用到運算(加減乘除等),那在Java程序中也是經(jīng)常要做一些運算操作都有哪些呢,那么先看一下以下針對運算和運算符的定義:
運算:是對常量和變量進(jìn)行操作的過程成為運算
運算符:是對常量和變量進(jìn)行操作的符號稱為運算符
分類(6種):算術(shù)運算符,賦值運算符,比較運算符,邏輯運算符,位運算符,三目運算符
那么,我們現(xiàn)在對各類運算符逐一的進(jìn)行了解
符號:
+,-,*,/,%,++,--
注意事項:
a、整數(shù)相除只能得到整數(shù),如果想得到小數(shù),必須把數(shù)據(jù)變換為浮點數(shù)類型
b、/ 獲取的是除法操作的商,% 獲取的是除法操作的余數(shù)
下面我們先編寫程序代碼執(zhí)行看下效果
程序執(zhí)行結(jié)果:
(1)++,--運算符的使用
A:單獨使用:
放在操作數(shù)的前面和后面效果一樣,(這種情況是比較常見的)
B:參與運算使用:
放在操作數(shù)的前面,先自增1或者自減1,然后再參與運算。
放在操作數(shù)的后面,先參與運算,再自增1或者自減1。
C:作用:就是對變量進(jìn)行自增或者自減。
程序舉例:
放后面,程序打印出來的結(jié)果:
放前面,程序打印出來的結(jié)果
可見,我們前面總結(jié)的是對的。
放在操作數(shù)的前面,先自增1或者自減1,然后再參與運算。
放在操作數(shù)的后面,先參與運算,再自增1或者自減1。
接下來,我們進(jìn)一步看一下+的用法(主要有三種):
A:加法
B:正號
C:字符串的連接符
程序舉例:
程序執(zhí)行結(jié)果:
可見:
* 運算規(guī)則是從左到右做運算的,"hello"+'a'+1 ,系統(tǒng)會先識別到hello是一個字符串,則后面的加號就是作為字符串連接符使用,與字符a連接后,形成一個新的字符串,再拼接1。
* 同樣的,在'a'+1+"hello"則是先運算'a'+1(這里的加號是作加法使用),再連接字符串hello.
符號:
=,+=,-=,*=,/=,%=等
可以劃分為以下兩種:
基本的賦值運算符:=
把右邊的數(shù)據(jù)賦值給左邊。
擴展的賦值運算符:+=,-=,*=,/=,%=
+=把左邊和右邊做加法,然后賦值給左邊
同理,-=,*=,/=,%=的用法參照上述說明
程序舉例:
程序執(zhí)行結(jié)果:
思考題:
接下來,來思考兩個問題,
short s=1,s=s+1;
short s=1,s+=1;
判斷上面兩個代碼有沒有問題,如果有,哪里有問題?
編寫程序代碼驗證下:
第一種:
程序執(zhí)行結(jié)果:
注意:還記得,前面我們學(xué)的 short類型做運算的時候,默認(rèn)是先轉(zhuǎn)換成int類型,int類型占用4個字節(jié)數(shù),short類型占用2個字節(jié)數(shù),遵從從小到大的轉(zhuǎn)換原則,所以本程序中s=s+1做運算會損失進(jìn)度。
第二種:
程序執(zhí)行結(jié)果:
可見,擴展的賦值運算符其實隱含了一個強制類型轉(zhuǎn)換。
s +=1;并不等價于s = s + 1;而是等價于s = (s的數(shù)據(jù)類型)(s+1);
所以通過s +=1;的執(zhí)行結(jié)果是沒有報錯。
符號:
== 表示等于
!= 表示不等于
> 表示大于號
>= 表示大于等于
< 表示小于
<= 表示小于等于
特點:
無論你的操作是簡單還是復(fù)雜的,結(jié)果都是Boolean類型的 (false和true)
注意事項:
"=="不能寫成"=";否則會變成賦值運算。
程序舉例:
程序執(zhí)行結(jié)果:
可見,比較運算符對應(yīng)的結(jié)果是Boolean類型的
符號:
&,|,^,!
基本用法:
& 與運算,(注意,但&兩邊為布爾值為邏輯與運算,當(dāng)&兩邊為數(shù)字為位運算符)
| 或運算
^ 異或運算
! 非運算
特殊用法:
&& 雙與運算
|| 雙或運算
特點:
邏輯運算符一般用于連接boolean類型的表達(dá)式或者值。
表達(dá)式:
就是用運算符把常量或者變量連接起來的符合java語法的式子
算術(shù)表達(dá)式:a + b
比較表達(dá)式:a == b
結(jié)論:
(1)& 邏輯與:有false則false
(2)| 邏輯或:有true則true
(3) ^ 邏輯異或:相同為false,不同為true
^異或舉例:
情侶關(guān)系: 男男,男女,女男,女女,
可見:正常的情侶關(guān)系中,異性是之間才是true的
特別聲明:這里絕對沒有歧視同性之間的關(guān)系,純屬為了學(xué)習(xí)交流的^-^
(4) !邏輯非:非false則true,非true則false
特點:偶數(shù)個!不改變本身的運算結(jié)果
編寫以下程序?qū)ι鲜鰩追N邏輯運算進(jìn)行驗證:
程序舉例:
程序執(zhí)行結(jié)果:
可見,我們的結(jié)論是正確的,邏輯運算符的基本用法也都講完了,下面我們看看特殊用法。
程序舉例(雙與&& 用法):
程序執(zhí)行結(jié)果:
可見,&&與&的區(qū)別?||與|的區(qū)別?
兩種運算符的運算結(jié)果是一樣的
&&具有短路效果,如果左邊是false,則右邊不執(zhí)行
||與|就不再多做代碼演示,可以自行嘗試驗證:
兩種運算符的運算結(jié)果是一樣的
||具有短路效果,如果左邊是true,則右邊就不執(zhí)行,結(jié)果就為true
注意:開發(fā)中常用的邏輯運算符:
&&
||
!
符號:
& 與位運算
| 或位運算
^ 異或運算
~ 翻轉(zhuǎn)運算
<< 左移運算
>> 右移運算
>>>無符號右移運算
注意:
要做位運算,首先要把數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制
案例:
通過下述案例,了解下位運算符的特點:
我們先分析下幾條位運算符打印出來的結(jié)果:
分析: 因為是位運算,所以我們必須要把數(shù)據(jù)換算成二進(jìn)制
3的二進(jìn)制: 11
00000000 00000000 00000000 00000011
4的二進(jìn)制:100
00000000 00000000 00000000 00000100
&位與運算:有0則0
00000000 00000000 00000000 00000011
& 00000000 00000000 00000000 00000100?
---------------------------------------------
00000000 00000000 00000000 00000000
結(jié)果是:0
|位或運算:有1則1
00000000 00000000 00000000 00000011
| 00000000 00000000 00000000 00000100
-------------------------------------------------
00000000 00000000 00000000 00000111
結(jié)果是:7?
^位異或運算:相同則0,不同則1
00000000 00000000 00000000 00000011
^ 00000000 00000000 00000000 00000100
---------------------------------------------
00000000 00000000 00000000 00000111
結(jié)果是:7?
~按位取反運算:0變1,1變0
00000000 00000000 00000000 00000011
----------------------------------------------
~ 11111111 11111111 11111111 11111100 (補碼)?
因為該值得出來是原數(shù)值的補碼,所以我們要進(jìn)一步的求出它的原碼才是我們最終要的值。如果不知道怎么運算,可以參照上一節(jié)的Java基礎(chǔ)語法
補碼:11111111 11111111 11111100
反碼:11111111 11111111 11111011
原碼:10000000 0000000 00000100
結(jié)果是:-4?
通過分析執(zhí)行程序代碼,可見我們的分析是正確的:
*另外,針對^還有以下特點:
一個數(shù)據(jù)對另一個數(shù)據(jù)位異或兩次,該數(shù)據(jù)本身不變。
程序舉例:
執(zhí)行結(jié)果如下:
可見,^異或運算可以用于兩個數(shù)值對調(diào)的運算,建議自行編寫如下代碼做驗證:
a = a ^ b;
b = a ^ b;
a = a ^ b;
這個留給大家自己動手操作。
接下來,我們進(jìn)一步看一下以下幾種運算:
<<:左移,左邊最高位丟棄,右邊補齊0
>>:右移,正數(shù)最高位是0,左邊補齊0;負(fù)數(shù)最高位是1,左邊補齊1
>>>:無符號右移,無論最高位是0還是1,左邊補齊0
舉例:
在執(zhí)行運算之前,我們先做以下分析:
<<的移動:
首先,我們需要先計算出3的二進(jìn)制:11
00000000 00000000 00000000 00000011
(00)00000000 00000000 00000000 00001100
--------------------------------------------------------
左移2位,結(jié)果為:12?
可見,<<是把<<左邊的數(shù)據(jù)*2的移動次冪,即3*2^2=12
同理,>>是把>>左邊的數(shù)據(jù)除以2的移動次冪,即24/2^2 = 24/4 = 6
>>的移動:
計算出24的二進(jìn)制:11000
原碼:10000000 00000000 00000000 00011000
反碼:11111111 11111111 11111111 11100111
補碼:11111111 11111111 11111111 11101000
1111111111 11111111 11111111 111010(00)
右移2位,最高位補1,生成新的補碼?
然后再通過以下方式求出原碼,就是我們需要的結(jié)果。
補碼:1111111111 11111111 11111111 111010
反碼:1111111111 11111111 11111111 111001
原碼:1000000000 00000000 00000000 000110
-----------------------------------------------------
結(jié)果是:-6?
>>>的移動:
計算出24的二進(jìn)制: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,所以為正數(shù),即它的原碼、反碼和補碼的值都相同。
所以11111111 11111111 11111111 111010對應(yīng)的十進(jìn)制結(jié)果是:1073741818
程序的執(zhí)行結(jié)果為:
可見,我們最終可以總結(jié)如下幾點:
<<是把<<左邊的數(shù)據(jù)*2的移動次冪
>>是把>>左邊的數(shù)據(jù)除以2的移動次冪
>>:有符號右移。正數(shù)右移高位補0,負(fù)數(shù)右移高位補1
>>>:無符號右移。無論是正數(shù)還是負(fù)數(shù),高位通通補0。
對于正數(shù)而言,>>和>>>沒區(qū)別。
最后,還有一個三元運算符沒講,我們將放到下一節(jié)做專題說明。
往期文章:
從0開始學(xué)大數(shù)據(jù)-Java基礎(chǔ)開篇(1)
從0開始學(xué)大數(shù)據(jù)-Java基礎(chǔ)語法(2)
本人能力有限,如有不足,還望指正
感謝大家一如既往的支持
希望一起分享給更多的人
讓大家一起學(xué)習(xí)大數(shù)據(jù)技術(shù)
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。