前提
臨近秋招览绿,本博文主要整理最近各大企業(yè)面經(jīng)里的那些Java基礎(chǔ)面試題慌洪,并通過(guò)對(duì)比整合給出一份參考答案顶燕。并無(wú)按照特定順序,僅僅是提供了復(fù)習(xí)了之后測(cè)試掌握冈爹。文章的答案不一定絕對(duì)正確涌攻,如果有錯(cuò)誤的地方還望指出!
1频伤、equals 和 == 的區(qū)別恳谎?
最直接,我們點(diǎn)開(kāi)equals的源碼
publicbooleanequals(Object obj){return(this== obj);? ? }
我們可以發(fā)現(xiàn)equals也是用的==?來(lái)比較的憋肖,但是為什么還要說(shuō)它們之間的區(qū)別呢因痛?因?yàn)閑quals的方法可以根據(jù)我們的需要重寫(xiě)。==如果比較的是兩個(gè)值類(lèi)型的話岸更,那么就是比較它們之間是否相等鸵膏,如果是引用類(lèi)型的話,那么就是比較它們之間的地址了怎炊。
2谭企、為什么重寫(xiě)equals一定要重寫(xiě)hashcode?
默認(rèn)的hashcode方法是根據(jù)對(duì)象的內(nèi)存地址經(jīng)哈希算法得到的评肆,如果不重寫(xiě)的話债查,那么在兩個(gè)相同的對(duì)象在使用equals方法的時(shí)候就有可能不同。這在我們的map中的話糟港,如果以對(duì)象為key的話,就會(huì)導(dǎo)致我們邏輯上的key相同卻有著不同的值院仿!
3秸抚、Integer與int的==比較是怎么樣的速和?
首先看一下下面的比較
publicstaticvoidmain(String[] args){? ? ? ? Integer a =3;intb =3;? ? ? ? Integer c = Integer.valueOf(3);? ? ? ? Integer d =newInteger(3);? ? ? ? System.out.println(a == b);//輸出trueSystem.out.println(b == c);//輸出trueSystem.out.println(b == d);//輸出trueSystem.out.println(a == c);//輸出trueSystem.out.println(c == d);//輸出false}
我們的Integer在int比較的時(shí)候,會(huì)自動(dòng)拆箱剥汤,再做值比較颠放,所以返回true;
Integer之間的比較的話吭敢,除了new Integer()之外碰凶,其他比較都是同一段地址,而new的新對(duì)象則不是鹿驼,所以返回的false欲低。
4、接口和抽象類(lèi)的區(qū)別畜晰?
接口中的所有方法都是抽象的砾莱,而抽象類(lèi)可以有抽象的和非抽象的
類(lèi)可以實(shí)現(xiàn)很多個(gè)接口,但只能繼承一個(gè)抽象類(lèi)
類(lèi)可以不實(shí)現(xiàn)抽象類(lèi)和接口聲明的所有方法凄鼻,但是該類(lèi)必須聲明成抽象的
接口的成員方法默認(rèn)是public腊瑟,而抽象類(lèi)的成員可以是private,protected块蚌,public
JDK1.8開(kāi)始闰非,接口中可以包含default方法(可以進(jìn)行實(shí)現(xiàn)),但是抽象類(lèi)沒(méi)有峭范。
5财松、Java的異常處理機(jī)制,Error和Exception的區(qū)別虎敦?
二者都有共同的父類(lèi)——Throwable游岳!
Error:表示程序發(fā)生錯(cuò)誤,是程序無(wú)法處理的其徙,不可恢復(fù)的胚迫,如OutOfMemoryError
Exception: 表示程序可處理的異常,又分為CheckedException(受檢異常)唾那、UncheckedException(非受檢異常)访锻,受檢異常發(fā)生在編譯期,必須要使用try...catch 或者 throws捕獲或者拋出異常闹获,否則編譯不通過(guò)(如IOException之類(lèi)期犬,多線程之類(lèi)的);非受檢異常發(fā)生在運(yùn)行期避诽,具有不確定性龟虎,主要由程序的邏輯問(wèn)題引起的,在程序設(shè)計(jì)的時(shí)候要認(rèn)真考慮沙庐,盡量處理異常鲤妥。(如NullPointException 參數(shù)值為null(空指針)佳吞,IndexOutOfBoundsException 下標(biāo)參數(shù)值越界)
6、++和--操作是否為原子操作棉安,為什么底扳?
不是原子性操作。原子性的意思是操作不可分割贡耽,但是我們的++和--確實(shí)可以分為三個(gè)步驟(讀寫(xiě)改)
從棧讀取我們的值
進(jìn)行加1的操作
將我們的值壓回棧
所以再多線程情況下衷模,就會(huì)導(dǎo)致我們的自增或者自減不準(zhǔn)確!
7蒲赂、面向?qū)ο蟮娜筇匦允鞘裁蹿逡保空?qǐng)簡(jiǎn)單介紹一下!
封裝凳宙、繼承熙揍、多態(tài)
封裝:?所謂封裝,也就是把客觀事物封裝成抽象的類(lèi)氏涩,并且類(lèi)可以把自己的數(shù)據(jù)和方法只讓可信的類(lèi)或者對(duì)象操作届囚,對(duì)不可信的進(jìn)行信息隱藏。封裝是面向?qū)ο蟮奶卣髦皇羌猓菍?duì)象和類(lèi)概念的主要特性意系。 簡(jiǎn)單的說(shuō),一個(gè)類(lèi)就是一個(gè)封裝了數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼的邏輯實(shí)體饺汹。在一個(gè)對(duì)象內(nèi)部蛔添,某些代碼或某些數(shù)據(jù)可以是私有的,不能被外界訪問(wèn)兜辞。通過(guò)這種方式迎瞧,對(duì)象對(duì)內(nèi)部數(shù)據(jù)提供了不同級(jí)別的保護(hù),以防止程序中無(wú)關(guān)的部分意外的改變或錯(cuò)誤的使用了對(duì)象的私有部分逸吵。
繼承:?所謂繼承是指可以讓某個(gè)類(lèi)型的對(duì)象獲得另一個(gè)類(lèi)型的對(duì)象的屬性的方法凶硅。它支持按級(jí)分類(lèi)的概念。繼承是指這樣一種能力:它可以使用現(xiàn)有類(lèi)的所有功能扫皱,并在無(wú)需重新編寫(xiě)原來(lái)的類(lèi)的情況下對(duì)這些功能進(jìn)行擴(kuò)展足绅。 通過(guò)繼承創(chuàng)建的新類(lèi)稱(chēng)為“子類(lèi)”或“派生類(lèi)”,被繼承的類(lèi)稱(chēng)為“基類(lèi)”韩脑、“父類(lèi)”或“超類(lèi)”氢妈。繼承的過(guò)程,就是從一般到特殊的過(guò)程段多。要實(shí)現(xiàn)繼承首量,可以通過(guò)“繼承”(Inheritance)和“組合”(Composition)來(lái)實(shí)現(xiàn)。繼承概念的實(shí)現(xiàn)方式有二類(lèi):實(shí)現(xiàn)繼承與接口繼承。實(shí)現(xiàn)繼承是指直接使用基類(lèi)的屬性和方法而無(wú)需額外編碼的能力加缘;接口繼承是指僅使用屬性和方法的名稱(chēng)粥航、但是子類(lèi)必須提供實(shí)現(xiàn)的能力;
多態(tài):?所謂多態(tài)就是指一個(gè)類(lèi)實(shí)例的相同方法在不同情形有不同表現(xiàn)形式生百。多態(tài)機(jī)制使具有不同內(nèi)部結(jié)構(gòu)的對(duì)象可以共享相同的外部接口。這意味著柄延,雖然針對(duì)不同對(duì)象的具體操作不同蚀浆,但通過(guò)一個(gè)公共的類(lèi),它們(那些操作)可以通過(guò)相同的方式予以調(diào)用搜吧。
8市俊、Java中是如何具體實(shí)現(xiàn)多態(tài)的?
9滤奈、面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別摆昧?
面向?qū)ο蠓椒ㄖ校褦?shù)據(jù)和數(shù)據(jù)操作放在一起蜒程,組成對(duì)象绅你;對(duì)同類(lèi)的對(duì)象抽 象出其共性組成類(lèi);類(lèi)通過(guò)簡(jiǎn)單的接口與外界發(fā)生聯(lián)系昭躺,對(duì)象和對(duì)象之間通過(guò)消 息進(jìn)行通信忌锯。而面向過(guò)程方法是以過(guò)程為中心的開(kāi)發(fā)方法,它自頂向下順序進(jìn)行领炫, 程序結(jié)構(gòu)按照功能劃分成若干個(gè)基本模塊偶垮,這些模塊形成樹(shù)狀結(jié)構(gòu)。
(過(guò)程)優(yōu)點(diǎn):性能比面向?qū)ο蟾叩酆椋驗(yàn)轭?lèi)調(diào)用時(shí)需要實(shí)例化似舵,開(kāi)銷(xiāo)比較大,比較消耗源;比如嵌入式開(kāi)發(fā)葱峡、Linux/Unix等一般采用面向過(guò)程開(kāi)發(fā)砚哗,性能是最重要的因素。缺點(diǎn):沒(méi)有面向?qū)ο笠拙S護(hù)族沃、易復(fù)用频祝、易擴(kuò)展。
(對(duì)象)優(yōu)點(diǎn):易維護(hù)脆淹、易復(fù)用常空、易擴(kuò)展,由于面向?qū)ο笥蟹庋b盖溺、繼承漓糙、多態(tài)性的特性,可以設(shè)計(jì)出低耦合的系統(tǒng)烘嘱。缺點(diǎn):性能比面向過(guò)程低昆禽。
10蝗蛙、String/StringBuffer/StringBuilder的區(qū)別?
String:不可變字符序列
StringBuffer:可變字符序列醉鳖、效率低捡硅、線程安全(使用Synchronized修飾)
StringBuilder:可變字符序列、效率高盗棵、線程不安全
字符串直接相加本質(zhì)也是轉(zhuǎn)換成StringBuilder調(diào)用append壮韭,但是因?yàn)闀?huì)產(chǎn)生大量的StringBuilder對(duì)象所以不如直接new一個(gè)StringBuilder來(lái)用效率高!
11纹因、什么是面向函數(shù)式編程喷屋?
12、談?wù)剆tatic瞭恰,final關(guān)鍵字屯曹?
13、談?wù)剉olatile惊畏、synchronized關(guān)鍵字恶耽?
談到這兩個(gè)關(guān)鍵字需要了解到JMM和內(nèi)存模型,可以看看我的另一篇【https://mp.weixin.qq.com/s/le8My8lmRMV_8rn7BTmKPA】
14颜启、談?wù)勆羁截惡蜏\拷貝驳棱?
15、Java線程和系統(tǒng)線程的區(qū)別农曲?
16社搅、開(kāi)多個(gè)Java進(jìn)程和多個(gè)線程的區(qū)別?
17乳规、什么是同步與異步形葬,阻塞與非阻塞?
18暮的、多進(jìn)程之間如何進(jìn)行通信笙以?
待更新