一.ArrayList、LinkedList 和 Vector 的區別。
1.ArrayList非線程安全的,Vector是線程安全的。
2.ArrayList擴容時按照50%增加,Vector按照100%增加。
3.ArrayList的性能要高於Vector
4.LinkedList是鏈表實現的,因此查詢慢,增刪快。
5.LinkedList提供了List接口沒有提供的方法,方便數據的頭尾操作。
二.快速失敗 (fail-fast) 和安全失敗 (fail-safe) 的區別是什么?
1.快速失敗:如果用迭代器遍歷集合時,如果集合內容發生了改變。這時會拋出一個ConcurrentModificationException.
2.安全失敗:迭代器遍歷時用的是原集合的拷貝,因此改變原集合不會引起一場,但是這樣也就無法感知原集合的變化了。
三.hashmap的數據結構
1.是由數組和鏈表/紅黑樹組成的,鏈表的數據多了就會轉為紅黑樹。轉換的閾值是8.
2.通過key的hashcode取模數組長度來確定將數據放到哪里
3.如果存放的位置已經有了數據了就形成鏈表向后放,node記錄了next的節點。
4.默認初始容量是16,加載因子是0.75.意味着容量超過75%就會擴容一倍
5.key的equals用來確定在鏈表中是否有相同的key
四.List、Map、Set 三個接口,存取元素時,各有什么特點?
1.list可以有重復的元素,可以通過執行索引取元素,也可以在指定的位置存放元素
2.map鍵值對的方式存取元素,key不可以重復,可以通過key獲取指定的鍵值對
3.set不允許存重復的元素,也就是equals相同的對象,也無法獲取指定的元素。只能通過遍歷。
五.兩個對象值相同 (x.equals(y) == true),但卻可有不同的 hash code,這句話對不對?
1.分不同的情況,如果對象的equals沒有被重寫的話,那么equals都是繼承的Object的。即為==,也就是說equals相同證明了是同一個對象,hashcode也一定相同。
2.針對上面的這種規范,java倡導如果equals被重寫了那么hashcode也要重寫。以此來保證equals相同時hashcode也相同
3.而這個問題是對的,因為如果不遵守這個規范,當然equals相同hashcode可以不同了。
六.Java 集合類框架的基本接口有哪些?

add,addAll,clear,contains,containsAll,remove,removeAll

clear,containsKey,containsValue,get,put
七.HashSet 和 TreeSet 有什么區別?
1.HashSet是無序的,可以有一個null,非同步。TreeSet是有序的,不能有null,通過compare方法決定放置的位置。TreeSet有兩種排序方法:自然排序、自定義排序
2.HashSet是通過哈希表實現的、TreeSet二叉樹實現的
八.HashSet的底層實現是什么?
1.通過hashmap來實現的,用key來存儲數據,保證key的唯一性
九.LinkedHashMap 的實現原理?
hashmap+雙向鏈表實現的,是有序的,分為插入順序和訪問順序。
十.為什么集合類沒有實現 Cloneable 和 Serializable 接口?
應該有具體的實現來完由
十一.什么是迭代器?
為了方便容器的遍歷,和具體的容器進行解耦。提供了公共的實現方法。
十二.Iterator 和 ListIterator 的區別是什么?
Iterator是一個接口,ListIterator是對它的具體實現
十三.數組 (Array) 和列表 (ArrayList) 有什么區別?
1.Array是定長的,ArrayList是變長的。
2.Array適合處理不變的數據,ArrayList提供的方法更豐富。
十四.集合使用

