摘要:自動(dòng)拆箱用賦值運(yùn)算符把一個(gè)包裝類賦值給一個(gè)基本類型變量,或者是在包裝類進(jìn)行數(shù)值運(yùn)算時(shí)。指數(shù)計(jì)數(shù),表示的冪按位操作符可以把值看成單比特值對(duì)待,的操作相同,但是不能用于布爾值。移位操作符高位包括符號(hào)位舍棄,低位補(bǔ)零。
點(diǎn)擊進(jìn)入我的博客 3.1更簡(jiǎn)單的打印語(yǔ)句
System.out.println("imbug");
通過(guò)編寫一個(gè)小類庫(kù),并通過(guò)import static該方法來(lái)實(shí)現(xiàn)簡(jiǎn)化打?。ɑ緵]啥用)。
public class Print { public static void println(String str) { System.out.println(str); } }
import static s1.Print.println; public class Test { public static void main(String[] args) { println("imbug"); } }3.2 使用Java操作符
操作符接受一個(gè)或多個(gè)參數(shù),并生成一個(gè)新值
有些操作符可能會(huì)改變操作數(shù)本身的值
幾乎所有的操作符都只能操作基本類型;=、==、!=能操作所有的對(duì)象;String類支持+、+=操作符
3.3 優(yōu)先級(jí)操作符是有優(yōu)先級(jí)的。
個(gè)人認(rèn)為:死記硬背操作符的優(yōu)先級(jí)除了應(yīng)付大學(xué)考試和智障筆試題之外,并無(wú)卵用~只要理解了運(yùn)算符的原理再來(lái)看優(yōu)先級(jí)有易如反掌了~
如果有人寫這樣的代碼請(qǐng)打死他:System.out.println(a<<=b+=c>>=5);
System.out.println()中的+運(yùn)算符可能會(huì)表示字符串拼接,還有可能進(jìn)行字符串轉(zhuǎn)換。
3.4 賦值賦值=的意思是取右邊的值把它復(fù)制給左邊。
左邊的值必須是明確的、已命名的變量。
右值可以是任何常熟、變量或者表達(dá)式(只要它能生成一個(gè)值)。
基本類型傳遞的是值,對(duì)象類型傳遞的是引用。
+、-、*、/、%
/:整數(shù)的除法會(huì)直接干掉小數(shù)位而不是四舍五入
+、-:還可以用作正負(fù)號(hào)
++、--
前綴式:++a先執(zhí)行運(yùn)算再生成值,即++a == a is true
后綴式:a++先生成值再執(zhí)行運(yùn)算,即a == a++ is true
>、<、>=、<=、!=、==
關(guān)系操作符生成的是一個(gè)boolean的結(jié)果。
大于、小于、大于等于、小于等于不適用于boolean類型
等于和不等于適應(yīng)于全部基本數(shù)據(jù)類型及對(duì)象類型
等于和不等于作用于對(duì)象類型時(shí)比較的是引用(我更傾向于用C++中的地址來(lái)理解這個(gè)概念)
對(duì)基本數(shù)據(jù)類型的包裝類、String、BigInteger、BigDecimal的equals方法比較的是值
如果你自己的class沒有重寫equals方法,那么equals方法使用的是Object的equals方法,即比較引用。
數(shù)值的包裝類Integer x1 = new Integer(10); Integer x2 = new Integer(10); System.out.println("x1 == x2: " + (x1 == x2)); System.out.println("x1.equals(x2): " + x1.equals(x2)); // x1 == x2: false // x1.equals(x2): true Integer y1 = 10; Integer y2 = 10; System.out.println("y1 == y2: " + (y1 == y2)); System.out.println("y1.equals(y2): " + y1.equals(y2)); // y1 == y2: true // y1.equals(y2): true Integer z1 = 1000; Integer z2 = 1000; System.out.println("z1 == z2: " + (z1 == z2)); System.out.println("z1.equals(z2): " + z1.equals(z2)); //z1 == z2: false //z1.equals(z2): true
上述代碼的.class文件反編譯后的代碼
Integer x1 = new Integer(10); Integer x2 = new Integer(10); System.out.println((new StringBuilder()).append("x1 == x2: ").append(x1 == x2).toString()); System.out.println((new StringBuilder()).append("x1.equals(x2): ").append(x1.equals(x2)).toString()); Integer y1 = Integer.valueOf(10); Integer y2 = Integer.valueOf(10); System.out.println((new StringBuilder()).append("y1 == y2: ").append(y1 == y2).toString()); System.out.println((new StringBuilder()).append("y1.equals(y2): ").append(y1.equals(y2)).toString()); Integer z1 = Integer.valueOf(1000); Integer z2 = Integer.valueOf(1000); System.out.println((new StringBuilder()).append("z1 == z2: ").append(z1 == z2).toString()); System.out.println((new StringBuilder()).append("z1.equals(z2): ").append(z1.equals(z2)).toString());
new Integer每次都會(huì)新建對(duì)象,所以==的結(jié)果為false
自動(dòng)裝箱:用賦值運(yùn)算符=把一個(gè)數(shù)值或基本類型變量賦值給一個(gè)包裝類變量(Integer y1 = 10)。裝箱調(diào)用的是Integer.valueOf(10)方法。
自動(dòng)拆箱:用賦值運(yùn)算符=把一個(gè)包裝類賦值給一個(gè)基本類型變量(int y3 = y1),或者是在包裝類進(jìn)行數(shù)值運(yùn)算時(shí)。拆箱調(diào)用的是Integer#intValue()方法。
裝箱方法的坑(筆面試題):下面是Integer.valueOf(int i)的源代碼??梢钥闯霎?dāng)裝箱的數(shù)值在-128到127之間是,返回的對(duì)象是IntegerCache中提前new出來(lái)的對(duì)象,所以y1 == y2的結(jié)果是true;當(dāng)裝箱的數(shù)值超出該范圍,則返回的是new出來(lái)的對(duì)象,所以z1 == z2的結(jié)果為false。
其他的裝箱方法:Byte、Short、Integer、Long的范圍都是[-128,127];Character的范圍是[0,127];Float、Double全部是new出來(lái)的新對(duì)象;Boolean都是預(yù)定義好的true和false。有趣的是,這些代碼作者是一樣的,但寫法各不相同。
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
備注內(nèi)容:可以從https://varaneckas.com/jad/下...;或者可用從http://jd.benow.ca/下載反編譯...3.8 邏輯操作符
&&、||、!
邏輯運(yùn)算符只能根據(jù)兩個(gè)布爾值參數(shù)的邏輯關(guān)系,生成一個(gè)布爾值。
即一旦能夠明確無(wú)誤地確定整個(gè)表達(dá)式的值,就不再計(jì)算表達(dá)式剩余的部分了
&&:遇到第一個(gè)false則不執(zhí)行后邊的代碼
||:遇到第一個(gè)true則不執(zhí)行后邊的代碼
public static boolean func1() { System.out.println("func1"); return true; } public static boolean func2() { System.out.println("func2"); return false; } public static boolean func3() { System.out.println("func3"); return true; } if(func1() && func2() && func3()); // 不執(zhí)行func3中的內(nèi)容 if(func1() || func2() || func3()); // 不執(zhí)行func2和fanc3中的內(nèi)容
面試題:如何不使用條件語(yǔ)句控制流程。
// 不使用if來(lái)控制該流程 if(func1()) { func2(); } // 方法 boolean var = func1() && func2();3.9 直接常量
前綴0x、0X:表示16進(jìn)制數(shù)字
前綴0:表示8進(jìn)制數(shù)字
后綴l、L:表示long類型。在寫代碼的時(shí)候,由于小寫的l容易和數(shù)字1混淆,所以各種規(guī)范中都不建議(禁止)使用小寫的l表示長(zhǎng)整數(shù)。最簡(jiǎn)單就全部用大寫就好了!
后綴f、F:表示float類型。
后綴d、D:表示double類型。
e、E:指數(shù)計(jì)數(shù),表示10的冪
3.10 按位操作符&、|、^、~
&=、|=、^=
boolean:可以把boolean值看成單比特值對(duì)待,&、|、^的操作相同,但是~不能用于布爾值。
3.11 移位操作符<<:高位(包括符號(hào)位)舍棄,低位補(bǔ)零。
>>:有符號(hào)右移運(yùn)算,若高位是1,則高位補(bǔ)1;若高位是0,則高位補(bǔ)0。
>>>:無(wú)符號(hào)右移,最高位補(bǔ)0。
移位操作符只能用來(lái)處理整數(shù)類型。
char、byte、short進(jìn)行移位操作時(shí),會(huì)先被轉(zhuǎn)成int類型,并且結(jié)果也是int類型
long類型移位還是long
<<=、>>=、>>>=
注意:在對(duì)byte、short進(jìn)行>>>=無(wú)符號(hào)右移等于運(yùn)算時(shí),整個(gè)流程是先向上轉(zhuǎn)化成int——進(jìn)行移位運(yùn)算——向下轉(zhuǎn)化(強(qiáng)制截?。┏?b>byte或short,所以會(huì)導(dǎo)致移位后對(duì)結(jié)果不正確。
short s = -1; System.out.println(Integer.toBinaryString(s)); // 11111111111111111111111111111111 System.out.println(Integer.toBinaryString(s >>> 10)); // 1111111111111111111111 s >>>= 10; System.out.println(Integer.toBinaryString(s)); // 111111111111111111111111111111113.12 三目運(yùn)算符
boolean-exp ? val1 : val2
3.13 字符串運(yùn)算符+、+=
3.14 操作符常犯錯(cuò)誤Java中if、while語(yǔ)句必須使用boolean值,所以不會(huì)出現(xiàn)==被寫成=的問(wèn)題;除非是兩個(gè)boolean值
Java編譯器也能夠防止邏輯與或(&&、||)和按位與或(&、|)的問(wèn)題,除非是兩個(gè)boolean值
3.15 類型轉(zhuǎn)換操作符既可以對(duì)數(shù)值進(jìn)行轉(zhuǎn)換,也可以對(duì)數(shù)值變量進(jìn)行轉(zhuǎn)化
向下轉(zhuǎn)化必須要強(qiáng)制轉(zhuǎn)化,否則編譯失?。ㄒ莆坏扔?、算數(shù)等于時(shí)不會(huì))
向上轉(zhuǎn)化不必顯示進(jìn)行轉(zhuǎn)化
除布爾值之外,其他類型都可以互相轉(zhuǎn)化
浮點(diǎn)數(shù)轉(zhuǎn)成整數(shù)值的時(shí)候直接截尾,不會(huì)進(jìn)行四舍五入
表達(dá)式的最大數(shù)據(jù)類型決定了表達(dá)式的數(shù)據(jù)類型
3.16 沒有sizeofJava所有基本數(shù)據(jù)類型的size是確定的,所以不需要sizeof
3.17 操作符小結(jié)char、byte、short在使用算術(shù)操作符和移位操作符的時(shí)候都會(huì)被轉(zhuǎn)成int,必須顯示類型轉(zhuǎn)換回原來(lái)的類型。以下注釋掉的都是編譯錯(cuò)誤的。
short s1 = 10; short s2 = 10; // short s3 = s1 + s2; // short s4 = s1 >> 1;
char、byte、short在進(jìn)行復(fù)合賦值運(yùn)算(移位等于、算數(shù)等于)時(shí)不需要強(qiáng)制轉(zhuǎn)化。
int類型要小心結(jié)果溢出
除boolean外,任何基本類型都可以通過(guò)類型轉(zhuǎn)換變成其他基本類型
必須留意向下轉(zhuǎn)化的的結(jié)果,因?yàn)榭赡艽嬖趤G失信息的可能性
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72151.html
摘要:在初始化和步進(jìn)控制部分,可以用一系列由逗號(hào)分割的語(yǔ)句,而且那些語(yǔ)句會(huì)獨(dú)立執(zhí)行。和都表示無(wú)限循環(huán)語(yǔ)法數(shù)組等關(guān)鍵詞有兩個(gè)方面的用途一方面指定一個(gè)方法返回什么值另一個(gè)方面指定當(dāng)前的方法退出,并返回那個(gè)值。 點(diǎn)擊進(jìn)入我的博客 4.1 true&false Java的條件語(yǔ)句只能使用布爾值來(lái)決定執(zhí)行路徑 4.2 if-else 4.3 循環(huán)語(yǔ)句 while、for、do-while do-...
摘要:的構(gòu)造器經(jīng)過(guò)重載可以接受多種輸出目的地,不過(guò)最常用的還是和。組號(hào)為表示整個(gè)表達(dá)式,組號(hào)表示被第一對(duì)括號(hào)括起的組,依此類推。有多個(gè)重載的構(gòu)造器,可以接受和對(duì)象。 點(diǎn)擊進(jìn)入我的博客 字符串操作是計(jì)算機(jī)程序設(shè)計(jì)中最常見的行為 13.1 不可變String String底層是由char[]實(shí)現(xiàn)的,是不可變的。看起來(lái)會(huì)改變String的方法,實(shí)際上都是創(chuàng)建了一個(gè)新的String對(duì)象,任何指向它...
摘要:迭代器通常被成為輕量級(jí)對(duì)象創(chuàng)建它的代價(jià)很小。與迭代器可以用于數(shù)組和所有對(duì)象,之所以能夠工作,是因?yàn)槔^承了接口。 點(diǎn)擊進(jìn)入我的博客 我覺得本章名字改成容器似乎更好理解,持有對(duì)象讓人感到一頭霧水我們需要在任意時(shí)刻和任意位置創(chuàng)建任意數(shù)量的對(duì)象,所以依靠創(chuàng)建命名的引用來(lái)持有對(duì)象已經(jīng)滿足不了需求。Java可以用數(shù)組和其他容器類來(lái)(List、Set、Queue、Map)來(lái)解決這個(gè)問(wèn)題,不同的容器...
摘要:一引用操縱對(duì)象在的世界里,一切都被視為對(duì)象。特點(diǎn)創(chuàng)建程序時(shí),需要知道存儲(chǔ)在棧內(nèi)所有數(shù)據(jù)的確切生命周期,以便上下移動(dòng)堆棧指針。因?yàn)?,指向同一塊內(nèi)存空間除了通過(guò)對(duì)象引用靜態(tài)變量,我們還可以通過(guò)類直接引用靜態(tài)變量 一、引用操縱對(duì)象 在Java的世界里,一切都被視為對(duì)象。操縱的標(biāo)識(shí)符實(shí)際上是對(duì)象的引用, 例如:遙控器與電視的關(guān)系。 可以在沒有對(duì)象關(guān)聯(lián)的情況下,擁有一個(gè)引用。沒有電視機(jī),也可以擁...
摘要:方法的基本組成包括名稱參數(shù)返回值方法體方法名和參數(shù)列表唯一的標(biāo)識(shí)出某個(gè)方法。如果返回的類型是,則的作用僅是退出方法否則必須返回正確的返回值包名名字可見性約定以域名反轉(zhuǎn)作為包名,用來(lái)劃分子目錄,并且全部小寫。 點(diǎn)擊進(jìn)入我的博客 2.1用引用操縱對(duì)象 盡管一切都看作對(duì)象,但操縱的標(biāo)識(shí)符實(shí)際上是對(duì)象的一個(gè)引用。 String s; // s是一個(gè)String類型的引用, 并沒有任何對(duì)象與其...
閱讀 2286·2021-11-23 09:51
閱讀 5681·2021-09-22 15:39
閱讀 3355·2021-09-02 15:15
閱讀 3506·2019-08-30 15:54
閱讀 2364·2019-08-30 15:53
閱讀 1404·2019-08-30 14:04
閱讀 2459·2019-08-29 18:33
閱讀 2378·2019-08-29 13:08