Java基礎(chǔ)
1、==和equals區(qū)別
基本數(shù)據(jù)類型:只能用==;
引用數(shù)據(jù)類型:都可以使用。equals是Object的方法,它底層調(diào)用的就是==,所以==和equals都是比較地址值,但是如果類中重寫了equals方法,比較的就是具體的值了。eg1: String重寫了(比較具體值),但是StringBuffer沒有(比較地址值)。
2、 成員變量和局部變量區(qū)別
在類中的位置:成員變量出現(xiàn)在類中方法外,局部變量出現(xiàn)在方法內(nèi)部或者方法的形參上。
在內(nèi)存中的位置:成員變量隨對(duì)象的創(chuàng)建而出現(xiàn)在堆中,局部變量隨方法的調(diào)用而出現(xiàn)在棧中。
生命周期:成員變量隨著對(duì)象的創(chuàng)建而創(chuàng)建,隨著對(duì)象的銷毀而銷毀;局部變量是隨著方法的調(diào)用而產(chǎn)生,隨著方法的調(diào)用的結(jié)束而銷毀。
初始值:成員變量有默認(rèn)初始值(eg:int類型的成員變量是0),局部變量沒有默認(rèn)值,必須手動(dòng)賦值。
3、靜態(tài)變量和成員變量的區(qū)別
靜態(tài)變量隨著類的加載而出現(xiàn)在方法區(qū)的靜態(tài)區(qū)中,成員變量隨著對(duì)象的創(chuàng)建而出現(xiàn)在堆中。
所屬不同:靜態(tài)變量屬于類(.class字節(jié)碼文件),成員變量屬于對(duì)象(new出來的東西)。
在內(nèi)存中的位置:靜態(tài)變量位于方法區(qū)的靜態(tài)區(qū),成員變量位于堆內(nèi)存。
生命周期:靜態(tài)變量隨類的加載而加載,隨類的消失而消失;成員變量隨對(duì)象的創(chuàng)建而創(chuàng)建,隨對(duì)象的銷毀而銷毀。
調(diào)用方式:靜態(tài)變量可以類名調(diào)用,也可以通過對(duì)象調(diào)用;成員只能通過對(duì)象調(diào)用。
4、IO(input output)和NIO(new IO或non-block IO)區(qū)別
IO:面向流,單向的,阻塞式(本線程在讀寫的時(shí)候,程序阻塞),一個(gè)線程操作一個(gè)連接;
NIO:面向塊(緩沖區(qū)),雙向的,非阻塞式(本線程在讀寫的時(shí)候,程序還可以繼續(xù)干別的事),一個(gè)線程可以操作多個(gè)連接(使用選擇器來管理多個(gè)通道),在網(wǎng)絡(luò)通信時(shí)最常用。
5、函數(shù)回調(diào)
回調(diào)的思想是:
類A的a()方法調(diào)用類B的b()方法
類B的b()方法執(zhí)行完畢主動(dòng)調(diào)用類A的callback()方法
6、線程的生命周期
7、面向?qū)ο蠛兔嫦蜻^程的區(qū)別
面向過程 :面向過程性能比面向?qū)ο蟾摺?因?yàn)轭愓{(diào)用時(shí)需要實(shí)例化,開銷比較大,比較消耗資源,所以當(dāng)性能是最重要的考量因素的時(shí)候,比如單片機(jī)、嵌入式開發(fā)、Linux/Unix等一般采用面向過程開發(fā)。但是,面向過程沒有面向?qū)ο笠拙S護(hù)、易復(fù)用、易擴(kuò)展。
面向?qū)ο?:面向?qū)ο笠拙S護(hù)、易復(fù)用、易擴(kuò)展。 因?yàn)槊嫦驅(qū)ο笥蟹庋b、繼承、多態(tài)性的特性,所以可以設(shè)計(jì)出低耦合的系統(tǒng),使系統(tǒng)更加靈活、更加易于維護(hù)。但是,面向?qū)ο笮阅鼙让嫦蜻^程低。
8、在java中定義一個(gè)不做事且沒有參數(shù)的構(gòu)造方法的作用
Java 程序在執(zhí)行子類的構(gòu)造方法之前,如果沒有用 super() 來調(diào)用父類特定的構(gòu)造方法,則會(huì)調(diào)用父類中“沒有參數(shù)的構(gòu)造方法”。因此,如果父類中只定義了有參數(shù)的構(gòu)造方法,而在子類的構(gòu)造方法中又沒有用 super() 來調(diào)用父類中特定的構(gòu)造方法,則編譯時(shí)將發(fā)生錯(cuò)誤,因?yàn)?Java 程序在父類中找不到?jīng)]有參數(shù)的構(gòu)造方法可供執(zhí)行。解決辦法是在父類里加上一個(gè)不做事且沒有參數(shù)的構(gòu)造方法。
9、為什么要用BigDecimal?
浮點(diǎn)數(shù)類型的數(shù)據(jù)在操作時(shí)會(huì)丟失精度,產(chǎn)生誤差。
10、&和&& 、|和||
&和&&:
共同點(diǎn):兩者都可做邏輯運(yùn)算符。它們都表示運(yùn)算符的兩邊都是 true 時(shí),結(jié)果為 true;
不同點(diǎn): &也是位運(yùn)算符。& 表示在運(yùn)算時(shí)兩邊都會(huì)計(jì)算,然后再判斷;&&表示先運(yùn)算符號(hào)左邊的東西,然后判斷是否為 true,是 true 就繼續(xù)運(yùn)算右邊的然后判斷并輸出,是 false 就停下來直接輸出不會(huì)再運(yùn)行后面的東西。
|和||:
共同點(diǎn):兩者都可做邏輯運(yùn)算符。它們都表示運(yùn)算符的兩邊任意一邊為 true,結(jié)果為 true,兩邊都不是 true,結(jié)果就為 false;
不同點(diǎn):|也是位運(yùn)算符。| 表示兩邊都會(huì)運(yùn)算,然后再判斷結(jié)果;|| 表示先運(yùn)算符號(hào)左邊的東西,然后判斷是否為 true,是 true 就停下來直接輸出不會(huì)再運(yùn)行后面的東西,是 false 就繼續(xù)運(yùn)算右邊的然后判斷并輸出。
11、Object類中常見的方法
Object類是一個(gè)特殊的類,它是所有類的父類。11個(gè),3個(gè)wait
getClass(); clone();toString();notify();notifyAll();wait();finalize();
hashCode();equals();
12、你重寫過hashcode和equals么,要注意什么?
要重寫equals方法就必須要重寫hashcode方法。
原因:使用hashcode方法提前校驗(yàn),可以避免每一次比對(duì)都調(diào)用equals方法,提高效率。
避免出現(xiàn)equals相等,而hashcode不相等的情況。
https://blog.csdn.net/Mountain_YS/article/details/82151451
自反性、對(duì)稱性、傳遞性、一致性
http://www.itdecent.cn/p/86c86e9557f5
13、代碼中大量的if/else,有什么優(yōu)化方案?
①策略模式,
②枚舉
③Optional,jdk8的新特性,用于非空判斷。
14、類實(shí)例化順序
先靜態(tài)、先父后子;
先靜態(tài):父靜態(tài) > 子靜態(tài);
優(yōu)先級(jí):父類 > 子類 靜態(tài)代碼塊 > 非靜態(tài)代碼塊 > 構(gòu)造函數(shù)
15、多態(tài)
概念:同一消息可以根據(jù)發(fā)送對(duì)象的不同采用多種不同的行為方式。
作用:
封裝可以隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼模塊化;
繼承可以擴(kuò)展已存在的代碼模塊(類);它們的目的都是為了代碼重用。
而多態(tài)除了代碼的復(fù)用性外,還可以解決項(xiàng)目中緊偶合的問題,提高程序的可擴(kuò)展性.。
實(shí)現(xiàn)方式:接口實(shí)現(xiàn)、抽象類、繼承父類進(jìn)行方法重寫、同一個(gè)類中進(jìn)行方法重載。
16、Jdk8的新特性
1、lambada表達(dá)式
2、Stream流來操作集合,只關(guān)注結(jié)果,不關(guān)心過程。
3、Optional類,用作空判斷,解決空指針異常。
17、try catch finally,try里有return,finally還執(zhí)行么?
執(zhí)行,并且finally的執(zhí)行早于try里面的return。
結(jié)論:
不管有木有出現(xiàn)異常,finally塊中代碼都會(huì)執(zhí)行;
當(dāng)try和catch中有return時(shí),finally仍然會(huì)執(zhí)行;
finally是在return后面的表達(dá)式運(yùn)算后執(zhí)行的(此時(shí)并沒有返回運(yùn)算后的值,而是先把要返回的值保存起來,管finally中的代碼怎么樣,返回的值都不會(huì)改變,任然是之前保存的值),所以函數(shù)返回值是在finally執(zhí)行前確定的;
finally中最好不要包含return,否則程序會(huì)提前退出,返回值不是try或catch中保存的返回值。
18、java反射的作用與原理
① 定義:反射機(jī)制是在運(yùn)行時(shí),對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法。在java中,只要給定類的名字,就可以通過反射機(jī)制來獲得類的所有信息。
這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為Java語言的反射機(jī)制。
② 哪里會(huì)用到反射機(jī)制?
Class.forName('com.mysql.jdbc.Driver.class');//加載MySQL的驅(qū)動(dòng)類
如hibernate,struts等框架使用反射實(shí)現(xiàn)的
③ 實(shí)現(xiàn)
取Class對(duì)象,有4中方法: 1)Class.forName(“類的路徑”); 2)類名.class
3)對(duì)象名.getClass() 4)基本類型的包裝類,可以調(diào)用包裝類的Type屬性來獲得該包裝類的Class對(duì)象
④ 反射機(jī)制的優(yōu)缺點(diǎn):
優(yōu)點(diǎn): 1)能夠運(yùn)行時(shí)動(dòng)態(tài)獲取類的實(shí)例,提高靈活性; 2)與動(dòng)態(tài)編譯結(jié)合 缺點(diǎn): 1)使用反射性能較低,需要解析字節(jié)碼,將內(nèi)存中的對(duì)象進(jìn)行解析。
解決方案: 1、通過setAccessible(true) 關(guān)閉JDK的安全檢查來提升反射速度; 2、多次創(chuàng)建一個(gè)類的實(shí)例時(shí),有緩存會(huì)快很多 3、 ReflectASM工具類,通過字節(jié)碼生成的方式加快反射速度 2)相對(duì)不安全,破壞了封裝性(因?yàn)橥ㄟ^反射可以獲得私有方法和屬性)