1、算數運算符
1.1 問題
1 什麼叫做運算符
2 什麼叫做表達式
3 算術運算符有哪些
1.2 答案
1.2.1 運算符的概念
對常量或者變量進行操作的符号
1.2.2 表達式
用運算符把常量或者變量連接配接起來符合java文法的式子就可以稱為表達式。
不同運算符連接配接的表達式展現的是不同類型的表達式。
舉例說明:
int a = 10;
int b = 20;
int c = a + b;
+:是運算符,并且是算術運算符。
a + b:是表達式,由于+是算術運算符,是以這個表達式叫算術表達式。
1.2.3 算術運算符的分類
注意:
- /和%的差別:兩個資料做除法,/取結果的商,%取結果的餘數。
- 整數操作隻能得到整數,要想得到小數,必須有浮點數參與運算。
public class Demo1Operator {
public static voidmain(String[] args) {
System.out.println(5 / 2);
System.out.println(5 / 2.0);
System.out.println(5.0 / 2);
System.out.println(5.0 /2.0);
System.out.println("---------------------");
System.out.println(5 % 2);
System.out.println(4 % 2);
}
}
2、字元的+操作
2.1 問題
1 字元的+操作運算過程
2 什麼是ASCII碼表
3 為什麼要有這樣的碼表
2.2 答案
2.2.1 字元的+操作運算過程
當(byte short char int)在一起運算的時候,都會提升為int之後,再進行運算;char提升為int的過程,就是查找碼表中,字元所對應的數值表示形式
2.2.2 ASCII碼表
ASCII (American Standard Code for Information Interchange):美國資訊交換标準代碼,是計算機中位元組到字元的一套對應關系。通俗講就是每個字元都有一個對應的數字
常見的char類型資料代表的int值
'a'----97 'A'----65 '0'----48
舉例:
int a = 'A' + 1;
//1.根據'A'查找碼表找到對應的數值 65
//2.需要提升為int類型
//3.進行算數運算 得到結果66 int類型
//4.将結果指派給變量a
舉例: 大寫轉小寫
char c='A';
char c1=(char)(c+32);
2.2.3 為什麼要有這樣的碼表
計算機中資料的存儲,都是以位元組的形式在進行存儲,我們不會直接操作繁瑣的、不便于記憶的位元組
2.3 補充
進制相關
在計算機内部所有的資料都使用二進制表示,每一個二進制位(bit)有0和1兩種
是以8個二進制位就可以組合出256種狀态,,這被稱為一個位元組(byte)
一個位元組一共可以用來表示256種不同的狀态。每一種狀态都有一個符号,就是256個符号。
從00000000到11111111
ASCII碼:上世紀60年代美國制定了一套字元編碼。對英語字元與二進制位之間的關系,做了統一的規定。這被稱為ASCII碼, ASCII碼一共規定了128個字元的編碼,比如空"space"是32 (二進制是00100000) 大寫字母A是65(二進制01000001).這128個符号。包括32個不能列印出來的控制符号。隻占用一個位元組後面的7位。
最前面的一位統一規定為0。
缺點:
1 不能表示所有字元
2 相同的編碼表示的字元不一樣, 假設120在法語編碼表中代表(你) 可能在希伯語編碼中代表另一個意思 是以各個國家都有了自己的字元集 比如中國的就是GBK GB2312 中國台灣的big5(繁體編碼)
亂碼: 世界上存在着多種編碼方式。從一個二進制數字可以被解釋成不同的符号,
是以想要打開一個文本檔案就必須知道它的編碼方式,否則用錯誤的編碼方式解讀就會出現亂碼.
Unicode:一種編碼将世界上所有的符号都納入其中。每一個符号都賦予一個獨一無二的編碼,
使用Unicode沒有亂碼的問題,是以也叫萬國碼
Unicode缺點:Unicode隻規定了符号的二進制代碼。卻沒有規定這個二進制代碼應該是如何存儲的 ,無法差別Unicode和ASCII:計算機無法區分三個位元組表示一個符号,還是分别表示三個符号。另外我們知道英文字母隻用一個位元組表示就夠了,如果Unicode統一規定,。每一個符号用三個或4個位元組表示.那麼每個英文字母前都必然有2~3個位元組是0,這是對存儲空間來說是極大的浪費。
Unicode方向是比較大的。真正落地的實作是下面這種方式
UTF-8:是在網際網路上使用最廣泛的一種Unicode的實作方式。
UTF-8是一種變長的編碼方式。它可以使用1~6個位元組來表示一個符号。根據不同的符号而變化位元組長度。
後邊的學習乃至工作開發中都是會用這個編碼方式
3、字元串的+操作
3.1 問題
1 字元串是什麼資料類型
2 字元串的表現形式
3 字元串的+操作是什麼意思
3.2 答案
3.2.1 字元串
字元串是引用資料類型;用一對雙引号包裹起來的
3.2.2 字元串的+操作
當“+”操作中出現字元串時,這個”+”是字元串連接配接符,而不是算術運算
public class Test {
public static voidmain(String[] args) {
System.out.println(1 + 23);
System.out.println("年齡為:" +23);
System.out.println(1 + 99 +"年黑馬");
}
}
3.3 練習
char c='a';
int num=10;
String s="hello";
System.out.println(c+num+s);
System.out.println(c+s+num);
System.out.println(c+(num+s));
System.out.println(s+num+c);
System.out.println(s+(num+c));
4、案例:數值拆分
4.1 拆分規則
個位 :數值 % 10
十位 :數值 / 10 % 10
百位 :數值 / 10 / 10 % 10
千位 :數值 / 10 / 10 / 10 % 10;
4.2 練習
鍵盤錄入一個四位數,擷取該數字各個位置上的資料值并列印
5、自增自減運算符
5.1 問題
1 自增自減的符号
2 參與操作,在前和在後的差別
5.2 答案
5.2.1 符号
++和-- 既可以放在變量的後邊,也可以放在變量的前邊。單獨使用的時候, ++和-- 無論是放在變量的前邊還是後邊,結果是一樣的。
5.2.2 參與操作
如果放在變量的後邊,先将該變量原本的值,取出來參與操作,随後再進行自增(++),自減(--)
如果放在變量的前邊,先對該變量做自增(++)或者自減(--),然後再拿變量參與操作
5.3 練習
需求:看程式,不提前運作,說結果
代碼1:
int a = 1;//這三個a是同一個,存儲空間是一樣的,其中一個改變其他的使用時候都變了
int b = a++ + a++;
分析:
int b = (1) + (2);//表達式
a值變化:1 -- 2 -- 3
a值?b值?
代碼2:
int a = 1;
int b = ++a + a++;
int b = (2) + (2);//表達式
a值變化:1 2 3
a值?b值?
代碼3:
int a = 1;
int b = ++a + ++a;
int b = (2) + (3);
a值變化:1 2 3
a值?b值?
注意點:
short s1=10;
s1++;//自增1不會改變自身的變量的資料類型
5.4 注意事項
使用自增/自減運算時應注意下面幾個問題。
自增/自減隻能作用于變量,不允許對常量、表達式或其他類型的變量進行操作。常見的錯誤是試圖将自增或自減運算符用于非簡單變量表達式中。
自增/自減運算可以用于整數類型byte、short、int、long,浮點類型 float、double,以及字元串類型char。
在 Java 1.5 以上版本中,自增/自減運算可以用于基本類型對應的包裝器類Byte、Short、Integer、Long、Float、Double 和 Character。注:就業班會講包裝類
6、指派運算符
6.1 問題
1、指派運算符的作用
2、基本指派運算符有哪些?
3、擴充指派運算符有哪些
6.2 答案
6.2.1 作用
指派運算符的作用是将一個表達式的值賦給左邊,左邊必須是可修改的,不能是常量。
6.2.2 基本指派運算符
符号:=
作用:指派
說明:将等号右邊的資料值指派給等号左邊的變量(a = 10; 将10指派給a變量)
6.2.3 擴充指派運算符
注意事項:
擴充的指派運算符隐含了強制類型轉換。
short s = 10;
s = s + 10; // 此行代碼報出,因為運算中s提升為int類型,運算結果int指派給short可能損失精度
s += 10; // 此行代碼沒有問題,隐含了強制類型轉換,相當于 s = (short) (s + 10);
7、關系運算符(比較運算符)
7.1 問題
1 關系運算符分類
2 關系運算符的結果是什麼
3 =和==的差別
7.2 答案
7.2.1 分類
關系運算符有6種關系,分别為小于、小于等于、大于、等于、大于等于、不等于
7.2.2 結果
關系運算符的結果都是boolean類型,要麼是true,要麼是false。
7.2.3 =和==的差別
千萬不要把“==”誤寫成“=”,"=="是判斷是否相等的關系,"="是指派。
=指派運算符
==比較運算符
比較基本資料類型,比較的是資料值本身
比較引用資料類型,比較的是位址值(後續學習)
7.3 代碼示例
int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a > b); // false
System.out.println(a >= b); // false
System.out.println(a < b); // true
System.out.println(a <= b); // true
// 關系運算的結果肯定是boolean類型,是以也可以将運算結果指派給boolean類型的變量
boolean flag = a > b;
System.out.println(flag); // 輸出false
8、邏輯運算符
8.1 問題
1、邏輯運算符的概念
2、邏輯運算符的分類
3、邏輯運算符的作用
8.2 答案
8.2.1 概念
- 了解層面:邏輯運算符,可以用來整合多個條件,為一段整體的邏輯
- 代碼層面:連接配接布爾類型的表達式, 或者是值
8.2.2 分類
8.2.3 作用
用于(整合)多個比較表達式的條件,最終得到的結果是boolean類型的true或false。
其實就是用來連接配接關系表達式的運算符(也可以直接連接配接布爾類型的常量或者變量)
9、短路邏輯運算符
9.1 問題
1、分類
2、作用
9.2 答案
9.2.1 分類
9.2.2 作用
在邏輯與運算中,隻要有一個表達式的值為false,那麼結果就可以判定為false了,沒有必要将所有表達式的值都計算出來,短路與操作就有這樣的效果,可以提高效率。同理在邏輯或運算中,一旦發現值為true,右邊的表達式将不再參與運算
計算規則:
- 邏輯與&,無論左邊真假,右邊都要執行。
- 短路與&&,如果左邊為真,右邊執行;如果左邊為假,右邊不執行。
- 邏輯或|,無論左邊真假,右邊都要執行。
- 短路或||,如果左邊為假,右邊執行;如果左邊為真,右邊不執行。
9.3 代碼示例
int x = 3;
int y = 4;
System.out.println((x++ > 4) & (y++ > 5)); // 兩個表達都會運算
System.out.println(x); // 4
System.out.println(y); // 5
System.out.println((x++ > 4) && (y++ > 5)); // 左邊已經可以确定結果為false,右邊不參與運算
System.out.println(x); // 4
System.out.println(y); // 4
備注:開發中推薦使用短路運算符
10、三元運算符
10.1 問題
1、格式
2、執行流程
10.2 答案
10.2.1 格式
關系表達式 ? 表達式1 : 表達式2;
10.2.2 執行流程
問号前面的位置是判斷的條件,判斷結果為boolean型。
為true時調用表達式1,為false時調用表達式2。
其邏輯為:如果條件表達式成立或者滿足則執行表達式1,否則執行第二個。
10.3 示例代碼
int a = 10;
int b = 20;
int c = a > b ? a : b; // 判斷 a>b 是否為真,如果為真取a的值,如果為假,取b的值
10.4 注意事項
1.表達式1和2要有明确的計算結果,不能寫輸出語句
int max = num1 > num2 ?System.out.println(num1) : System.out.println(num);
//大錯特錯
2.三元運算符的運算結果不能直接擺在那裡,要麼定義變量接收,要麼直接列印輸出
num1 > num2 ? num1 : num2; //錯誤的
int num = num1 > num2 ? num1: num2;
可以直接列印(單純展示資料)
System.out.println(num1 >num2 ? num1 : num2);
3.表達式1和2 結果要有一個統一的類型
double d = 10 > 5 ? 2 : 1.0; 提升,隐式轉換
???=10 > 5 ? "2" : 1.0;
4.三元運算符可以嵌套使用:
int a=10,b=20;
String result=a>b?"a大":"b大";
如果a和b相等嵌套一下
String result=a>b?"a大":(a==b?"相等":"b大");
11、案例:三個和尚
求三個數的最大值
import java.util.Scanner;
public class Test2Operator {
public static voidmain(String[] args) {
//1.使用Scanner鍵盤錄入三個整數
Scanner sc = newScanner(System.in);
System.out.println("請輸入三個整數:");
int num1 = sc.nextInt();
int num2 = sc.nextInt();
int num3 = sc.nextInt();
//2:用三元運算符擷取前兩個整數的最大值,并用臨時變量儲存起來。
int temp = num1 > num2 ? num1: num2;
//3:用三元運算符,讓擷取臨時最大值和第三個數比較,得到結果。
int max = temp > num3 ? temp: num3;
//4:輸出結果
System.out.println("最大值是:"+ max);
}
}
思考:
如果我要求三個數的最小值呢?
隻要把裡面的大于号變成小于号就可以了
12、運算符的優先級
在Java中,運算符優先級如下圖所示:
有沒有覺得很麻煩,很頭疼?是以,這些優先級我們不需要記憶。
隻要知道一點即可:小括号優先于所有!
在計算的時候必定是先計算小括号裡面的,再計算小括号外面的。
代碼示例:
int a = 10;
int b = 20;
System.out.println(a > b || a< b && a > b);//代碼閱讀性很差
-----------改寫如下--------------
int a = 10;
int b = 20;
System.out.println((a > b) ||(a < b && a > b));//代碼閱讀性很好