十五.Set 里的元素是不能重復的,那么用什么方法來區分重復與否呢?是用 == 還是 equals()?它們有何區別?
equals
十六.Comparable 和 Comparator 接口是干什么的?列出它們的區別?
如果想對一個對象進行排序,可以有兩種方式。一個是這個對象實現comparable接口、另一個是單獨寫一個類,這個類實現Comprator接口。相當於一個在需要排序的內部實現,一個可以在外部實現。
十七.Collection 和 Collections 的區別。
Collection是集合的接口、Collections是操作集合的一個工具類
十八.java類加載過程?
1.加載->鏈接(驗證、准備、解析)->初始化
2.加載:加載二進制流、靜態結構轉化為方法區和數據結構、生成類對象
十九.jvm加載class的原理和機制?
1.java通過雙親委派機制加載類,這樣的好處是安全。
2.有三個類加載器:系統類加載器(加載java的系統類)擴展類加載器(繼承和實現的類)程序類加載器(程序員自定義的類)
二十.java內存分配?
堆:存儲java的實例對象
棧:線程私有,存儲局部變量表,動態鏈接
方法區:線程共享的,存儲class二級制文件。包含類信息、常量池、靜態變量
程序計數器:線程私有的,記錄着程序運行的位置
本地方法棧:存儲java本地方法信息
二十一.GC是什么?
是java的內存回收機制,通過算法判斷對象是否為垃圾對象來進行回收。如果判斷對象是垃圾對象呢,有兩種算法:一種是引用計數法,當對象被引用一次時計數加一。當引用計數的次數為零的時候就表示對象無用了。但是這種算法有一個問題,就是當對象循環引用時無法做出正確的判斷。還有一種算法是可達性分析:把對象看作一棵樹,看對象是否可達。
回收過程:1.分為下面四個區:eden、s1、s2、old
2.對象先放入eden中,滿了就放入s1-》s1滿了放入s2,eden和s1清空-》s2滿了將對象放入old中,然后s1和s2互換-》old滿了進行老年代的回收
二十二.Java 中會存在內存泄漏嗎
數據庫連接、網絡連接
二十三.深拷貝和淺拷貝
深拷貝是拷貝對象的屬性,如果原對象有引用的屬性則修改引用屬性不會引起拷貝對象的變化。
二十四.System.gc和Runtime.gc
功能一樣,不建議使用。
二十五.finalize() 方法什么時候被調用?析構函數 (finalization) 的目的是什么?
對象回收前會調用finalize方法、析構函數與構造函數相反,就是釋放資源。
二十六.什么是分布式垃圾回收(DGC)?它是如何工作的?
跨虛擬機的遠程對象引用,引用有租期。定時發送租約。
二十七.串行(serial)收集器和吞吐量(throughput)收集器的區別是什么?
串行針對小應用、吞吐量針對大數據量
二十八.Minor GC 和 Major GC
minorGC是新生代的gc、Major是老年代的gc
二十九.JVM 的永久代中會發生垃圾回收么?
不會,如果滿了會直接拋出異常。
三十.雙親委派機制?
會遞歸它的父類加載器進行加載,好處:放置重復加載、安全。
三十一.Synchronized 用過嗎,其原理是什么?
重量解鎖,可以修飾方法,也可以修飾代碼塊。是通過監視器實現的。一個監視器的鎖只能被一個線程持有,這樣保證了同一時刻只有一個線程執行這段代碼。進入監視器時enter、退出時exit、並且監視器有一個計數器。這個線程獲得了這個鎖計數器就加一,同一個線程再次獲得這個鎖時就再加一。最后這個計數器為零時表明其他線程可以訪問這段代碼了。
三十二.什么是可重入性?
如果當前線程持有了這個鎖,那么再有這個鎖的同步方法或代碼塊時這個線程可以再次進入。
三十三.jvm隊員是所做了哪些優化?
分為偏向鎖(單線程訪問的場景,加鎖解鎖速度快)、輕量級鎖(多線程執行時的執行速度很快的場景,會進行自旋,效率更高)、重量級鎖
三十四.鎖消除和鎖粗化?
鎖消除:jvm在編譯器會對代碼進行是否可逃逸分析,發現同步的代碼不可以不其他線程訪問到就會進行鎖消除。
鎖粗化:就是看同步塊之間沒有同步的代碼執行的速度是否快,如果未同步的代碼執行速度很快。那么可以將兩個同步代碼合為一個,這樣同一個線程減少了申請鎖的次數,提升了效率。
三十五.樂觀鎖、cas?
樂觀鎖:樂觀地認為並發的問題實屬罕見,通過version來控制並發修改的問題。每次修改version都會加一,如果當前請求是獲取version與最后提交時的version不同表明發生了並發問題,會更新失敗。
cas:compare and swap 比較值和預期值作對比,如果相同就進行更新。但是會出現ABA問題。
三十六.ReentrantLock原理?
是通過cas和隊列實現的,先通過cas獲取鎖的狀態-》state為零且隊列為空時當前線程得到鎖、state不為零時將當前線程放入隊列中進行排隊-》持有鎖線程釋放鎖,判斷是否為公平鎖。如果是公平鎖,那么隊列頭的線程獲得鎖。如果是非公平鎖,那么隊列中的線程都有可能獲得鎖。
三十七.AQS?
隊列同步器
三十八.請盡可能詳盡地對比下 Synchronized 和 ReentrantLock 的異同。
1.ReentrantLock有公平鎖和非公平鎖
2.ReentrantLock可以終止等待
3.ReentrantLock可以分組喚醒
4.Synchronized使用起來更便捷,ReentrantLock功能更多,帶需要手動釋放鎖。
三十九.ReentrantLock 是如何實現可重入性的?
獲得鎖的線程再次進入同步塊的時候state會加一,釋放鎖的時候回減一。
四十.ReadWriteLock 和 StampedLock
ReadWriteLock:讀寫鎖,允許多線程並發讀操作。StampedLock:相對於ReadWriteLock的一個優化,ReadWriteLock並發讀線程回阻塞寫線程。而StampedLock則不會。
四十一.如何讓 Java 的線程彼此同步?
wait、notify、park、unpark
四十二.CyclicBarrier 和 CountDownLatch區別?
CyclicBarrier:控制並發進入的現成的數量 CountDownLatch:減數器,主線程可以阻塞等待,知道減數器為零。
四十三.線程池實現原理?

