<pre cid="n0" mdtype="meta_block" contenteditable="true" class="md-meta-block md-end-block md-focus" style="box-sizing: border-box; overflow-x: hidden; overflow-y: auto; font-family: var(--monospace); font-size: 0.8rem; white-space: pre-wrap; line-height: 1.71429em; min-height: 1.875rem; background: transparent; display: block; width: inherit; margin-top: 1em; color: rgb(85, 85, 85); border: 0px; margin-left: 1em; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">typora-copy-images-to: assets
typora-root-url: assets
</pre>
Java中是如何實現(xiàn)跨平臺
Java源文件會編譯成.class文件(半編譯)遭贸,這種字節(jié)碼文件在JVM上運行,JVM將這些文件“翻譯”給不同平臺(半解釋)
Java中數(shù)據(jù)類型
基本數(shù)據(jù)類型:4類8種(byte,short,int,long,float,doule,char,boolean)
引用數(shù)據(jù)類型:數(shù)組,類来涨,接口
方法的重寫(運行時多態(tài))和重載(編譯時多態(tài))
同一個類中,同名不同參的方法奥喻,即為重載
子類中岳锁,與父類方法同名,同參卒暂,同返回值類型,即為重寫
什么GC娄帖?
GC是垃圾回收機(jī)制也祠,在Java中,沒有引用的對象近速,被視為垃圾诈嘿,JVM會自動調(diào)用該對象的finalize方法釋放內(nèi)存,該過程是自動的削葱,所有又稱為自動垃圾回收機(jī)制
舉例:
<pre class="md-fences md-end-block" lang="java" contenteditable="false" cid="n26" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9rem; white-space: pre; line-height: 1.71429em; text-align: left; break-inside: avoid; display: block; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(218, 218, 218); position: relative !important; margin-bottom: 3em; padding-left: 1ch; padding-right: 1ch; margin-left: 2em; width: inherit; color: rgb(31, 9, 9); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">User user = new User();
user = null; // user 沒有引用了奖亚,變成了垃圾,等待回收</pre>
final,finally,finalize
final修飾屬性即為常量析砸,不能修改昔字,final修飾方法不能重寫,final修飾類不能集成
finally一般與異常處理相關(guān)首繁,用來執(zhí)行一定要運行的代碼李滴,例如回收資源,關(guān)閉流等
finalize與GC相關(guān)
接口抽象類區(qū)別
兩者都不能被實例化
接口沒有構(gòu)造器
接口中都是抽象方法和常量
常用的集合有哪些蛮瞄,談?wù)剬λ鼈兊睦斫?
[圖片上傳失敗...(image-12c41d-1586349569484)]
Collection 接口:單列集合所坯,有兩個子接口 1.List 接口: 有三個實現(xiàn)類 LinkedList:基于鏈表實現(xiàn),每一個元素存儲本身內(nèi)存地址的同時還存儲 下一個元素的地址挂捅。鏈表增刪快芹助,查找慢; ArrayList:基于數(shù)組闲先;每次增刪都要創(chuàng)建新的數(shù)組状土,但數(shù)組有索引。數(shù)組 增刪慢伺糠,查找快 Vector:基于數(shù)組蒙谓,線程安全的,效率低 2.Set 接口: 有兩個實現(xiàn)類 HashSet:存儲的元素?zé)o序训桶,不可重復(fù)累驮,底層是哈希表 LinkedHashSet:存儲的元素有序酣倾,不可重復(fù),底層是哈希表和鏈表的結(jié)合
Map 接口:雙列集合 有三個實現(xiàn)類(HashMap谤专,HashTable躁锡,TreeMap) HashMap:非線程安全,高效置侍,支持 null映之; LinkedHashMap:是 HashMap 的一個子類,保存了記錄的插入順序 HashTable:線程安全蜡坊,低效杠输,不支持 null; TreeMap: 能夠把它保存的記錄根據(jù)鍵排序秕衙,默認(rèn)是鍵值的升序排序
IO 流
字節(jié)流和字符流的區(qū)別 1.字節(jié)流讀取的時候蠢甲,讀到一個字節(jié)就返回一個字節(jié); 字符流使用了字節(jié)流讀到一個 或多個字節(jié)(中文對應(yīng)的字節(jié)數(shù)是兩個灾梦,在 UTF-8 碼表中是 3 個字節(jié))時峡钓。先去查指定的 編碼表妓笙,將查到的字符返回若河。
2.字節(jié)流可以處理所有類型數(shù)據(jù),如:圖片寞宫,MP3萧福,AVI 視頻文件,而字符流只能處理 字符數(shù)據(jù)辈赋。只要是處理純文本數(shù)據(jù)鲫忍,就要優(yōu)先考慮使用字符流,除此之外都用字節(jié)流钥屈。
一些特別的流類型 轉(zhuǎn)換流悟民,轉(zhuǎn)換流只有字節(jié)流轉(zhuǎn)換為字符流,因為字符流使用起來更方便篷就,我們只會向更方 便使用的方向轉(zhuǎn)化射亏。如:InputStreamReader 與 OutputStreamWriter。
緩沖流竭业,有關(guān)鍵字 Buffered智润,也是一種處理流,為其包裝的流增加了緩存功能未辆,提高了輸 入輸出的效率窟绷,增加緩沖功能后需要使用 flush()才能將緩沖區(qū)中內(nèi)容寫入到實際的物理節(jié) 點。但是咐柜,在現(xiàn)在版本的 Java 中兼蜈,只需記得關(guān)閉輸出流(調(diào)用 close()方法)攘残,就會自動執(zhí) 行輸出流的 flush()方法,可以保證將緩沖區(qū)中內(nèi)容寫入饭尝。
對象流肯腕,有關(guān)鍵字 Object,主要用于將目標(biāo)對象保存到磁盤中或允許在網(wǎng)絡(luò)中直接傳輸對 象時使用(對象序列化)钥平。
推回輸入流实撒,有關(guān)鍵字 PushBack,當(dāng)程序調(diào)用推回輸入流的 unread()方法時涉瘾,系統(tǒng)回把指 定數(shù)組內(nèi)容的內(nèi)容推回到一個推回緩沖區(qū)中知态,在調(diào)用 read()方法讀入內(nèi)容時,就先從推回 緩沖區(qū)中讀取立叛,直到讀完推回緩沖區(qū)中內(nèi)容后才會從原輸入流中讀取
參考資料: https://www.kancloud.cn/yinzhenn/java/617409
簡述下你了解的設(shè)計模式
(1) 設(shè)計模式的分類設(shè)計模式的六大原則 ? 開閉原則(Open Closed Principle负敏,OCP) ? 里氏代換原則(Liskov Substitution Principle,LSP) ? 依賴倒轉(zhuǎn)原則(Dependency Inversion Principle秘蛇,DIP) ? 接口隔離原則(Interface Segregation Principle其做,ISP) ? 合成/聚合復(fù)用原則(Composite/Aggregate Reuse Principle,CARP) ? 最小知識原則(Principle of Least Knowledge赁还,PLK妖泄,也叫迪米特法則) 總體來說設(shè)計模式分為三大類: 創(chuàng)建型模式,共五種:工廠方法模式艘策、抽象工廠模式蹈胡、單例模式、建造者模式朋蔫、原型模 式罚渐。 結(jié)構(gòu)型模式,共七種:適配器模式驯妄、裝飾器模式荷并、代理模式、外觀模式青扔、橋接模式源织、組合 模式、享元模式赎懦。 行為型模式雀鹃,共十一種:策略模式、模板方法模式励两、觀察者模式黎茎、迭代子模式、責(zé)任鏈模 式当悔、命令模式傅瞻、備忘錄模式踢代、狀態(tài)模式、訪問者模式嗅骄、中介者模式胳挎、解釋器模式。
(2) 單例模式
1溺森、單例類只能有一個實例慕爬。2、單例類必須自己創(chuàng)建自己的唯一實例屏积。 3医窿、單例類必須給所有其他對象提供這一實例。
[圖片上傳失敗...(image-9740b9-1586349569484)]
(3) 工廠模式 意圖:定義一個創(chuàng)建對象的接口炊林,讓其子類自己決定實例化哪一個工廠類姥卢,工廠模式使其創(chuàng)建過程延遲到子類進(jìn)行。主要解決:主要解決接口選擇的問題渣聚。
何時使用:我們明確地計劃不同條件下創(chuàng)建不同實例時独榴。
如何解決:讓其子類實現(xiàn)工廠接口,返回的也是一個抽象的產(chǎn)品奕枝。
關(guān)鍵代碼:創(chuàng)建過程在其子類執(zhí)行
工廠模式具體詳見鏈接: http://blog.csdn.net/jason0539/article/details/23020989
Get 和 Post 的區(qū)別棺榔?
Get 請求方式:地址欄里會顯示我們提交的數(shù)據(jù)(不安全),并且地址欄中支持提交少量 數(shù)據(jù)倍权,請求的數(shù)據(jù)存在請求行中 Post 請求方式:地址欄里不顯示我們提交的數(shù)據(jù)信息(相對安全)掷豺,可以提交大量數(shù)據(jù)捞烟, 請求的數(shù)據(jù)存在請求正文中
cookie 和 session 的區(qū)別薄声?
共同點:cookie 和 session 都是用來跟蹤瀏覽器用戶身份的會話方式 區(qū)別:cookie 數(shù)據(jù)保存在客戶端,保存數(shù)據(jù)不安全且存儲數(shù)據(jù)量有限题画; session 數(shù)據(jù)保存在服務(wù)器端默辨,保存數(shù)據(jù)安全且存儲數(shù)據(jù)量大,session 是基于 cookie 進(jìn)行 信息處理的 二者的詳細(xì)流程請訪問:http://blog.csdn.net/axin66ok/article/details/6175522
什么是 ajax苍息,為什么要用 ajax(淺談你對 ajax 的認(rèn)識)缩幸,ajax 的最大特點?
Ajax 是一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的的網(wǎng)頁開發(fā)技術(shù)竞思;Asynchronous JavaScript and XML”的縮寫 Ajax 的優(yōu)勢:
通過異步模式表谊,提升了用戶體驗
優(yōu)化了瀏覽器和服務(wù)器之間的傳輸,減少不必要的數(shù)據(jù)往返盖喷,減少了帶寬占用
Ajax 引擎在客戶端運行爆办,承擔(dān)了一部分本來由服務(wù)器承擔(dān)的工作,從而減少了大用戶量 下的服務(wù)器負(fù)載课梳。 Ajax 的最大特點: 可以實現(xiàn)局部刷新距辆,在不更新整個頁面的前提下維護(hù)數(shù)據(jù)余佃,提升用戶體驗度。 注意:ajax 在實際項目開發(fā)中使用率非常高(牢固掌握) 針對 ajax 的詳細(xì)描述:http://www.jb51.net/article/93258.htm
Cookie 和 Session 以及 Servlet 的生命周期
Cookie:
cookie 的生命周期是累計的跨算,從創(chuàng)建時爆土,就開始計時,20 分鐘后诸蚕,cookie 生命 周期結(jié)束步势。
Session:
session 的生命周期是間隔的,從創(chuàng)建時背犯,開始計時如在 20 分鐘立润,沒有訪問 session,那么 session 生命周期被銷毀 但是媳板,如果在 20 分鐘內(nèi)(如在第 19 分鐘時)訪問過 session桑腮,那么,將重新計算 session 的生命周期 注意:關(guān)機(jī)會造成 session 生命周期的結(jié)束蛉幸,但是對 cookie 沒有影響
Servlet:
init():在 Servlet 的生命周期中破讨,僅執(zhí)行一次 init()方法。它是在服務(wù)器裝入 Servlet 時執(zhí) 行的奕纫,負(fù)責(zé)初始化 Servlet 對象提陶。可以配置服務(wù)器匹层,以在啟動服務(wù)器或客戶機(jī)首次訪問 Servlet 時裝入 Servlet隙笆。無論有多少客戶機(jī)訪問 Servlet,都不會重復(fù)執(zhí)行 init()升筏。
service():它是 Servlet 的核心撑柔,負(fù)責(zé)響應(yīng)客戶的請求。每當(dāng)一個客戶請求一個 HttpServlet 對象您访,該對象的 Service()方法就要調(diào)用铅忿,而且傳遞給這個方法一個“請求” (ServletRequest)對象和一個“響應(yīng)”(ServletResponse)對象作為參數(shù)。在 HttpServlet 中 已存在 Service()方法灵汪。默認(rèn)的服務(wù)功能是調(diào)用與 HTTP 請求的方法相應(yīng)的 do 功能檀训。
destroy(): 僅執(zhí)行一次,在服務(wù)器端停止且卸載 Servlet 時執(zhí)行該方法享言。當(dāng) Servlet 對象 退出生命周期時峻凫,負(fù)責(zé)釋放占用的資源。一個 Servlet 在運行 service()方法時可能會產(chǎn)生其 他的線程览露,因此需要確認(rèn)在調(diào)用 destroy()方法時荧琼,這些線程已經(jīng)終止或完成
請求轉(zhuǎn)發(fā)和請求重定向區(qū)別
請求轉(zhuǎn)發(fā)自始至終只有一個請求,請求重定向有兩個
請求轉(zhuǎn)發(fā)只能轉(zhuǎn)發(fā)站內(nèi)請求,請求重定向可以站外
請求轉(zhuǎn)發(fā)不能看到最終轉(zhuǎn)發(fā)資源的地址铭腕,請求重定向可以
String,StringBuffer,StringBuilder區(qū)別
String代表字符串常量不可改變银择,每一次修改都創(chuàng)建新的字符串對象
StringBuffer,StringBuilder都代表字符串變量,對其修改不產(chǎn)生新對象累舷,前者是線程安全的(多線程推薦使用)浩考,后者不線程安全(單線程推薦使用,效率高于StringBuffer)
(注意:以下線程問題多為一些互聯(lián)公司才會涉及被盈,在傳統(tǒng)的web開發(fā)中不算多見析孽,但很多公司會嘗試提問,以顯示逼格只怎,大家把這部分看看即可袜瞬,能聊上幾句,不要顯得沒有概念)
參考資料: https://www.kancloud.cn/yinzhenn/java/621055
線程和進(jìn)程的區(qū)別身堡?
進(jìn)程:具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動邓尤,是操作系統(tǒng)進(jìn) 行資源分配和調(diào)度的一個獨立單位
線程:是進(jìn)程的一個實體,是 cpu 調(diào)度和分派的基本單位贴谎,是比進(jìn)程更小的可以獨立 運行的基本單位
特點:線程的劃分尺度小于進(jìn)程汞扎,這使多線程程序擁有高并發(fā)性
進(jìn)程在運行時各自內(nèi)存單元相互獨立,線程之間內(nèi)存共享擅这,這使多線程編程可以 擁有更好的性能和用戶體驗
注意:多線程編程對于其它程序是不友好的澈魄,占據(jù)大量 cpu 資源
啟動一個線程是調(diào)用 run()方法還是 start()方法?
啟動一個線程是調(diào)用 start()方法仲翎,使線程所代表的虛擬處理機(jī)處于可運行狀態(tài)痹扇,這意 味著它可以由 JVM 調(diào)度并執(zhí)行,這并不意味著線程就會立即運行溯香。 run()方法是線程啟動后要進(jìn)行回調(diào)(callback)的方法
編寫多線程程序的幾種實現(xiàn)方式
(1)通過繼承 Thread 類
(2)通過實現(xiàn) Runnable 接口(推薦使用鲫构,因為 Java 中是單繼承,一個類只有一個父類逐哈, 若繼承了 Thread 類芬迄,就無法在繼承其它類问顷,顯然實現(xiàn) Runnable 接口更為靈活
(3)通過實現(xiàn) Callable 接口(Java 5 之后)
解決多線程安全問題的幾種方式?
(1)同步代碼塊: 在代碼塊聲明上 加上 synchronized
<pre class="md-fences md-end-block" lang="" contenteditable="false" cid="n232" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9rem; white-space: pre; line-height: 1.71429em; text-align: left; break-inside: avoid; display: block; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(218, 218, 218); position: relative !important; margin-bottom: 3em; padding-left: 1ch; padding-right: 1ch; margin-left: 2em; width: inherit; color: rgb(31, 9, 9); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
synchronized (鎖對象) {
可能會產(chǎn)生線程安全問題的代碼
} </pre>
同步代碼塊中的鎖對象可以是任意的對象昂秃;但多個線程時,要使用同一個鎖對象才能 夠保證線程安全杜窄。 (2)同步方法: 在方法聲明上加上 synchronized
<pre class="md-fences md-end-block" lang="java" contenteditable="false" cid="n236" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9rem; white-space: pre; line-height: 1.71429em; text-align: left; break-inside: avoid; display: block; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(218, 218, 218); position: relative !important; margin-bottom: 3em; padding-left: 1ch; padding-right: 1ch; margin-left: 2em; width: inherit; color: rgb(31, 9, 9); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
public synchronized void method(){
可能會產(chǎn)生線程安全問題的代碼
} </pre>
同步方法中的鎖對象是 this 靜態(tài)同步方法: 在方法聲明上加上 static synchronized 靜態(tài)同步方法中的鎖對象是 類名.class (3)同步鎖 Lock 接口提供了與 synchronized 關(guān)鍵字類似的同步功能肠骆,但需要在使用時手動獲取鎖 和釋放鎖。
sleep()和 wait()有什么區(qū)別塞耕?
1蚀腿、每個對象都有一個鎖來控制同步訪問,Synchronized 關(guān)鍵字可以和對象的鎖交互,來實 現(xiàn)同步方法或同步塊莉钙。 sleep()方法正在執(zhí)行的線程主動讓出 CPU(然后 CPU 就可以去執(zhí)行其他任務(wù))廓脆,在 sleep 指定時間后 CPU 再回到該線程繼續(xù)往下執(zhí)行(注意:sleep 方法只讓出了 CPU,而并不會釋 放同步資源鎖4庞瘛M7蕖!)蚊伞; wait()方法則是指當(dāng)前線程讓自己暫時退讓出同步資源鎖席赂,以便其他正在等待該資源的線程 得到該資源進(jìn)而運行,只有調(diào)用了 notify()方法时迫,之前調(diào)用 wait()的線程才會解除 wait 狀 態(tài)颅停,可以去參與競爭同步資源鎖,進(jìn)而得到執(zhí)行掠拳。(注意:notify 的作用相當(dāng)于叫醒睡著 的人癞揉,而并不會給他分配任務(wù),就是說 notify 只是讓之前調(diào)用 wait 的線程有權(quán)利重新參與 線程的調(diào)度)溺欧;
2烧董、sleep()方法可以在任何地方使用;wait()方法則只能在同步方法或同步塊中使用胧奔;
3逊移、sleep()是線程線程類(Thread)的方法,調(diào)用會暫停此線程指定的時間龙填,但監(jiān)控依然保 持盏筐,不會釋放對象鎖奸绷,到時間自動恢復(fù);wait()是 Object 的方法,調(diào)用會放棄對象鎖腿时,進(jìn) 入等待隊列,待調(diào)用 notify()/notifyAll()喚醒指定的線程或者所有線程钉寝,才會進(jìn)入鎖池茬射,再 次獲得對象鎖才會進(jìn)入運行狀態(tài);
什么是死鎖梆靖?
兩個進(jìn)程都在等待對方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時候就發(fā)生了死鎖控汉。結(jié)果就是兩 個進(jìn)程 都陷入了無限的等待中。