Java三目運算符的實戰(zhàn)案例
1.什么是條件分支語句?條件分支語句共有幾種寫法?
條件分支語句就是根據(jù)條件不同,選擇執(zhí)行不同代碼的結構,Java中共有三種聲明條件分支語句的語法,分別為:
- if 語句
- 三目運算符
- switch語句
案例:判斷輸入的數(shù)值是奇數(shù)還是偶數(shù),if 語句非常簡單:
System.out.println("請輸入一個數(shù)字:");
int num = sc.nextInt();
//輸出用戶輸入的數(shù)據(jù)是奇數(shù)還是偶數(shù)?
//分析:通過條件分支語句進行判斷!
if (num % 2 == 0) {//證明:數(shù)值除以二等于0,是偶數(shù)
System.out.println("偶數(shù)");
} else {//證明:除以2不等于0,是奇數(shù)
System.out.println("奇數(shù)");
}2. 三目元算符又稱為三元運算符也稱為條件運算符,目的就是根據(jù)條件得到數(shù)據(jù)結果,語法結構:
判斷條件 ?條件成立結果 :條件不成立結果
需要注意的是,三目運算符得到的是數(shù)據(jù)結果,不是代碼表達式 。
- 優(yōu)勢:判斷兩種分支的代碼非常簡單
- 劣勢:不太適用于判斷多中分支(可以用來判斷,需要通過三目元算符嵌套完成!)
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個數(shù)字:");
int num = sc.nextInt();
//輸出用戶輸入的數(shù)據(jù)是奇數(shù)還是偶數(shù)?
//分析:num對2取余是否等于0 ? (如果條件成立)輸出偶數(shù) :(如果不成立)輸出奇數(shù)
System.out.println(num % 2 == 0 ? "偶數(shù)" : "奇數(shù)");
}如果遇到判斷三個數(shù)值大小,或者4個數(shù)值大小時候,就會非常麻煩
Scanner sc = new Scanner(System.in);
System.out.println("請輸入第1個整數(shù):");
int a = sc.nextInt();
System.out.println("請輸入第2個整數(shù):");
int b = sc.nextInt();
System.out.println("請輸入第3個整數(shù):");
int c = sc.nextInt();
System.out.println("請輸入第4個整數(shù):");
int d = sc.nextInt();
//輸出三個變量的最大值!(三目運算符)
//a > b ? a : b等價于求得了a和b中的最大值!
System.out.println((a > b ? a : b) > c ? (a > b ? a : b) : c);
System.out.println(a > b ? (a > c ? a : c) : (b > c ? b : c));
//輸出四個變量的最大值!
System.out.println(a > b ? (a > c ? (a > d ? a : d) : (c > d ? c : d)) : (b > c ? (b > d ? b : d) : (c > d ? c : d)));3. switch語句的語法結構如下:
switch (變量) {
case 值1:
滿足變量等于值1運行的代碼;
break;
case 值2:
滿足變量等于值2運行的代碼;
break;
case 值3:
滿足變量等于值3運行的代碼;
break;
default:
不滿足以上任何情況運行的代碼;
break;
}
break用在switch語句中表示結束當前switch語句的執(zhí)行,如果省略break,那么switch語句會跳過后續(xù)所有判斷繼續(xù)執(zhí)行,直到遇到break或者switch運行結束為止!
- 優(yōu)勢:適用于判斷一個數(shù)的多種分支的情況
- 劣勢:switch只能判斷相等的情況
/*
周一:上班
周二:上班
周三:出差
周四:上班
周五:上班
周六:睡覺
周日:打球
否則:日期有誤
*/
Scanner sc = new Scanner(System.in);
System.out.println("請輸入今天周幾?");
int week = sc.nextInt();
//根據(jù)周幾輸出不同的內(nèi)容(switch語句)
switch (week) {
case 1:
case 2://當前一個判斷句沒有break時,運行不會終止,(case=1245都會輸出上班)
case 4:
case 5:
System.out.println("上班");
break;
case 3:
System.out.println("出差");
break;
case 6:
System.out.println("睡覺");
break;
case 7:
System.out.println("打球");
break;
default:
System.out.println("日期有誤");
break;
}補充:Java 三目運算符細節(jié)詳解
短路問題
首先我們都知道Java中 && 和 || 的運算是具有短路效果的,如果邏輯運算符的第一部分能確定運算的結果,就不會再去計算邏輯運算符的第二部分,比如下面的代碼,輸出的 i 仍然是1,因為后面的運算短路了,沒有計算。
int i = 1;
if (true || (i++) > 5) {
System.out.println("test");
}
System.out.println(i); // 1
回到三目運算符,三目運算符也會有短路效果嗎?看下面的代碼。
int i = 5; int j = true ? 1 : ++i; System.out.println(i); // 5
結果輸出是 5 ,說明三目運算符也有類似邏輯運算符的短路問題,直接去 true 和 false 對應的地方取結果,不會計算另一部分,即使把代碼寫成下面這樣結果一樣,輸出結果還是 5 ,不會因為順序而改變。
int i = 5; int j = false ? ++i : 1; System.out.println(i); // 5
運算順序問題
先看下面的代碼。
int[] array = new int[5]; int i = 4; boolean flag = i++ > 4 ? true : false; System.out.println(flag); // false i = 4; int b = i++ > 3 ? array[i] : array[i];
我們知道 i++ 是先賦值再進行自加,所以 flag 的結果是 false 很好理解,但是下面 b 的結果會是多少呢?直接看運行結果。
false
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at A.main(A.java:16)
結果是拋出數(shù)組越界異常,結果說明在比較結束的時候,i 的值已經(jīng)加了,即此時 i = 5 ,再去取數(shù)組的值的時候就會拋出數(shù)組越界異常,所以千萬不要認為 i 值在整個表達式結束后才會增加。
包裝類問題
在使用三目運算符處理包裝類時,要注意 NPE 問題,看下面的代碼。
int a = 5; Integer b = null; int c = true ? a : b; System.out.println(c); ? ?// 5
在這個例子中,會輸出 5 ,沒有什么問題,但是把代碼稍微變一點,看下面的代碼。
int a = 5; Integer b = null; int c = true ? b : a; System.out.println(c);
僅僅是將 a 和 b 交換了一下位置,運行就會報 NullPointerException ,這是為什么的。這也很好理解,當為 true 時,會選 b ,因為前面 c 是基本數(shù)據(jù)類型,所以這時包裝類會自動拆箱,變成下面這樣的代碼,而 b 是 null ,所以會拋出 NullPointerException 異常。
int a = 5; Integer b = null; int c = true ? b.intValue() : a; System.out.println(c);
但是,將代碼變成下面這樣,按理說應該不會有什么問題,因為 c 是包裝類型,可以接收 null ,但是運行時還是會發(fā)生 NullPointerException 異常。其實,當三目運算符的第二、第三個操作數(shù)分別為基本類型的包裝類和基本數(shù)據(jù)類型時,并且選擇了包裝類那一項,則包裝類會自動進行拆箱操作。即代碼還是會進行拆箱操作,所以會發(fā)生 NullPointerException 異常,這點非常容易使人弄錯。
int a = 5; Integer b = null; Integer c = true ? b : a; // 還是會變成Integer c = true ? b.intValue() : a; System.out.println(c);
總結
到此這篇關于Java三目運算符的文章就介紹到這了,更多相關Java三目運算符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中用內(nèi)存映射處理大文件的實現(xiàn)代碼
下面小編就為大家?guī)硪黄狫ava中用內(nèi)存映射處理大文件的實現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06
java之lombok的構建者模式Builder中的泛型寫法說明
這篇文章主要介紹了java之lombok的構建者模式Builder中的泛型寫法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
在spring boot中使用java線程池ExecutorService的講解
今天小編就為大家分享一篇關于在spring boot中使用java線程池ExecutorService的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03