四十四.線程池核心的構造參數?
corePoolSize:核心線程數
maximumPoolSize:最大線程數
keepAlivesTimes:非核心線程存活時間
workQueue:等待隊列
handler:拒絕策略
四十五.如何在 Java 線程池中提交線程?
execute:無法獲取返回值、submit:可以通過futureTask獲取返回值
四十六.既然提到可以通過配置不同參數創建出不同的線程池,那么 Java 中默認實現好的線程池又有哪些呢?請比較它們的異同
newFixedThreadPool:指定數量的線程池,核心線程數和最大線程數一樣。
newCachedThreadPool:緩存線程池,核心線程數為零,但最大線程數是Integer.MAX_VALUE,線程存活時間為60s。
newSingleThreadExecutor:核心線程數和最大線程數都是一個線程,保證任務的順序執行。
四十七.Java 中各個線程是怎么彼此看到對方的變量的?
四十八.請談談 volatile 有什么特點,為什么它能保證變量對所有線程的可見性?
可以保證可見性,不能保證原子操作,如i++
四十九.請對比下 volatile 對比 Synchronized 的異同。
1.volatile是輕量級的
2.多線程並發訪問volatile不會阻塞
3.volatile只保證可見性,不能保證原子操作
五十.ThreadLocal 是怎么解決並發安全的?
每個線程存儲的是本地變量副本,沒有共享數據。線程當然安全了。但是線程中是無法獲取到在主線程中設置的ThreadLocal的值的。他的一個子類可以。
五十一.什么是spring,有哪些模塊?
java框架,模塊包括spring core、spring web、spring mvc、spring context、spring dao、spring orm、spring dao
五十二.使用spring框架帶來哪些好處?
解耦、aop、聲明式事務、對其他框架開放、
五十三.BeanFactory 和 ApplicationContext 有什么區別?
ApplicationContext繼承自BeanFactory,前者豐富了很多功能。如:國際化、aop、加載上下文... 並且Application是對於bean預加載的,而BeanFactory是懶加載的。
五十四.spring有幾種配置方式?
xml、注解、java類
xml:<bean id="userDao" class="cn.lovepi.***.userDao"/>
注解: @Component("userDao")
public class userDao{......}
java:使用@Configuration注解需要作為配置的類,表示該類將定義Bean的元數據,使用@Bean注解相應的方法,該方法名默認就是Bean的名稱,該方法返回值就是Bean的對象。
五十五.springBean生命周期?

