美團java面試題整理


一.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注解進行使用

六十二.構造方法注入和設值注入有什么區別?

  1. 設值注入寫法直觀便於理解,使各種關系清晰明了。
  2. 設值注入可以避免因復雜的依賴實例化時所造成的性能問題。
  3. 設值注入的靈活性較強。
  4. 構造方法注入可以決定依賴關系的注入順序,有限依賴的優先注入。
  5. 對於依賴關系無需變化的Bean,構造方法注入使所有的依賴關系全部在構造器內設定,可避免后續代碼對依賴關系的破壞。
  6. 構造方法注入中只有組建的創建者才能改變組建的依賴關系,更符合高內聚原則。  

六十三.Spring 框架中有哪些不同類型的事件?

  上下文更新事件(ContextRefreshedEvent):該事件會在ApplicationContext被初始化或者更新時發布。也可以在調用ConfigurableApplicationContext 接口中的refresh()方法時被觸發。

  上下文開始事件(ContextStartedEvent):當容器調用ConfigurableApplicationContext的Start()方法開始/重新開始容器時觸發該事件。

  上下文停止事件(ContextStoppedEvent):當容器調用ConfigurableApplicationContext的Stop()方法停止容器時觸發該事件。

  上下文關閉事件(ContextClosedEvent):當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的所有單例Bean都被銷毀。

  請求處理事件(RequestHandledEvent):在Web應用中,當一個http請求(request)結束觸發該事件。
六十四.FileSystemResource 和 ClassPathResource 有何區別?

  ClassPathResource在環境變量中讀取配置文件,FileSystemResource在配置文件中讀取配置文件。

六十五.Spring 框架中都用到了哪些設計模式?

  單例模式、工廠模式、模板方法、代理模式、觀察者模式...

六十六.設計模式應用場景

  組合模式:針對樹形結構

  

  

    

  

      

 

 

 

 

 

 

 

 

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM