Java數(shù)據(jù)類(lèi)型、運(yùn)算符和方法重點(diǎn)總結(jié)大全
一、數(shù)據(jù)類(lèi)型
1.1 兩種數(shù)據(jù)類(lèi)型
在Java中,數(shù)據(jù)類(lèi)型主要分為 基本數(shù)據(jù)類(lèi)型 和 引用數(shù)據(jù)類(lèi)型 。
1.1.1 基本數(shù)據(jù)類(lèi)型
基本數(shù)據(jù)類(lèi)型共有四類(lèi)八種:
- 整型:byte, short, int, long,
- 浮點(diǎn)型:float, double,
- 字符型:char,
- 布爾型:boolean
八種基本數(shù)據(jù)類(lèi)型的位數(shù)、取值范圍和默認(rèn)值如下表:
| 數(shù)據(jù)類(lèi)型 | 占用大小(字節(jié)) | 位數(shù) | 取值范圍 | 默認(rèn)值 | 描述 |
|---|---|---|---|---|---|
| byte | 1 | 8 | -128(-2?)到 127(2?-1) | 0 | 最小的整數(shù)類(lèi)型,適合用于節(jié)省內(nèi)存的場(chǎng)景 |
| short | 2 | 16 | -32768(-2¹?)到32767(2¹?-1) | 0 | 較少使用,通常用于需要節(jié)省內(nèi)存且數(shù)據(jù)范圍在該區(qū)間的場(chǎng)景 |
| int | 4 | 32 | -2147483648(-2³¹)到2147483647(2³¹-1) | 0 | 最常用的整數(shù)類(lèi)型,可以滿足大多數(shù)日常編程中整數(shù)計(jì)算的需求,是Java中表示整數(shù)的默認(rèn)類(lèi)型 |
| long | 8 | 64 | -9223372036854775808(-2?³)到9223372036854775807(2?³-1) | 0L | 用于表示非常大的整數(shù),當(dāng) int 類(lèi)型無(wú)法滿足需求時(shí)使用,定義時(shí)需要在數(shù)值后加上 L 或 l |
| float | 4 | 32 | 1.4E - 45 到 3.4028235E38 | 0.0F | 單精度浮點(diǎn)數(shù),用于表示小數(shù),精度相對(duì)較低,定義時(shí)需要在數(shù)值后加上 F 或 f |
| double | 8 | 64 | 4.9E - 324 到 1.7976931348623157E308 | 0.0D | 雙精度浮點(diǎn)數(shù),精度比 float 高,是Java中表示小數(shù)的默認(rèn)類(lèi)型 |
| char | 2 | 16 | ‘\u0000’(0)到 ‘\uffff’(65535) | ‘\u0000’ | 用于表示單個(gè)字符,采用Unicode編碼,可表示各種語(yǔ)言的字符 |
| boolean | 無(wú)明確字節(jié)大小 | 無(wú)明確位數(shù) | true 或 false | false | 用于邏輯判斷,只有兩個(gè)取值,常用于條件判斷和循環(huán)控制等邏輯場(chǎng)景 |
需要注意以下幾點(diǎn):
- 與C/C++不同,無(wú)論在16位系統(tǒng)還是在32位系統(tǒng),int 類(lèi)型都占用4字節(jié),long 類(lèi)型都占用8字節(jié)。
- 整型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)都是默認(rèn)有符號(hào)的。
- 整型數(shù)據(jù)默認(rèn)是 int ,浮點(diǎn)型數(shù)據(jù)默認(rèn)是 double 。
- 定義 float 類(lèi)型變量時(shí),賦值的數(shù)字后加上 f ,否則將被認(rèn)為 double 。
- char 類(lèi)型變量使用 Unicode 表示字符,可以存放整型數(shù)據(jù)和中文字符。
- boolean 類(lèi)型變量不可以和 int 類(lèi)型相轉(zhuǎn)換,不存在 “1 表示 true,0 表示 false” 。
面試題1:int 和 long 是多少位、多少字節(jié)的?
- int 類(lèi)型是32位、占4個(gè)字節(jié),是一種有符號(hào)的整數(shù)類(lèi)型,其取值范圍是:-2³¹到2³¹-1。若在一個(gè)簡(jiǎn)單的計(jì)數(shù)器程序中使用 int 類(lèi)型來(lái)存儲(chǔ)計(jì)數(shù)值,可以表示的最大值是 2,147,483,647,超過(guò)這個(gè)值就會(huì)發(fā)生溢出,導(dǎo)致結(jié)果不符合預(yù)期。
- long 類(lèi)型是64位、占8個(gè)字節(jié),也是一種有符號(hào)的整數(shù)類(lèi)型,其取值范圍比 int 類(lèi)型大,為:-2?³到2?³-1。在處理較大的整數(shù)數(shù)值時(shí),若 int 類(lèi)型不夠用,就可以使用 long 類(lèi)型。如在一個(gè)文件傳輸程序中,文件的大小可能會(huì)很大,此時(shí)使用 int 類(lèi)型很有可能溢出導(dǎo)致數(shù)據(jù)異常,使用 long 類(lèi)型就可以解決。
面試題2:long 和 int 可以互相轉(zhuǎn)換嗎?
- 在Java中,long 和 int 是可以相互轉(zhuǎn)換的。由于 long 的數(shù)據(jù)范圍比 int 的數(shù)據(jù)范圍大,當(dāng) int 轉(zhuǎn)換為 long 時(shí)是沒(méi)有問(wèn)題的,但是當(dāng) long 轉(zhuǎn)換為 int 時(shí)可能會(huì)發(fā)生截?cái)鄬?dǎo)致的溢出問(wèn)題
- int(小范圍類(lèi)型)轉(zhuǎn)換成 long(大范圍類(lèi)型)是可以自動(dòng)完成轉(zhuǎn)換的,直接進(jìn)行賦值即可。如:int valInt = 10; long valLong = valInt;
- long(大范圍類(lèi)型)轉(zhuǎn)換成 int(小范圍類(lèi)型)需要強(qiáng)制手動(dòng)轉(zhuǎn)換,可能導(dǎo)致數(shù)據(jù)溢出。如:long valLong = 10000L; int valInt = (int) valLong;
面試題3:數(shù)據(jù)類(lèi)型的轉(zhuǎn)換方式有哪些?
- 自動(dòng)類(lèi)型轉(zhuǎn)換(隱式轉(zhuǎn)換):當(dāng)目標(biāo)類(lèi)型的數(shù)值范圍大于原類(lèi)型的數(shù)值范圍時(shí),Java會(huì)自動(dòng)將原類(lèi)型轉(zhuǎn)換為目標(biāo)類(lèi)型,無(wú)需手動(dòng)轉(zhuǎn)換。如:將 int 轉(zhuǎn)換為 long,將 float 轉(zhuǎn)換為 double 等。
- 強(qiáng)制類(lèi)型轉(zhuǎn)換(顯示轉(zhuǎn)換):當(dāng)目標(biāo)類(lèi)型的數(shù)值范圍小于原類(lèi)型的數(shù)值范圍時(shí),需要手動(dòng)強(qiáng)制轉(zhuǎn)換,語(yǔ)法:目標(biāo)類(lèi)型 變量名稱(chēng) = (目標(biāo)類(lèi)型) 原類(lèi)型變量。由于目標(biāo)類(lèi)型數(shù)值范圍較小,轉(zhuǎn)換后可能導(dǎo)致數(shù)據(jù)丟失或溢出。如:將 long 轉(zhuǎn)換為 int,將 double 轉(zhuǎn)換為 float 等。
- 字符串轉(zhuǎn)換:Java提供了將字符串表示的數(shù)據(jù)轉(zhuǎn)換為其他類(lèi)型數(shù)據(jù)的方法。如:將字符串轉(zhuǎn)換為 int 類(lèi)型可以使用 Integer.parseInt() 方法;將字符串轉(zhuǎn)換為 double 類(lèi)型可以使用 Double.parseDouble() 方法等。
- 數(shù)值之間的轉(zhuǎn)換:Java提供了一些數(shù)值類(lèi)型之間的相互轉(zhuǎn)換方法,如將整型轉(zhuǎn)換為字符型,將字符型轉(zhuǎn)換為整型等。這些轉(zhuǎn)換方式可以通過(guò)包裝類(lèi)來(lái)實(shí)現(xiàn)如 Character 類(lèi)、Integer 類(lèi)等提供了相應(yīng)的轉(zhuǎn)換方法。
面試題4:基本數(shù)據(jù)類(lèi)型互相轉(zhuǎn)換會(huì)出現(xiàn)什么問(wèn)題?
- 當(dāng)小范圍數(shù)據(jù)類(lèi)型轉(zhuǎn)換成大范圍數(shù)據(jù)類(lèi)型:Java會(huì)自動(dòng)進(jìn)行轉(zhuǎn)換,這種轉(zhuǎn)換方式一般不會(huì)出現(xiàn)問(wèn)題,是安全的。
- 當(dāng)大范圍數(shù)據(jù)類(lèi)型轉(zhuǎn)換成小范圍數(shù)據(jù)類(lèi)型:需要手動(dòng)強(qiáng)行轉(zhuǎn)換,這種轉(zhuǎn)換方式可能會(huì)發(fā)生數(shù)據(jù)溢出或者精度損失的問(wèn)題:前者主要是由于大范圍數(shù)據(jù)在轉(zhuǎn)換成小范圍數(shù)據(jù)的過(guò)程中被截?cái)嗔烁呶蛔止?jié),這將會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)誤;后者是由于浮點(diǎn)數(shù)類(lèi)型數(shù)據(jù)的精度不一致在進(jìn)行轉(zhuǎn)換時(shí)發(fā)生的精度損失,同樣也會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)誤。
1.1.2 引用數(shù)據(jù)類(lèi)型
引用數(shù)據(jù)類(lèi)型不同于基本數(shù)據(jù)類(lèi)型存儲(chǔ)值,它們存儲(chǔ)的是地址
在Java中,字符串、八種基本數(shù)據(jù)類(lèi)型的包裝類(lèi) 和 BigDecimal 是引用數(shù)據(jù)類(lèi)型。
字符串
int 和 字符串間相互轉(zhuǎn)換:
//int轉(zhuǎn)字符串 int num = 10; String str1 = num + ""; //法1 String str2 = String.valueOf(num); //法2 //字符串轉(zhuǎn)int String str = "100"; int n = Integer.parseInt(str);
在這里我們只需要掌握字符串和基本數(shù)據(jù)類(lèi)型的相互轉(zhuǎn)換就可以了。
八種基本數(shù)據(jù)類(lèi)型的對(duì)應(yīng)包裝類(lèi)
包裝類(lèi)的誕生目的:Java中的一些集合要求必須是對(duì)象才能進(jìn)行操作,但是基本數(shù)據(jù)類(lèi)型不是對(duì)象,因此設(shè)計(jì)包裝類(lèi)以解決該矛盾。
// 集合類(lèi)中只能存放對(duì)象元素 List<Integer> list = new ArrayList<>();
包裝類(lèi)的本質(zhì)就是:將基本數(shù)據(jù)類(lèi)型封裝為對(duì)象,使得我們能夠通過(guò)各種方法進(jìn)行操作數(shù)據(jù)
| 基本數(shù)據(jù)類(lèi)型 | 對(duì)應(yīng)包裝類(lèi) |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
- 除了 int 和 char ,其他數(shù)據(jù)類(lèi)型的包裝類(lèi)均是原數(shù)據(jù)類(lèi)型名首字母改大寫(xiě)。
- 由于包裝類(lèi)是引用類(lèi)型數(shù)據(jù)(存放地址),因此值可以為 null,但是基本數(shù)據(jù)類(lèi)型不可以為 null
基本數(shù)據(jù)類(lèi)型和對(duì)應(yīng)包裝類(lèi)的相互轉(zhuǎn)換方式是裝箱和拆箱:
- 裝箱 是將值類(lèi)型隱式或顯式轉(zhuǎn)換為引用類(lèi)型的操作。 當(dāng)將一個(gè)值類(lèi)型(如int、float)賦值給對(duì)象變量時(shí),系統(tǒng)會(huì)自動(dòng)在堆(Heap)上創(chuàng)建新對(duì)象,復(fù)制原始值到該對(duì)象中,并返回對(duì)象的引用。這相當(dāng)于“包裝”值類(lèi)型成一個(gè)獨(dú)立的對(duì)象。
- 拆箱 是將引用類(lèi)型顯式轉(zhuǎn)換回值類(lèi)型的操作。它與裝箱相反,系統(tǒng)將從堆上的對(duì)象中提取原始值,復(fù)制到棧內(nèi)存中。拆箱必須顯式指定目標(biāo)類(lèi)型(不像裝箱可能隱式)。
int i = 10; Integer objInt = i; // 自動(dòng)裝箱 int j = objInt; // 自動(dòng)拆箱,也可以顯式定義目標(biāo)類(lèi):(int) objInt
BigDecimal
在基本數(shù)據(jù)類(lèi)型中,浮點(diǎn)數(shù)有 float 和 double,它們?cè)谀承﹫?chǎng)景(如資金計(jì)算)中可能會(huì)出現(xiàn)精度問(wèn)題:
System.out.println(0.05 + 0.01); // 0.06 System.out.println(1.0 - 0.42); // 0.58 System.out.println(4.015 * 100); // 401.5 System.out.println(123.3 / 100); // 1.233 /* 實(shí)際輸出: 0.060000000000000005 0.5800000000000001 401.49999999999994 1.2329999999999999 */
因此在涉及到資金問(wèn)題時(shí),我們可以使用Java引進(jìn)的 BigDecimal類(lèi)。
BigDecimal類(lèi)時(shí)Java提供的用于任意精度計(jì)算的類(lèi),在java.math包中
使用BigDecimal來(lái)計(jì)算:
import java.math.BigDecimal
// BigDecimal對(duì)象的創(chuàng)建,注意只能用字符串來(lái)創(chuàng)建,用浮點(diǎn)數(shù)會(huì)存在精度問(wèn)題
BigDecimal a = new BigDecimal("11.1");
BigDecimal b = new BigDecimal("0.8");
// 計(jì)算兩數(shù)之積
System.out.println(b.multiply(a));
// 結(jié)果:8.88
面試題1:裝箱和拆箱是什么?
- 為了使基本數(shù)據(jù)類(lèi)型能夠用于集合和泛型等需要操作元素為對(duì)象的場(chǎng)景,Java允許通過(guò)“裝箱”和“拆箱”操作實(shí)現(xiàn)基本數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型(對(duì)象)的相互轉(zhuǎn)換。
- Java會(huì)在賦值時(shí)會(huì)自動(dòng)進(jìn)行裝箱和拆箱操作。在Java 1.5以后,編譯器支持在給變量賦值時(shí)自動(dòng)進(jìn)行裝箱或拆箱操作。
- 在調(diào)用方法時(shí),編譯器同樣也會(huì)自動(dòng)進(jìn)行裝箱或拆箱操作。
- 需要注意自動(dòng)裝箱和拆箱有一定的開(kāi)銷(xiāo),在循環(huán)這種重復(fù)同一個(gè)操作的場(chǎng)景不適用,否則性能開(kāi)銷(xiāo)太大。
面試題2:Java為什么有Integer?
- Integer 是基本數(shù)據(jù)類(lèi)型 int 的包裝類(lèi),即把 int 類(lèi)型數(shù)據(jù)包裝陳 object 對(duì)象。
- 封裝成對(duì)象有很多好處,可以將數(shù)據(jù)和操作數(shù)據(jù)的方法結(jié)合在一塊。如 Integer 中有 parseInt() 等方法用于專(zhuān)門(mén)處理 int 類(lèi)型數(shù)據(jù)。
- 此外另一個(gè)原因是Java中一切皆是對(duì)象,集合類(lèi)必須要求首先是對(duì)象才能操作,而基本數(shù)據(jù)類(lèi)型不是對(duì)象,導(dǎo)致集合類(lèi)無(wú)法對(duì)基本數(shù)據(jù)類(lèi)型進(jìn)行處理,因此有包裝類(lèi)是很有必要的。
面試題3:Integer相比int來(lái)說(shuō),有哪些優(yōu)點(diǎn)?
- Integer作為類(lèi)封裝了很多操作數(shù)據(jù)的方法(parseInt()、compareTo()等),而int只能存儲(chǔ)數(shù)值
- 支持在集合類(lèi)和泛型中使用:Java的集合框架(如ArrayList、HashMap等)要求存儲(chǔ)對(duì)象而非基本數(shù)據(jù)類(lèi)型,Integer作為對(duì)象可以直接用于集合,而int無(wú)法使用。使用集合能夠高效管理數(shù)據(jù),極大地簡(jiǎn)化數(shù)據(jù)存儲(chǔ)和處理邏輯。
- 提供自動(dòng)裝箱/拆箱功能:Java提供了自動(dòng)裝箱和自動(dòng)拆箱的機(jī)制,能夠允許基本數(shù)據(jù)類(lèi)型和對(duì)象類(lèi)型隨時(shí)轉(zhuǎn)換,提高了開(kāi)發(fā)的效率。
- Integer作為對(duì)象成員變量時(shí),默認(rèn)值為 null,能夠明確表示“缺失值
”或“未初始化”,避免與零值混淆。當(dāng)對(duì)未初始化的Integer變量進(jìn)行操作時(shí)會(huì)拋出空指針異常。
面試題4:既然Integer這么好用,為什么還要保留int類(lèi)型呢?
- 性能方面,int類(lèi)型比Integer類(lèi)型要快。int是基本數(shù)據(jù)類(lèi)型,Integer是引用數(shù)據(jù)類(lèi)型。Java中的基本數(shù)據(jù)類(lèi)型是預(yù)定義的,不需要實(shí)例化就可以使用;而引用類(lèi)型數(shù)據(jù)需要實(shí)例化成對(duì)象后才能使用。這意味著,使用int來(lái)存儲(chǔ)一個(gè)整數(shù)時(shí),不需要為其分配額外內(nèi)存,但是使用Integer時(shí)必須為其分配額外內(nèi)存以存儲(chǔ)對(duì)象。因此,int類(lèi)型在讀寫(xiě)方面的效率比Integer類(lèi)型要高效。此外,在進(jìn)行條件比較時(shí),int類(lèi)型可以直接使用“==”來(lái)比較,但是Integer類(lèi)型只能通過(guò)“.equals()或.intValue() ”來(lái)比較,增加了復(fù)雜度。
- 存儲(chǔ)方面,int類(lèi)型占用的字節(jié)數(shù)比Integer類(lèi)型要少。在64位JVM上,開(kāi)啟引用壓縮情況下,一個(gè)Integer對(duì)象占用至少16字節(jié)的內(nèi)存空間,但是一個(gè)int類(lèi)型數(shù)據(jù)只占用4字節(jié)的內(nèi)存空間。
面試題5:Integer的緩存機(jī)制是什么?
- 當(dāng)通過(guò)
valueOf()方法或自動(dòng)裝箱方式創(chuàng)建Integer對(duì)象時(shí),對(duì)于特定范圍內(nèi)的值(默認(rèn)是−128到127),Java會(huì)優(yōu)先從緩存池中返回已有的實(shí)例,而非每次都創(chuàng)建新對(duì)象。這樣做有利于顯著提升小整數(shù)操作效率(尤其在集合類(lèi)中),同時(shí)降低了對(duì)象創(chuàng)建的成本。
面試題6:為什么精確計(jì)算時(shí)使用BigDecimal而不用double?
- 在涉及精確計(jì)算場(chǎng)景時(shí)通常不使用double的原因在于:計(jì)算機(jī)中的二進(jìn)制浮點(diǎn)數(shù)無(wú)法精確表示十進(jìn)制小數(shù)。double等浮點(diǎn)數(shù)采用IEEE 754標(biāo)準(zhǔn)的二進(jìn)制小數(shù)表示法,部分十進(jìn)制分?jǐn)?shù)在二進(jìn)制中是無(wú)限循環(huán)小數(shù)(如0.1=1/10在二進(jìn)制中是0.0001100110011…),這將會(huì)導(dǎo)致存儲(chǔ)時(shí)被截?cái)唷M瑫r(shí),使用double進(jìn)行連續(xù)計(jì)算時(shí),會(huì)將誤差擴(kuò)大,導(dǎo)致結(jié)果不準(zhǔn)確。
- BigDecimal在存儲(chǔ)數(shù)值時(shí)采用十進(jìn)制整數(shù)+縮放比例的結(jié)構(gòu),這樣保存的小數(shù)比二進(jìn)制浮點(diǎn)數(shù)要精確。
二、運(yùn)算符
2.1 算術(shù)運(yùn)算符
Java中的算術(shù)運(yùn)算符有:
- 四則運(yùn)算符(+ - * / %)
- 增量運(yùn)算符(+= -= *= /= %=)
- 自增/自減運(yùn)算符(++ --)。
int a = 20; int b = 10; System.out.println(a + b); // 30 System.out.println(a - b); // 10 System.out.println(a * b); // 200 System.out.println(a / b); // 2 System.out.println(a % b); // 0,求余數(shù),得數(shù)為零表示 a 能被 b 整除 System.out.println(a += b); // 相當(dāng)于 a = a + b,30 System.out.println(a -= b); // 相當(dāng)于 a = a - b,10 System.out.println(a *= b); // 相當(dāng)于 a = a * b,200 System.out.println(a /= b); // 相當(dāng)于 a = a / b,2 System.out.println(a %= b);// 相當(dāng)于 a = a % b,0 System.out.println(a ++);// 先使用 a 再運(yùn)算,相當(dāng)于 a = a + 1,21 System.out.println(a --);// 先使用 a 再運(yùn)算,相當(dāng)于 a = a - 1,19 System.out.println(++ a);// 先運(yùn)算再使用 a ,相當(dāng)于 a = a + 1,21 System.out.println(-- a);// 先運(yùn)算再使用 a ,相當(dāng)于 a = a - 1,19
需要注意的是:
- 四則運(yùn)算符均是二元運(yùn)算符,必須有兩個(gè)操作數(shù)
- 除法運(yùn)算的時(shí)候,int 類(lèi)型和 int 類(lèi)型的除法運(yùn)算得到的結(jié)果仍然是 int 類(lèi)型(舍去小數(shù)部分)。
- 進(jìn)行取模運(yùn)算時(shí),右操作數(shù)不可以是 0 ,并且可以對(duì)浮點(diǎn)型數(shù)據(jù)進(jìn)行取模。
- 當(dāng)多種類(lèi)型的數(shù)據(jù)進(jìn)行混合運(yùn)算時(shí),結(jié)果會(huì)自動(dòng)向數(shù)據(jù)范圍大的類(lèi)型轉(zhuǎn)型。
2.2 關(guān)系運(yùn)算符
關(guān)系運(yùn)算符主要有:== != < > <= >= 六種,它們的運(yùn)算結(jié)果均是布爾值
int a = 10; int b = 20; System.out.println(a == b); // 對(duì)于基本數(shù)據(jù)類(lèi)型來(lái)說(shuō),比較的是數(shù)值,false System.out.println(a != b); // true System.out.println(a < b); // true System.out.println(a > b); // false System.out.println(a <= b); // true System.out.println(a >= b); // false
面試題:Java中的“==”和 equals()方法有什么區(qū)別?
- ==:用于比較基本數(shù)據(jù)類(lèi)型時(shí),比較的是兩個(gè)數(shù)據(jù)的數(shù)值大小;用于比較引用數(shù)據(jù)類(lèi)型(對(duì)象)的時(shí)候,比較的是兩個(gè)引用存儲(chǔ)的地址,若地址相同說(shuō)明兩個(gè)引用指向的是同一個(gè)對(duì)象。
- equals():源自O(shè)bject類(lèi)的方法,很多類(lèi)重寫(xiě)了該方法使其能夠?qū)σ脭?shù)據(jù)類(lèi)型進(jìn)行內(nèi)容的比較。
2.3 邏輯運(yùn)算符
邏輯運(yùn)算符主要有:&& || ! ,它們的運(yùn)算結(jié)果均是布爾值true或false。
其中,&&和 || 兩個(gè)運(yùn)算符是二元運(yùn)算符,必須有兩個(gè)操作數(shù);!是一元運(yùn)算符,只需要一個(gè)操作數(shù)即可。
它們的邏輯功能如下:
- 邏輯與&&:兩個(gè)表達(dá)式都是真(true)結(jié)果才是真(true),否則結(jié)果均是假(false)。
- 邏輯或||:兩個(gè)表達(dá)式都是假(false)結(jié)果才是假(false),否則結(jié)果均是真(true)。
- 邏輯非!:真變假,假變真。
短路現(xiàn)象:
- 當(dāng)&&左側(cè)表達(dá)式的值是false時(shí),整個(gè)結(jié)果一定是false,此時(shí)右側(cè)表達(dá)式不會(huì)被執(zhí)行;
- 當(dāng) || 左側(cè)表達(dá)式的值是true時(shí),整個(gè)結(jié)果一定是true,此時(shí)右側(cè)表達(dá)式不會(huì)被執(zhí)行。
2.4 位運(yùn)算符
位運(yùn)算符主要包括:& | ~ ^ ,除了 ~ 是一元運(yùn)算符,其余都是二元運(yùn)算符。
按位運(yùn)算就是以二進(jìn)制位進(jìn)行運(yùn)算。
- 按位與 & :如果兩個(gè)二進(jìn)制位都是1,則結(jié)果也是1,否則為0。
- 按位或 | : 如果兩個(gè)二進(jìn)制位都是0,則結(jié)果也是0,否則為1。
- 按位取反 ~ :1變0,0變1。
- 按位異或 ^ : 如果兩個(gè)二進(jìn)制位數(shù)字相同,則結(jié)果是0,否則為1。
注意:
- 以0x開(kāi)頭的數(shù)字是十六進(jìn)制數(shù)字,0xf表示十六進(jìn)制數(shù)字15,換算成二進(jìn)制數(shù)字是1111。
- 按位與 & 和按位或 | 不支持短路求值。
2.5 移位運(yùn)算符
移位運(yùn)算符主要有三個(gè):<< >> >>> ,且全部都是二元運(yùn)算符,都是按照二進(jìn)制位運(yùn)算的。
- 左移運(yùn)算符 << :將二進(jìn)制位的最左側(cè)的數(shù)去掉,右側(cè)補(bǔ)0。(正負(fù)可能改變)
- 右移運(yùn)算符 >> :將二進(jìn)制位的最右側(cè)的數(shù)去掉,左側(cè)補(bǔ)0(正數(shù))或1(負(fù)數(shù))。
- 無(wú)符號(hào)右移運(yùn)算符 >>> :將二進(jìn)制位的最右側(cè)的數(shù)去掉,左側(cè)補(bǔ)0。
注意:
左移一位,相當(dāng)于該數(shù) * 2;左移 N 位,相當(dāng)于該數(shù) * 2的 N 次方。
右移一位,相當(dāng)于該數(shù) / 2;右移 N 位,相當(dāng)于該數(shù) / 2的 N 次方。
2.6 條件運(yùn)算符
條件運(yùn)算符是一個(gè)三目運(yùn)算符,其形式是:表達(dá)式1 ?表達(dá)式2 : 表達(dá)式3。
它的運(yùn)算邏輯是:判斷表達(dá)式1的真值,若真值為1就返回表達(dá)式2,否則返回表達(dá)式3
int a = 10; int b = 20; int max = a>b ? a : b; //返回a和b的最大值 System.out.println(max); // 返回 20
三、方法
3.1 方法的定義
若某一個(gè)問(wèn)題頻繁出現(xiàn),每一次都要寫(xiě)一遍代碼那么效率簡(jiǎn)直太低了。
對(duì)于類(lèi)似的問(wèn)題,往往會(huì)將解決該類(lèi)問(wèn)題的代碼封裝在一個(gè)小黑盒——這個(gè)盒子就是方法,每當(dāng)需要解決這種問(wèn)題的時(shí)候就可以調(diào)用這個(gè)方法來(lái)解決。
方法就是用于解決特定問(wèn)題的東西,和C語(yǔ)言中的函數(shù)是一個(gè)性質(zhì)。
方法定義格式:
修飾符 返回值類(lèi)型 方法名稱(chēng)([參數(shù)類(lèi)型 形參 ...]){
方法體代碼;
[return 返回值];
}
例如下面的一個(gè)用于實(shí)現(xiàn)判斷閏年的方法:
public static boolean IsLeapYear(int year) { //判斷閏年
if((year%4==0 && year%100!=0) || year%400==0) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
int year = 2000;
if(IsLeapYear(year)) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
方法的形參和調(diào)用方法時(shí)傳入的實(shí)參這兩個(gè)的內(nèi)存不一樣,形參是實(shí)參的一份拷貝。
public static void swap(int x, int y) {
int t = x;
x = y;
y = t;
}
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a = "+a+" b = "+b);
swap(a,b);
System.out.println("a = "+a+" b = "+b);
}
調(diào)用方法 swap 可以發(fā)現(xiàn),兩次打印 a 和 b 的值都是一樣的,說(shuō)明 swap 方法沒(méi)有成功將兩數(shù)的值進(jìn)行交換,從而證明了改變形式參數(shù)并不能夠影響實(shí)際參數(shù)的值。
只需要將形參和實(shí)參的類(lèi)型換成 引用類(lèi)型 即可,如數(shù)組。
public static void swap(int[] arr) {
int t = arr[0];
arr[0] = arr[1];
arr[1] = t;
}
public static void main(String[] args) {
int[] arr = {10,20};
System.out.println("arr[0] = "+arr[0]+" arr[1] = "+arr[1]);
swap(arr);
System.out.println("arr[0] = "+arr[0]+" arr[1] = "+arr[1]);
}
3.2 方法重載
Java中,經(jīng)常使用IDEA的方法但是能夠發(fā)現(xiàn)同一個(gè)名字有多個(gè)方法:

