怎么理解面向?qū)ο螅?/h5>
萬物皆對象〕伲現(xiàn)實(shí)生活中任何物體都屬于一類事務(wù)皱埠,每一個(gè)個(gè)體都是一類事物的實(shí)例熏版。
面向?qū)ο蟮奶匦裕?/p>
- 封裝(把一類事物的屬性和行為抽象為一類,屬性私有氯夷,行為公開),
- 繼承(將一類事物共有的屬性和行為抽象成父類靶擦,子類有自己特有的行為和屬性腮考,實(shí)現(xiàn)代碼的復(fù)用),
- 多態(tài)(實(shí)現(xiàn)接口的重用玄捕,is-a變成has-a踩蔚,解除了父子類繼承的耦合度)
面向?qū)ο蟮脑瓌t:單一指責(zé),開放封閉枚粘,里氏替換馅闽,接口隔離,依賴倒置
重寫和重載的區(qū)別:
重載:
定義:在同一個(gè)類或與它的子類中馍迄,方法名相同而參數(shù)列表不同福也。(參數(shù)列表不同指的是參數(shù)的數(shù)量,類型攀圈,類型的順序這三種至少一種不同)
注意:方法重載與返回值類型和訪問修飾符無關(guān)
重寫:
原因:父類的功能無法滿足子類的需求
前提:必須存在繼承關(guān)系
定義:在繼承關(guān)系中暴凑,子類定義與父類相同的方法
原則:
“二同”:即方法名相同,形參列表相同赘来;
“二小”:子類方法返回值類型應(yīng)比父類方法返回值類型更小或相等现喳,子類方法聲明拋出的異常比父類方法聲明拋出的異常更小或者相等凯傲;
“一大”:子類方法的訪問修飾符應(yīng)比父類方法更大或相等。
注意:1.構(gòu)造方法不能被重寫(構(gòu)造方法必須與當(dāng)前類名相同)
2.private修飾的方法不能被重寫
3.Satic修飾的方法不能被重寫
4.final修飾的方法不能被重寫
重載是編譯時(shí)期的活動嗦篱,重寫是運(yùn)行時(shí)期的活動
線程池和參數(shù):
ThreadPoolExecutor的參數(shù):corePoolSize(核心線程數(shù)量)冰单,maximumPoolSize(線程最大線程數(shù)),workQuene(阻塞隊(duì)列)
如何理解線程安全:
確保接口堆共享變量的操作要具備原子性(同數(shù)據(jù)庫的原子性)灸促,可見性(volatile保證可見性诫欠,當(dāng)多個(gè)線程并發(fā)訪問共享變量時(shí),一個(gè)線程對變量進(jìn)行修改腿宰,其他線程能夠立即看到)呕诉,順序性
實(shí)現(xiàn)原子更新操作
常見的保證Java操作原子性的工具:鎖,同步方法或代碼塊吃度,循環(huán)CAS
使用鎖甩挫,可以保證同一時(shí)間只有一個(gè)線程能拿到鎖。
鎖(synchronized和lock):
Synchronized修飾非靜態(tài)同步方法時(shí)椿每,鎖住的是當(dāng)前實(shí)例伊者;synchronized修飾靜態(tài)同步方法時(shí),鎖住的是類的class對象间护;synchronized修飾靜態(tài)代碼塊時(shí)亦渗,鎖住的是關(guān)鍵字后面括號里的對象
既然鎖和synchronized可以保證原子性,為什么還需要AtomicInteger來保證原子操作
鎖和synchronized需要操作系統(tǒng)判斷誰來獲得鎖汁尺,開銷大法精,而AtomicInteger是通過cpu級的cas操作來保證原子性,開銷小痴突,使用AtomicInteger可以提高性能搂蜓。
a=a+b和a+=b的區(qū)別:
對于同樣類型的a,b來說辽装,執(zhí)行結(jié)果相同帮碰,但a+=b效率高
對于不同類型的a,b來說拾积,+=是運(yùn)算符殉挽,會強(qiáng)制類型轉(zhuǎn)換,不會編譯出錯(cuò)
get和post區(qū)別:
get產(chǎn)生一個(gè)tcp數(shù)據(jù)包拓巧,瀏覽器把http header和data一起發(fā)送出去斯碌,瀏覽器響應(yīng)200;post產(chǎn)生兩個(gè)tcp數(shù)據(jù)包肛度,瀏覽器先發(fā)送http header输拇,服務(wù)器響應(yīng)100 continue,瀏覽器再發(fā)送data贤斜,瀏覽器響應(yīng)200
IoC原理:
反射與工廠模式
反射:通過獲取某個(gè)類的class對象后反向的獲取某個(gè)類或?qū)ο蟮膶傩约胺椒ㄐ畔?br>
反射實(shí)現(xiàn)的原因:每個(gè)類在加載的過程中都會生成一個(gè)代表這個(gè)類的java.lang.Class對象作為方法區(qū)數(shù)據(jù)訪問的入口
Bean生命周期
- 實(shí)例化bean對象(通過構(gòu)造方法或工廠方法)
- 設(shè)置對象屬性(setter策吠,依賴注入)
- 如果Bean實(shí)現(xiàn)了beanNameAware接口逛裤,工廠調(diào)用Bean的setBeanName()方法傳遞Bean的ID
- 如果Bean實(shí)現(xiàn)了BeanFactoryAware接口,工廠調(diào)用setBeanFactory()方法傳入工廠自身
- 將Bean實(shí)例化傳遞給Bean的后置處理器的postProcessBeforeInitialization(Object bean猴抹,String beanName)方法
- 調(diào)用Bean的初始化方法
- 將Bean實(shí)例傳遞給Bean的后置處理器的postProcessAfterInitialization(Object bean,String beanName)方法
- 使用bean
- 容器關(guān)閉前带族,調(diào)用bean的銷毀方法
二叉樹的前序中序后序遍歷:
前序:訪問根節(jié)點(diǎn),遍歷左子樹蟀给,遍歷右子樹
中序:遍歷左子樹蝙砌,訪問根節(jié)點(diǎn),遍歷右子樹
后序:遍歷左子樹跋理,遍歷右子樹择克,訪問根節(jié)點(diǎn)
Collection類:
Collection是對象集合,有兩個(gè)子接口List和Set:
List可以通過下標(biāo)取值前普,值可以重復(fù)肚邢,Set只能通過游標(biāo)取值,值不可以重復(fù)
ArrayList拭卿,Vector骡湖,LinkedList是List的實(shí)現(xiàn)類;
ArrayLsit線程不安全峻厚,Vector線程安全响蕴,這兩個(gè)類由數(shù)組實(shí)現(xiàn);
LinkedList線程不安全惠桃,底層由鏈表實(shí)現(xiàn)
Map是鍵值對集合:
HashTable和HashMap是Map的實(shí)現(xiàn)類
HashTable線程安全浦夷,不能存儲null值
HashMap線程不安全,可以存儲null值
線程安全的集合類:vector辜王,stack军拟,hashtable,enumeration
Tcp三次握手:
- 客戶端創(chuàng)建tcb誓禁,向服務(wù)器發(fā)出連接請求報(bào)文,SYN=1,同時(shí)選擇一個(gè)初始序列號seq=下肾档,tcp客戶端進(jìn)程進(jìn)入了SYN-SENT(同步已發(fā)送狀態(tài))
- Tcp服務(wù)器收到請求報(bào)文后摹恰,如果同意連接,則發(fā)出確認(rèn)報(bào)文怒见,ACK=1,SYN=1,確認(rèn)號是ACK=x+1,同時(shí)也為自己初始一個(gè)序列號seq=y尿扯,tcp服務(wù)器進(jìn)程進(jìn)入了SYN-RCVD(同步收到)狀態(tài)
- Tcp客戶進(jìn)程收到確認(rèn)后殉摔,還要向服務(wù)器給出確認(rèn),確認(rèn)的報(bào)文ACK=1,ACK=y+1,自己的序列號seq=x+1舵变,tcp連接建立酣溃,客戶端進(jìn)入establish(已建立連接)狀態(tài)
- 當(dāng)服務(wù)器收到客戶端的確認(rèn)后也進(jìn)入establish狀態(tài)瘦穆,然后開始通信
棧內(nèi)存和堆內(nèi)存的特點(diǎn)和區(qū)別,Java中怎么樣分配:
棧內(nèi)存中存放基本數(shù)據(jù)的變量和引用變量赊豌,堆內(nèi)存中存放new的對象和數(shù)組
基本數(shù)據(jù)類型棧中的值就是實(shí)際存儲的值扛或,引用類型棧中的值就是指向堆中的地址
對象序列化:
序列化就是把Java對象轉(zhuǎn)換為字節(jié)序列,寫入輸入流中碘饼。Java對象是在jvm中生成的熙兔,如果需要遠(yuǎn)程傳輸或保存在硬盤上,就需要將Java對象轉(zhuǎn)換成可傳輸?shù)奈募鳌?br>
Java中實(shí)現(xiàn)序列化的兩種方式:實(shí)現(xiàn)Serializable接口或Externalizable
使用transient關(guān)鍵字修飾的變量不會被序列化
PV操作
PV操作是對信號量進(jìn)行的操作
信號量S是一個(gè)整數(shù)艾恼,S大于等于零時(shí)代表可供并發(fā)進(jìn)程使用的資源實(shí)體數(shù)住涉,但S小于0時(shí)則表示正在等待使用共享資源的進(jìn)程數(shù)
P操作申請資源:
1. S-1
2. 若S-1后仍>0,則進(jìn)程繼續(xù)執(zhí)行
3. 若S-1后<0,則該進(jìn)程被阻塞后
V操作釋放資源:
- S+1
- 若結(jié)果>0,則進(jìn)程繼續(xù)執(zhí)行
- 若<0,則從該信號的等待隊(duì)列中喚醒一個(gè)等待進(jìn)程钠绍,然后返回原進(jìn)程繼續(xù)執(zhí)行
線程池的優(yōu)點(diǎn):
使用線程池可以減少創(chuàng)建和銷毀線程的次數(shù)舆声,重復(fù)使用線程∥宕龋可以根據(jù)系統(tǒng)的承受能力纳寂,調(diào)整線程池中工作線程的數(shù)量,防止因?yàn)橄倪^多內(nèi)存而導(dǎo)致服務(wù)器崩潰