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