這就是方法重載,具有以下特點(diǎn):
- 方法名相同
- 參數(shù)列表(參數(shù)的個(gè)數(shù)/類(lèi)型/順序)不同
- 返回值可能相同也可能不相同。
總結(jié)
到此這篇關(guān)于Java數(shù)據(jù)類(lèi)型、運(yùn)算符和方法重點(diǎn)總結(jié)的文章就介紹到這了,更多相關(guān)Java數(shù)據(jù)類(lèi)型、運(yùn)算符和方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于各種排列組合java算法實(shí)現(xiàn)方法
這篇文章介紹了幾種用JAVA實(shí)現(xiàn)的排列組合算法,有需要的朋友可以參考一下2013-06-06
SpringBoot中9個(gè)內(nèi)置過(guò)濾器用法的完整指南
這篇文章主要為大家詳細(xì)介紹了SpringBoot中9個(gè)內(nèi)置過(guò)濾器用法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一2025-08-08
java 裝飾模式(Decorator Pattern)詳解及實(shí)例代碼
裝飾器模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類(lèi)型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類(lèi)的一個(gè)包裝2016-10-10
SpringBoot使用@Async注解實(shí)現(xiàn)異步調(diào)用
這篇文章主要介紹了SpringBoot使用@Async注解實(shí)現(xiàn)異步調(diào)用,異步調(diào)用是相對(duì)于同步調(diào)用而言的,同步調(diào)用是指程序按預(yù)定順序一步步執(zhí)行,每一步必須等到上一步執(zhí)行完后才能執(zhí)行,異步調(diào)用則無(wú)需等待,程序執(zhí)行完即可執(zhí)行,可以減少程序執(zhí)行時(shí)間,需要的朋友可以參考下2023-10-10
MyBatis實(shí)戰(zhàn)之動(dòng)態(tài)生成SQL詳解
這篇文章主要為大家詳細(xì)介紹了如何使用MyBatis實(shí)現(xiàn)動(dòng)態(tài)生成SQL,可以告別硬編碼,擁抱智能SQL生成,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-07-07
Maven如何手動(dòng)安裝依賴(lài)到本地倉(cāng)庫(kù)
這篇文章主要介紹了Maven如何手動(dòng)安裝依賴(lài)到本地倉(cāng)庫(kù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
Java技巧分享之利用RxJava打造可觀測(cè)數(shù)據(jù)RxLiveData
這篇文章主要來(lái)和大家分享一個(gè)Java技巧,那就是利用RxJava打造可觀測(cè)數(shù)據(jù)RxLiveData,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-06-06

