java三目运算符判断boonlean,java三元运算符
首先看一下三元運算符的格式
[條件語句] ? [表達式1] : [表達式2]
其中如條件語句為真執行表達式1,否則執行表達式2.簡單的例子就不舉了,來點其它的。在JDK1.5以前的版本中,表達式1和表達式2都要求是相同的類型,比如都是String或者char之類的,在JDK1.5以后,有了自動拆箱和裝箱的原因,兩者只要其中一種或者兩者都能被拆箱即可,比如表達式1為Integer,而表達式2為int類型的,比如如下
1
int
a = 1;
2
Integer b = 2;
3
boolean
c = ture;
4
int
d = c ? b : a;
還有個需要注意的是,如果表達式1和表達式2的類型不相同,那么他們需要對交集類型的自動參考轉換
。例如如下這段代碼
1
String str = "abc";
2
StringBuilder strbu = new
StringBuilder("def");
3
boolean
boo = true
;
4
CharSequence cs = boo ? str : strbu;
因為String和StringBuilder都實現了CharSequence這個接口。
確定條件表達式結果類型的規則的核心是以下3點:
1 如果表達式1和表達式2操作數具有相同的類型,那么它就是條件表達式的類型。
2 如果一個表達式的類型是byte、short、char類型的,而另外一個是int類型的常量表達式,且它的值可以用類型byte、short、char三者之一表示的,那么條件表達式的類型就是三者之一
3 否則,將對操作數類型進行二進制數字提升,而條件表達式的類型就是第二個和第三個操作數被提升之后的類型
以上的三點可以用如下的代碼來幫助理解:
1
char
ch = 'a';
2
int
num = 0 ;
3
boolean
bool = true
;
4
System.out.print( bool ? ch : 0); //這里不是 bool ? ch : num ,那樣會打印兩個97
5
System.out.print( !bool ? num : ch);
這段代碼打印的是 a97 。很顯然,第二點的規則應用到第一個打印上了,返回的是char,第三點的規則應用到第二個打印上了,返回的是int 。但是誰會在乎這個順序導致的打印結果,所以為了避免不必要的麻煩,很顯然顯式強制類型轉換
是個很不錯的選擇 -_-
1
char
ch = 'a';
2
int
num = 0 ;
3
boolean
bool = true
;
4
System.out.print( bool ? (char
)ch : (char
)0);
5
System.out.print( !bool ? (int
)num : (int
)ch);
還有值得注意的是 表達式1 和 表達式2 不一定非得是數據類型,還可以是自己定義的方法,只要方法有返回值
就行。例如
復制代碼
1
static
int
test1(int
i) {
2
i += 1;
3
return
i;
4
5
}
6
7
static
int
test2(int
i) {
8
i += 2;
9
return
i;
10
}
11
12
public
static
void
ternary() {
13
boolean
boo = false
;
14
int
c = boo ? test1(1) : test2(2);
15
}
復制代碼
以上就是個人的一點小心得~~有些內容可以參考[條件表達式規范[JLS 15.25]
什么是java三元運算符呢?無疑其操作元有三個,第一個是條件表達式,剩余兩個為值,條件表達式為真時運算取第一個值,為假時取第二個值。
其示例代碼如下:boolean a = 20 < 45 ? true : false;三元運算符的優先級高于賦值運算符,故判斷表達式值為真,去第一個true,a的值為true。
三元運算符用于判斷,其等價的if-else語句如下所示:
01 boolean a; //聲明boolean變量
02 if(20<45) //將20<45作為判斷條件
03 a = true; //條件成立將true賦值給a
04 else
05 a = false;
很多時候三元運算符可以和if-else語句進行互換,它們兩個可以等價的實現判斷的效果。但是三元運算符與if-else語句也還是有不同之處的,下面來具體的談談不同之處。
第一,兩者之間對于返回值有不同的要求,三元運算符是必須要有返回值要求,其運算后一定會有一個結果返回供程序開發人員使用;而if-else語句并不一定有返回值,其執行結果可能是賦值語句或者打印輸出語句(相信這一點大家都比較好理解)。
第二,兩者的性能不同,三元運算符的運算性能相對于if-else語句來說要高一些,但是在一些小型的applet開發和日常學習開發中可以忽略不計。
第三,兩者使用范圍不同,在ireport的一些動態執行的情況下,只能用三元運算符而不能用if-else語句,當然在大多數情況下兩者是可以等價互換的。
第四,兩者的語言特性不同,三元運算符涉及到一種成為雙目數值提升(binary numeric promotion)的語言特性。所謂的雙目數值提升,在三目運算符java開發的環境下可以簡單的理解為雙目運算符的類型轉換問題(便于理解)。其具體規則總結如下:
1)如果定義了數據類型的變量與未定義變量的數值共同參與三元運算符的后雙目運算,,那么返回的結果就是范圍大(精度高)類型
2)如果兩個定義了數據類型的變量共同參與三元運算符的后雙目運算,那么返回的結果就是范圍大(精度高)類型
3)如果直接進行數值的比較,會自動轉型成為范圍大(精度高)的數據類型
而jvm在給數值分配數據類型的時候會選取剛好能裝下該數據大小精度的數據類型進行分配(99.0為float,99為byte/short),在java中常見數據類型其范圍從小到大(精度由高到低):byte
01 char a='a';
02 int i=96;
03 //規則1,定義了數據類型的變量與未定義變量的數值,結果自動轉換為精度高的
04 System.out.println(2==2?i:9.0);
05 //jvm給數值分配的數據類型,98并不是int類型的,而是byte/short,故結果會變為ASCII碼98對應的字符
06 System.out.println(2==2?98:a);
07 //規則2,兩個已經定義數據類型的變量,結果自動轉換為精度高的
08 System.out.println(2==2?a:i);
09 //規則3,兩個未定義的數值,結果自動轉換為精度高的
10 System.out.println(2==2?99:9.0);
11 System.out.println(2==2?99:'b');
上述代碼的執行結果為: 96.0
b
97
99.0
c
以前一直在C#中使用,得到的結果一直是如果兩個數據類型不同,則會進行向上轉型,如char-->int
Csharp代碼
char x = 'X';
int i = 0;
System.Console.Write(true ? x : 0);
System.Console.Write(false ? i : x);
運行這段代碼,會得到的結果是:8888.如上面的解釋一樣。(備注:如果x和i之間沒有直接的類型轉換,則無法編譯通過)
但是,在java中執行,卻是不同的結果。
Java代碼
char x = 'X';
int i = 0;
System.out.println(true ? x : 0);
System.out.println(false ? i : x);
運行這段結果,得到的卻是:X88,可以看到三元運算符的結果,與第二個表達式的類型有直接的關系。
對于第一個表達式:true ? x :0 因為x的類型為char,當表達式為真的時候,結果類型為char,得到的結果是X。
對于第二個表達式:false ? i : x,因為i的類型為整型,當表達式為false的時候,結果類型為int,于是char向上轉型為整型,輸出88。
結論:
1、在不同的開發語言中,一定要注意相同的語句,可能會存在不同的結果。
2、盡量避免在條件運算符兩側,使用不同的數據類型。
大家可以參閱上述代碼與結果理解三元運算符的雙目數值提升問題,由于本人水平有限,希望此文能給大家帶來一定的幫助和啟示,也希望各位不吝賜教,提出你們的寶貴建議。
總結
以上是生活随笔為你收集整理的java三目运算符判断boonlean,java三元运算符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php调用应用程序api,使用PHP调用
- 下一篇: java需要转go吗,【Java转Go】