創建-》初始化-》使用-》銷毀
五十六.Spring bean元素的作用域?
- 當通過Spring容器創建一個Bean實例的時候,不僅可以完成bean實例的實力化,還可以為bean指定作用域。Spring bean元素的支持以下5種作用域:
- Singleton:單例模式,在整個spring IOC容器中,使用singleton定義的bean將只有一個實例。
- Prototype:多例模式,每次通過容器中的getBean方法獲取prototype定義的beans時,都會產生一個新的bean的實例。
- Request:對於每次Http請求,使用request定義的bean都會產生一個新的實例,只有在web應用時候,該作用域才會有效。
- Session:對於每次Http Session,使用session定義的Bean都將產生一個新的實例。
- Globalsession:每個全局的Http Sesisonn,使用session定義的本都將產生一個新的實例。
五十七.spring inner beans?
在bean中聲明另一個bean作為屬性
五十八.spring中的bean是線程成安全的嗎?
- Spring框架並沒有對單例的bean進行多線程的封裝處理,線程安全問題和並發問題,需要我們開發者自己考慮。
- 但實際上,大部分的Spring bean並沒有可變的狀態(比如:service類和dao類),所有在某種程度上來說Spring單例bean是線程安全的。如果bean有多種狀態的話(比如:View Model對象),就需要自行考慮線程安全問題。
五十九.什么是自動裝配?
- 就是將一個Bean注入到其它的Bean的Property中,默認情況下,容器不會自動裝配,需要我們手動設定。Spring 可以通過向Bean Factory中注入的方式來搞定bean之間的依賴關系,達到自動裝配的目的。
- 自動裝配建議少用,如果要使用,建議使用ByName
六十.@Required
@Required 注釋應用於 bean 屬性的 setter 方法,它表明受影響的 bean 屬性在配置時必須放在 XML 配置文件中,否則容器就會拋出一個 BeanInitializationException 異常。
六十一.autowired和resource?
1.@Autowired與@Resource都可以用來裝配bean. 都可以寫在字段上,或寫在setter方法上。
2.@Autowired默認按類型裝配(這個注解是屬業spring的),默認情況下必須要求依賴對象必須存在,如果要允許null值,可以設置它的required屬性為false,如:@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier注解進行使用
六十二.構造方法注入和設值注入有什么區別?
- 設值注入寫法直觀便於理解,使各種關系清晰明了。
- 設值注入可以避免因復雜的依賴實例化時所造成的性能問題。
- 設值注入的靈活性較強。
- 構造方法注入可以決定依賴關系的注入順序,有限依賴的優先注入。
- 對於依賴關系無需變化的Bean,構造方法注入使所有的依賴關系全部在構造器內設定,可避免后續代碼對依賴關系的破壞。
- 構造方法注入中只有組建的創建者才能改變組建的依賴關系,更符合高內聚原則。
六十三.Spring 框架中有哪些不同類型的事件?
上下文更新事件(ContextRefreshedEvent):該事件會在ApplicationContext被初始化或者更新時發布。也可以在調用ConfigurableApplicationContext 接口中的refresh()方法時被觸發。
上下文開始事件(ContextStartedEvent):當容器調用ConfigurableApplicationContext的Start()方法開始/重新開始容器時觸發該事件。
上下文停止事件(ContextStoppedEvent):當容器調用ConfigurableApplicationContext的Stop()方法停止容器時觸發該事件。
上下文關閉事件(ContextClosedEvent):當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的所有單例Bean都被銷毀。
請求處理事件(RequestHandledEvent):在Web應用中,當一個http請求(request)結束觸發該事件。
六十四.FileSystemResource 和 ClassPathResource 有何區別?
ClassPathResource在環境變量中讀取配置文件,FileSystemResource在配置文件中讀取配置文件。
六十五.Spring 框架中都用到了哪些設計模式?
單例模式、工廠模式、模板方法、代理模式、觀察者模式...
六十六.設計模式應用場景
組合模式:針對樹形結構
