+,-,*,/,%,++,--
1.+,-,*,/
整數除以整數的結果為舍棄了小數部分的整數。
2.%:取余
- %左右都為正數,左邊小于右邊結果為左邊值,如,4%5=4
- %左邊大于或等于右邊結果為左邊除以右邊的余數,如,5%5=0,7%2=1
- 面試題:100%3.0的結果為1.0
應該注意的是:當運算負數的取余運算時,結果的符號和被取余數一致。
如:
System.out.PRintln(-5%2);System.out.println(-5%-2);System.out.println(5%-2);結果為:-1,-1,1
+還可以作為連接符,用于把一個字符串類型值和一個其他基本數據類型連接,結果為字符串數據。
如,2+”3”,結果為”23“的字符串;”5+5=“+5+5,結果為 ”5+5=55“。
3.++自增
在原有數據基礎上加1,在賦值給原有數據。
看下面幾個程序:
1.
int a = 3;a++;System.out.println("a="+a);2.
int a = 3;++a;System.out.println("a="+a);3.
int a = 3 , b;b = a++;System.out.println("a="+a+",b="+b);4.
int a = 3 , b;b = ++a;System.out.println("a="+a+",b="+b);結果:1,2運行結果相同。都是,a=4
3的結果為a=4,b=3,4的結果為a=4,b=4
分析:1,2是a的獨立運算,先增后增結果都一樣。3是a和b的運算,先把a的原值賦給b后,a自增。4也是a和b的運算,a自增后,再把a的值(自增后的值)賦給b。
但是在內存中,都是先運算完右邊,再賦值給左邊的變量。
b = a++;:先把a的原值取出來存在一塊臨時空間里,在運算a++即a=a+1,運算完成后,把臨時空間里的值賦給b;
b = ++a;:先運算右邊,把結果賦值給b。
測試:考慮如下代碼的運行結果。
int i = 3;i = i++;System.out.println("i="+i);
結果:i=3
原因分析:在內存中,先把i的原值取出來放在一個temp臨時變量里面,再把i的原值拿到運算區進行運算(i++),把結果(4)賦值給右邊的i,最后把臨時變量temp里的3再賦值給左邊的i。
用代碼表示:
int temp = i;i = i + 1;i = temp;
賦值運算符
賦值運算符:=,+=,-=,*=,/=,%=等
面試題:以下程序的區別
1.
short s = 3;s+=4;Sytem.out.println("s="+s);2.
short s = 3;s = s + 4;Sytem.out.println("s="+s);答案:第一個編譯運行正確,第二個報錯。
原因:java在編譯 short s = 3;時,由于3是int型數據,不能直接賦值給short型數據,可能會丟失精度。java底層會自動判斷3在short型數據所表示的范圍內,如果在,就強制類型轉換,不在則報錯(可能丟失精度)。
在編譯 s = s+4 時,由于右邊s的值不確定,給它加上4可能會丟失精度。所以第二個程序會報可能丟失精度的錯誤。
在編譯 s+=4 時,同 short s = 3;都為賦值運算。
比較運算符:>,<,>=,<=,==,!=,instanceof
比較運算后的結果:true或false。
邏輯運算符:!,&,&&(短路與),|,||(短路或),^(異或)
邏輯運算符作用:連接兩個布爾類型的表達式
位運算符是直接對二進制進行運算。
位運算能提高效率:
練習:
1.計算2*8
直接使用2*8計算的話,內存中要進行多次的乘法或加法,而使用2<<3,只需要移位即可。
2.互換兩個整數的值
int a = 3 , b = 5;//使用第三方變量int temp;temp = a;a = b;b = temp;system.out.println("a="+a+",b="+b);
int a = 3 , b = 5;//不用第三方變量a = a + b; //a = 3+5=8b = a - b; //b = 8-5=3a = a - b; //a = 8-3 = 5system.out.println("a="+a+",b="+b);
int a = 3 , b = 5;//使用移位運算,提高效率//利用異或的性質:一個數異或兩次同一個數,結果還為這個數a = a^b; //a = 3^5 b = a^b; //b = (3^5)^5 = 3a = a^b; //a = (3^5)^3 = 5system.out.println("a="+a+",b="+b);
格式:(條件表達式)?表達式1:表達式2;
如果條件表達式的結果為true,運算后的結果為表達式1,否則為表達式2。
舉例:獲取兩個數中的較大值。
z = (x>y)?x:y; /運算后z的值就是x,y中較大的一個。
從上到下依次運行。
if語句:
if(條件表達式){
執行語句;
}
if(條件表達式){
執行語句;
}else{
執行語句;
}
if(條件表達式1){
執行語句;
}else if(條件表達式2){
執行語句;
}
…
else{
執行語句;
}
switch語句:
格式:
switch(表達式){
case 取值1:
執行語句;
break;
case 取值2:
執行語句;
break;
…
default:
break;
}
注意:1.default可以寫在第一個判斷,但是程序會從第一個case開始執行,判斷完所有case,才執行default。
2.右花括號前面的一個“break”可以省略。
3.多個case下的執行語句一致,應該這樣:
case 1:case 2:... //執行語句 break;switch中的表達式只能為byte,short,int,char。
java1.5加入了枚舉
java7加入了字符串
if和switch的區別:
if:
- 對具體的值進行判斷
- 對區間判斷
- 對運算結果是boolean的表達式進行判斷
switch:
- 對具體的值進行判斷
- 值得個數通常是固定的
對于幾個固定值得判斷,建議使用switch語句,因為switch語句會將具體的答案都加載進內存,效率較高。
常用的還是if語句,相比switch書寫簡單,功能較強。
循環的使用場景:
- 當對某些代碼執行很多次時,使用循環結構完成。
- 當對一個條件進行一次判斷時,可以使用if語句,當對一個條件進行多次判斷時,可以使用while語句。
注意:
- 在使用循環時,一定要明確,哪些語句需要參與循環,哪些不需要。
- 通常情況下,需要定義條件,需要控制次數。
循環結構由三種方式:
1.while
格式:
while(條件表達式){
執行的循環語句;
}
2. do while
do{
執行的循環語句;
}
while(條件表達式) ;
注意:while后有分號
do while無論條件是否滿足,要執行的循環語句都會執行一遍。
3. for循環
for(初始化表達式;循環條件表達式;循環后的操作表達式){
執行的循環語句(循環體);
}
先執行初始化表達式,并且知道循環結束,只讀一次,然后判斷循環條件,為真就執行一次循環體,然后再執行循環后的操作表達式,接著繼續判斷循環條件,重復整個過程,直到條件不滿足為止。
- for和while的特點:
- for和while可以互換
- 格式上的不同,在使用上有些區別:
如果需要通過變量來對循環進行控制,該變量只作為循環增量存在時,區別就體現出來了。
這個變量的作用域不同,一般while循環的控制變量在while循環外,而for循環一般定義在for循環內,for循環外面訪問不了;如果不在循環外使用這個變量使用for循環可以做到優化內存,因為for循環完后,這個控制變量就被銷毀。
面試題:求下面程序的執行結果.
int x = 1;for(System.out.println("a"); x<3; System.out.println("b")){ System.out.println("c"); x++;}答案::a c b c b
while練習:
累加器思想:
//計算1~10的和int x = 1;int sum = 0;while(x<11){ sum += x; x++; }
計數器思想:
//求1~100中能被6整數的數的個數int x = 1;int k = 0;while(x<101){ if(x%6==0){ k++; } x++; }System.out.println(k);無限循環最簡單的形式:
while(true){}
for(; ; ){}
for循環的嵌套:
一種重復情況下的每一次重復都對應另外一種情況的重復,就使用for循環的嵌套。
范例:
/*****************/for (int i = 0; i<5; i++) { for (int y = 0; y<5-i; y++) { System.out.print("*"); } System.out.println();}
/*543214321321211*/for (int i = 0; i<5; i++) { for (int j = 5-i; j>0; j--) { System.out.print(j); } System.out.println();}
//九九乘法表for (int i = 1; i<10; i++) { for (int j=1 ; j<=i; j++) { System.out.print(j+"*"+i+"="+j*i+"/t"); } System.out.println();}
/** * * * * * * * * * * * * * **/for (int i = 0; i<5; i++) { for (int j = 0; j<i; j++) { System.out.print(" "); } for (int j = 0; j<5-i;j++ ) { System.out.print("* "); } System.out.println();}
新聞熱點
疑難解答