1. 面向?qū)ο蟮娜筇匦?,如何理解其中的多態(tài)?
* 三大特性:封裝、繼承、多態(tài)
* 多態(tài)是指允許不同的子類型的對象對同一消息作出不同的響應。多態(tài)分為編譯時的多態(tài)和運行時的多態(tài)。方法重載實現(xiàn)是編譯時的多態(tài),也稱為前綁定,而方法重寫的實現(xiàn)稱為運行時的多態(tài),也稱為后綁定。運行時的多態(tài)是面向?qū)ο蟮淖钪匾臇|西,要實現(xiàn)多態(tài)需要做兩件事:1,方法重寫,子類繼承父類并重寫父類中已有的或者抽象的方法。2,對象構造,用父類的引用引用子類型的對象,這樣同樣的引用調(diào)用同樣的方法就會根據(jù)子類對象的不同而表現(xiàn)出不同的行為。
2. JVM 的內(nèi)存模型?
- Java虛擬機將其管轄的內(nèi)存大致分三個邏輯部分:方法區(qū)、java堆、java棧
- 方法區(qū)是靜態(tài)分配的,常數(shù)池、String常量和static變量保存在方法區(qū)
- 棧是一個邏輯概念,特點是后進先出,最典型的stack應用是方法的調(diào)用,java虛擬機每調(diào)用一次方法就會創(chuàng)建一個方法幀,退出該方法則對應的方法幀被彈出。棧中儲存的數(shù)據(jù)也是運行時確定的。
- java堆儲存的數(shù)據(jù)常常是大小、數(shù)量和生命周期在編譯器是無法確定的。java對象的內(nèi)存總在heap中分配,用虛擬機的垃圾回收器負責回收。
3. String、StringBuilder、StringBuffer 的區(qū)別,StringBuffer 是如何實現(xiàn)線程安全的?
* String是字符串常量,是final類,對String的操作會產(chǎn)生中間對象,從而引起頻繁的GC
* StringBuilder是線程不安全的字符串變量,對StringBuilder的操作都是對自身的操作,因此不會生成新中間對象
* StringBuffer是線程安全的字符串變量,與StringBuilder類似
* StringBuffer在每一個方法上加synchronized關鍵字來保證線程安全。
4. 了解過 HTTP 嗎?說說它的特點,它里面有哪些方法,有了解過嗎?知道 HTTPS 嗎?這兩者有什么區(qū)別?
* HTTP是一個基于TCP/IP來傳遞數(shù)據(jù)的網(wǎng)絡協(xié)議。
* 特點:1、簡單快速,客戶向服務器請求服務時,秩序傳遞請求方法和路徑;2、靈活,允許傳輸任何類型的數(shù)據(jù)對象;3、無連接,每一次連接只處理一個請求??蛻羰盏椒掌鞯捻憫?,即斷開連接;4、無狀態(tài),對于事務處理沒有任何記憶功能;5、支持B/S和C/S模式。
* 最基本的方法有四種,分別是GET、POST、PUT、DELETE,對應資源的差、該、增、刪4個操作。其實最常用的只有GET和POST,GET用于獲取或者查詢數(shù)據(jù),POST用于更新資源信息。
* HTTPS是在HTTP應用層的基礎上使用安全套接字層做子層的網(wǎng)絡協(xié)議
* 兩者的區(qū)別:
1. HTTP的URL是http開頭,HTTPS是以https開頭
2. HTTP是不安全的,HTTPS是安全的
3. HTTP標準端口是80,HTTPS的是443
4. 在OSI網(wǎng)絡模型中,HTTP工作于應用層,HTTPS工作于傳輸層
5. HTTP無需加密,HTTPS對傳輸?shù)臄?shù)據(jù)進行了加密
6. HTTP無需證書,HTTPS需要認證證書。
5. 你平常是怎么進行加密的?MD5 加密是可逆的嗎?
* 一般對敏感的數(shù)據(jù),比如用戶的密碼采用MD5加密。這種加密方式不可逆
* 其他的加密類型有:1、sha1,也是不可逆的加密,比md5長度要長,比較安全;2、還有可逆的加密,分為兩種,對稱加密:DES和AES,只有一把可自定義鑰匙,加密速度快;非對稱加密:RSA,程序會生成兩把鑰匙:公私和私匙,公私加密只能用私匙解密,私匙加密只能用公私解密,安全性比較高
* md5加密原理:md5會以512位分組處理輸入的信息,且每一分組又被劃分為16個32位的子分組,經(jīng)過復雜的處理后,輸出由4個32位分組組成,將這4個32位分組級聯(lián)后將生成一個128位散列碼。
6. 接口與抽象類的區(qū)別?static 方法可以被覆蓋嗎?為什么?
* 接口只能抽象方法,抽象類可以有抽象方法,兩者都不能創(chuàng)建對象,需要被繼承。
* 不能被覆蓋。形式上可以重寫,只要子類不添加override編譯可以通過,但從本質(zhì)上來說不是Java的重寫,因為靜態(tài)方法只與類有關,不與具體實現(xiàn)相關,聲明的是什么類,則引用相應類的靜態(tài)方法。
7. 創(chuàng)建線程的方式,他們有什么區(qū)別?知道線程池嗎?說說對線程池的理解?
* 創(chuàng)建線程有四種方式
1. 繼承Thread類創(chuàng)建
2. 現(xiàn)實Runnable接口創(chuàng)建
3. 使用Callable和Future創(chuàng)建
* 區(qū)別
1. 自定義類繼承Thread類,并覆寫run()方法,該方法就是線程要完成的任務,調(diào)用start()方法啟動線程
2. 定義Runnable的實現(xiàn)類,一樣覆寫run()方法,并將這實現(xiàn)類作為Thread的target來創(chuàng)建Thread對象
3. Callable接口提供call()方法作為線程的執(zhí)行體,call既可以有返回值,也可以聲明拋出異常;java5提供了Future接口來控制與它關聯(lián)的Callable任務
* 線程池的理解
1. 線程池就是事先將多個線程對象放到一個容器中,當使用的時候就不用new對象而是直接去容器中拿線程即可,節(jié)省了開辟線程的時間,提高了響應的速度。
2. Executors提供了四種生成線程池的靜態(tài)方法,F(xiàn)ixedThreadPool、CachedThreadPool、ScheduledThreadPool和SingleThreadExecutor。
3. ThreadPoolExecutor是線程池的真正實現(xiàn),比較常用的構造方法的參數(shù)有corePoolSize核心線程數(shù)、maxinumPoolSize非核心線程數(shù)、keepAliveTime閑置線程的超時時長、Unit超時時長單位、workQueue任務隊列和threadFactory線程工廠,提供創(chuàng)建線程的功能
8. 你了解過 Java 的四種引用嗎?分別代表什么含義,他們有什么區(qū)別?
* 四種引用:強引用、軟引用、弱引用和虛引用
* 強引用,直接new出來的對象,即使內(nèi)存空間不足,垃圾回收器也不會回收它,java虛擬機寧愿拋出異常;軟引用,當虛擬機內(nèi)存不足時,將會回收它指定的對象;弱引用,隨時可能被垃圾回收器回收,不一定等到虛擬機內(nèi)存不足時才回收;虛引用,和沒有引用幾乎是一樣的。
* 軟引用和弱引用的區(qū)別:具有弱引用的對象擁有更短的生命周期。如果只是避免OOM異常的發(fā)生,則可以使用軟引用;如果在意應用的性能,想盡快回收一些占有內(nèi)存比較大的對象,則可以使用弱引用。
9. Java 中關于 equals 和 hashcode 的理解?
* equals的作用是用來判斷兩個對象是否相等。如果某個類沒有覆寫該方法,比較的是兩個對象的地址是否相等,等價于兩個=;如果覆寫了該方法,比較的是兩個對象的內(nèi)容是否相等。
* hashCode的作用是獲取哈希碼,也稱為散列碼,哈希碼的作用是確定該對象在哈希表中的索引位置,也就是說hashCode()在散列表中才有用,其他情況下用處不大。
10. 關于 Java 中深拷貝和淺拷貝的區(qū)別?
* 將一個對象的引用直接復制給另一個對象,有三種方式:直接賦值;淺拷貝;深拷貝
* 直接賦值,A a1=a2,a1和a2指向同一個對象,當其中一個變化時候,另一個也會隨之變化。
* 淺拷貝,期望把a1賦值給a2后,a1和a2保持獨立,互不影響。主要是覆寫的是clone()函數(shù)。創(chuàng)建一個新對象,然后將當前的對象的非靜態(tài)字段復制到該新對象,如果字段是值類型,那么對該對象執(zhí)行復制;如果該字段是引用類型的話,則復制引用但不復制引用的對象。因此原始對象和副本引用同一個對象。
* 深拷貝,之所以有深拷貝,是因為淺拷貝是選擇性的拷貝。如果是基本類型,則拷貝其值;如果是實例對象,則拷貝其地址引用;如果是String字符串,則拷貝其地址引用,但在修改時,會從字符串池中重新生成一個新的字符串,原有的保持不變。針對上面的情況,只需要在clone方法里面新建對象,然后返回該對象引用即可。但是如果存在大量的對象是通過拷貝生成的,每一個類都寫一個clone方法,并將還需要進行深拷貝,這是很耗時耗力的。在這種情況下,通過序列化來完成對象的拷貝,在內(nèi)存中通過字節(jié)流的拷貝是比較容易實現(xiàn)的。
11. 簡單的說下 Java 的垃圾回收?
* java虛擬機將其管轄的內(nèi)存分為三個部分:方法區(qū)、Java棧和Java堆。方法區(qū)是靜態(tài)分配的,常量池、static變量等保存在方法區(qū);Java棧是一個邏輯概念,特點是后進先出,最典型的應用是方法的調(diào)用,棧中儲存的數(shù)據(jù)是運行時確定的。Java堆保存的是java的對象,由虛擬機的垃圾回收器負責回收。
* GC在回收對象前必須發(fā)現(xiàn)哪些是無用對象。常用的搜索算法有:
1. 引用計數(shù)器算法,如果有地方引用,計算器+1,引用失效-1,當計算器為0的時候,jvm就認為該對象不再被使用,可以垃圾回收了。但是這個算法有一個缺點,就是不能解決循環(huán)引用的問題,因此該算法不在被使用;
2. 根搜索算法,該算法是通過一些GC roots對象作為起點,從這個節(jié)點開始往下搜索,搜索通過的路徑成為引用鏈,當一個對象沒有被GC roots的引用鏈鏈接的時候,說明這個對象是不可用的。
* 當通過某種算法確定無用對象后,就是回收過程了,常用的回收算法如下:
1. 標記-清除算法。該算法分兩個階段:標記和清除。在標記階段,確定所要回收的對象,并標記;清除階段緊隨標記階段,將標記階段無用的對象進行清除處理。該算法效率不高,清除后會產(chǎn)生大量不連續(xù)的空間,當需要分配大內(nèi)存對象時,可能無法找到足夠的連續(xù)空間
2. 復制算法。該算法將內(nèi)存分成兩塊。每次使用其中一塊,當垃圾回收的時候,將存活的對象復制到另一塊上,如果清除這一塊無用的對象。該算法實現(xiàn)簡單,運行效率高。如果內(nèi)存分配合理,比如*:1,則內(nèi)存的利用率也是很高的。Jvm用復制算法收集新生代。
3. 標記--整理算法。標記--整理算法與標記--清除算法類似,標記整理算法把存活的對象往內(nèi)存的一端移動,然后直接回收邊界意外的內(nèi)存。jvm用該算法收集存活時間較長的老年代
4. 分代收集。根據(jù)對象的存活時間把內(nèi)存分為新生代和老年代,然后在各個代采用不同的垃圾回收算法。新生代采用復制算法,老年代采用標記--整理算法。
12. 了解過 Java 的集合嗎?說說 HashMap 的底層實現(xiàn)原理?ArrayList 和 LinkedList 的區(qū)別?Java 集合中哪些是線程安全的?
* HashMap底層就是一個數(shù)組的數(shù)據(jù)結構,數(shù)組中的每一項又是一個鏈表。Entry就是數(shù)組中的元素,每一個Map.Entry其實就是一個key-value鍵值對,它持有一個指向下一個元素的引用,這就構成了元素。
* 當要存儲一個Entry對象時,會根據(jù)hash算法來決定其在數(shù)組中的存儲位置,在根據(jù)equals方法來決定其在該數(shù)組上的鏈表中的存儲位置;當要取出一個Entry時,也會根據(jù)hash算法找到數(shù)組中的存儲位置,再根據(jù)equals方法從該位置上的鏈表取出該Entry。
* 兩者都實現(xiàn)了List接口,ArrayList是以數(shù)組的方式來實現(xiàn)的,數(shù)組的特性是可以使用索引的方式來快速定位對象的位置,因此查詢塊;LinkedList是以鏈表的方式來實現(xiàn)的,因此在增刪時效率上要比ArrayList好得多。
* vector是ArrayList的多線程版本,HashTable是HashMap的多線程版本。并發(fā)集合:ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteSet
13. 如何實現(xiàn)對象的排序?
* 兩種方法
1. 將要排序的對象類實現(xiàn)Comparable接口,覆寫compareTo方法,調(diào)用Collectons的sort函數(shù)
2. 使用Comparable匿名內(nèi)部類實現(xiàn)。
14. 知道 ThreadLocal 嗎?說說對它的理解?
* ThreadLocal是一個線程內(nèi)部的數(shù)據(jù)存儲類,通過它可以在指定的線程中存儲數(shù)據(jù),數(shù)據(jù)存儲后,只有指定的線程可以獲得存儲的數(shù)據(jù),其他線程是無法訪問該數(shù)據(jù)的。ThreadLocal會根據(jù)指定的線程來初始化內(nèi)部類Value ,localValue內(nèi)部有一個Object數(shù)據(jù)table,數(shù)據(jù)的存取就是對該table數(shù)組的操作。因此,在不同線程訪問同一個ThreadLocal的set和get的操作僅限于各自的線程的內(nèi)部,多個線程互不干擾的存儲和修改數(shù)據(jù)。
15. 在你寫代碼的過程中有使用過設計模式嗎?你知道哪些?為什么要這樣用,能解決什么問題?
16. 了解注解嗎?了解反射嗎?為什么要使用反射?
17. 數(shù)據(jù)結構中常用排序算法?