日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

“面试不败计划”:各大公司Java后端开发面试题总结

發(fā)布時間:2025/3/20 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 “面试不败计划”:各大公司Java后端开发面试题总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關(guān)注我的微信公眾號:好好學java,獲取優(yōu)質(zhì)學習資源。

1、ThreadLocal(線程變量副本)

Synchronized實現(xiàn)內(nèi)存共享,ThreadLocal為每個線程維護一個本地變量。
采用空間換時間,它用于線程間的數(shù)據(jù)隔離,為每一個使用該變量的線程提供一個副本,每個線程都可以獨立地改變自己的副本,而不會和其他線程的副本沖突。
ThreadLocal類中維護一個Map,用于存儲每一個線程的變量副本,Map中元素的鍵為線程對象,而值為對應線程的變量副本。
ThreadLocal在Spring中發(fā)揮著巨大的作用,在管理Request作用域中的Bean、事務管理、任務調(diào)度、AOP等模塊都出現(xiàn)了它的身影。
Spring中絕大部分Bean都可以聲明成Singleton作用域,采用ThreadLocal進行封裝,因此有狀態(tài)的Bean就能夠以singleton的方式在多線程中正常工作了。

2、Java內(nèi)存模型:

Java虛擬機規(guī)范中將Java運行時數(shù)據(jù)分為六種。
1.程序計數(shù)器:是一個數(shù)據(jù)結(jié)構(gòu),用于保存當前正常執(zhí)行的程序的內(nèi)存地址。Java虛擬機的多線程就是通過線程輪流切換并分配處理器時間來實現(xiàn)的,為了線程切換后能恢復到正確的位置,每條線程都需要一個獨立的程序計數(shù)器,互不影響,該區(qū)域為“線程私有”。
2.Java虛擬機棧:線程私有的,與線程生命周期相同,用于存儲局部變量表,操作棧,方法返回值。局部變量表放著基本數(shù)據(jù)類型,還有對象的引用。
3.本地方法棧:跟虛擬機棧很像,不過它是為虛擬機使用到的Native方法服務。
4.Java堆:所有線程共享的一塊內(nèi)存區(qū)域,對象實例幾乎都在這分配內(nèi)存。
5.方法區(qū):各個線程共享的區(qū)域,儲存虛擬機加載的類信息,常量,靜態(tài)變量,編譯后的代碼。
6.運行時常量池:代表運行時每個class文件中的常量表。包括幾種常量:編譯時的數(shù)字常量、方法或者域的引用。
友情鏈接: Java中JVM虛擬機詳解

3、“你能不能談談,java GC是在什么時候,對什么東西,做了什么事情?”

在什么時候:
1.新生代有一個Eden區(qū)和兩個survivor區(qū),首先將對象放入Eden區(qū),如果空間不足就向其中的一個survivor區(qū)上放,如果仍然放不下就會引發(fā)一次發(fā)生在新生代的minor GC,將存活的對象放入另一個survivor區(qū)中,然后清空Eden和之前的那個survivor區(qū)的內(nèi)存。在某次GC過程中,如果發(fā)現(xiàn)仍然又放不下的對象,就將這些對象放入老年代內(nèi)存里去。
2.大對象以及長期存活的對象直接進入老年區(qū)。
3.當每次執(zhí)行minor GC的時候應該對要晉升到老年代的對象進行分析,如果這些馬上要到老年區(qū)的老年對象的大小超過了老年區(qū)的剩余大小,那么執(zhí)行一次Full GC以盡可能地獲得老年區(qū)的空間。
對什么東西:從GC Roots搜索不到,而且經(jīng)過一次標記清理之后仍沒有復活的對象。
做什么: 新生代:復制清理; 老年代:標記-清除和標記-壓縮算法; 永久代:存放Java中的類和加載類的類加載器本身。
GC Roots都有哪些: 1. 虛擬機棧中的引用的對象 2. 方法區(qū)中靜態(tài)屬性引用的對象,常量引用的對象 3. 本地方法棧中JNI(即一般說的Native方法)引用的對象。

4、Synchronized

與Lock都是可重入鎖,同一個線程再次進入同步代碼的時候.可以使用自己已經(jīng)獲取到的鎖。
Synchronized是悲觀鎖機制,獨占鎖。而Locks.ReentrantLock是,每次不加鎖而是假設(shè)沒有沖突而去完成某項操作,如果因為沖突失敗就重試,直到成功為止。 ReentrantLock適用場景

  • 某個線程在等待一個鎖的控制權(quán)的這段時間需要中斷

  • 需要分開處理一些wait-notify,ReentrantLock里面的Condition應用,能夠控制notify哪個線程,鎖可以綁定多個條件。

  • 具有公平鎖功能,每個到來的線程都將排隊等候。

fail-fast:

機制是java集合(Collection)中的一種錯誤機制。當多個線程對同一個集合的內(nèi)容進行操作時,就可能會產(chǎn)生fail-fast事件。
例如:當某一個線程A通過iterator去遍歷某集合的過程中,若該集合的內(nèi)容被其他線程所改變了;那么線程A訪問集合時,就會拋出ConcurrentModificationException異常,產(chǎn)生fail-fast事件

happens-before:

如果兩個操作之間具有happens-before 關(guān)系,那么前一個操作的結(jié)果就會對后面一個操作可見。
1.程序順序規(guī)則:一個線程中的每個操作,happens- before 于該線程中的任意后續(xù)操作。
2.監(jiān)視器鎖規(guī)則:對一個監(jiān)視器鎖的解鎖,happens- before 于隨后對這個監(jiān)視器鎖的加鎖。
3.volatile變量規(guī)則:對一個volatile域的寫,happens- before于任意后續(xù)對這個volatile域的讀。
4.傳遞性:如果A happens- before B,且B happens- before C,那么A happens- before C。
5.線程啟動規(guī)則:Thread對象的start()方法happens- before于此線程的每一個動作。

Volatile和Synchronized四個不同點:

1 粒度不同,前者針對變量 ,后者鎖對象和類
2 syn阻塞,volatile線程不阻塞
3 syn保證三大特性,volatile不保證原子性
4 syn編譯器優(yōu)化,volatile不優(yōu)化 volatile具備兩種特性:

  • 1.保證此變量對所有線程的可見性,指一條線程修改了這個變量的值,新值對于其他線程來說是可見的,但并不是多線程安全的。
  • 2.禁止指令重排序優(yōu)化。

Volatile如何保證內(nèi)存可見性:

1.當寫一個volatile變量時,JMM會把該線程對應的本地內(nèi)存中的共享變量刷新到主內(nèi)存。
2.當讀一個volatile變量時,JMM會把該線程對應的本地內(nèi)存置為無效。線程接下來將從主內(nèi)存中讀取共享變量。

同步:

就是一個任務的完成需要依賴另外一個任務,只有等待被依賴的任務完成后,依賴任務才能完成。

異步:

不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什么工作,只要自己任務完成了就算完成了,被依賴的任務是否完成會通知回來。(異步的特點就是通知)。 打電話和發(fā)短信來比喻同步和異步操作。

阻塞:

CPU停下來等一個慢的操作完成以后,才會接著完成其他的工作。

非阻塞:

非阻塞就是在這個慢的執(zhí)行時,CPU去做其他工作,等這個慢的完成后,CPU才會接著完成后續(xù)的操作。
非阻塞會造成線程切換增加,增加CPU的使用時間能不能補償系統(tǒng)的切換成本需要考慮。

CAS(Compare And Swap) 無鎖算法:

CAS是樂觀鎖技術(shù),當多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程并不會被掛起,而是被告知這次競爭中失敗,并可以再次嘗試。CAS有3個操作數(shù),內(nèi)存值V,舊的預期值A(chǔ),要修改的新值B。當且僅當預期值A(chǔ)和內(nèi)存值V相同時,將內(nèi)存值V修改為B,否則什么都不做。

線程池的作用:

在程序啟動的時候就創(chuàng)建若干線程來響應處理,它們被稱為線程池,里面的線程叫工作線程
第一:降低資源消耗。通過重復利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。
第二:提高響應速度。當任務到達時,任務可以不需要等到線程創(chuàng)建就能立即執(zhí)行。
第三:提高線程的可管理性。
常用線程池:ExecutorService 是主要的實現(xiàn)類,其中常用的有 Executors.newSingleThreadPool(),newFixedThreadPool(),newcachedTheadPool(),newScheduledThreadPool()。

類加載器工作機制:

1.裝載:將Java二進制代碼導入jvm中,生成Class文件。
2.連接:a)校驗:檢查載入Class文件數(shù)據(jù)的正確性 b)準備:給類的靜態(tài)變量分配存儲空間 c)解析:將符號引用轉(zhuǎn)成直接引用
3:初始化:對類的靜態(tài)變量,靜態(tài)方法和靜態(tài)代碼塊執(zhí)行初始化工作。
雙親委派模型:類加載器收到類加載請求,首先將請求委派給父類加載器完成 用戶自定義加載器->應用程序加載器->擴展類加載器->啟動類加載器。

一致性哈希:

Memcahed緩存:

數(shù)據(jù)結(jié)構(gòu):key,value對
使用方法:get,put等方法

Redis數(shù)據(jù)結(jié)構(gòu):

String—字符串(key-value 類型)
Hash—字典(hashmap) Redis的哈希結(jié)構(gòu)可以使你像在數(shù)據(jù)庫中更新一個屬性一樣只修改某一項屬性值
List—列表 實現(xiàn)消息隊列
Set—集合 利用唯一性
Sorted Set—有序集合 可以進行排序 可以實現(xiàn)數(shù)據(jù)持久化

java自動裝箱拆箱深入剖析
談談Java反射機制
如何寫一個不可變類?

索引:

B+,B-,全文索引
Mysql的索引是一個數(shù)據(jù)結(jié)構(gòu),旨在使數(shù)據(jù)庫高效的查找數(shù)據(jù)。
常用的數(shù)據(jù)結(jié)構(gòu)是B+Tree,每個葉子節(jié)點不但存放了索引鍵的相關(guān)信息還增加了指向相鄰葉子節(jié)點的指針,這樣就形成了帶有順序訪問指針的B+Tree,做這個優(yōu)化的目的是提高不同區(qū)間訪問的性能。

什么時候使用索引:

經(jīng)常出現(xiàn)在group by,order by和distinc關(guān)鍵字后面的字段

經(jīng)常與其他表進行連接的表,在連接字段上應該建立索引

經(jīng)常出現(xiàn)在Where子句中的字段

經(jīng)常出現(xiàn)用作查詢選擇的字段

Spring IOC (控制反轉(zhuǎn),依賴注入)

Spring支持三種依賴注入方式,分別是屬性(Setter方法)注入,構(gòu)造注入和接口注入。
在Spring中,那些組成應用的主體及由Spring IOC容器所管理的對象被稱之為Bean。
Spring的IOC容器通過反射的機制實例化Bean并建立Bean之間的依賴關(guān)系。
簡單地講,Bean就是由Spring IOC容器初始化、裝配及被管理的對象。
獲取Bean對象的過程,首先通過Resource加載配置文件并啟動IOC容器,然后通過getBean方法獲取bean對象,就可以調(diào)用他的方法。

Spring Bean的作用域:

Singleton:Spring IOC容器中只有一個共享的Bean實例,一般都是Singleton作用域。
Prototype:每一個請求,會產(chǎn)生一個新的Bean實例。
Request:每一次http請求會產(chǎn)生一個新的Bean實例。

代理的共有優(yōu)點:

業(yè)務類只需要關(guān)注業(yè)務邏輯本身,保證了業(yè)務類的重用性。

Java靜態(tài)代理:

代理對象和目標對象實現(xiàn)了相同的接口,目標對象作為代理對象的一個屬性,具體接口實現(xiàn)中,代理對象可以在調(diào)用目標對象相應方法前后加上其他業(yè)務處理邏輯。
缺點:一個代理類只能代理一個業(yè)務類。如果業(yè)務類增加方法時,相應的代理類也要增加方法。

Java動態(tài)代理:

Java動態(tài)代理是寫一個類實現(xiàn)InvocationHandler接口,重寫Invoke方法,在Invoke方法可以進行增強處理的邏輯的編寫,這個公共代理類在運行的時候才能明確自己要代理的對象,同時可以實現(xiàn)該被代理類的方法的實現(xiàn),然后在實現(xiàn)類方法的時候可以進行增強處理。
實際上:代理對象的方法 = 增強處理 + 被代理對象的方法

JDK和CGLIB生成動態(tài)代理類的區(qū)別:

JDK動態(tài)代理只能針對實現(xiàn)了接口的類生成代理(實例化一個類)。此時代理對象和目標對象實現(xiàn)了相同的接口,目標對象作為代理對象的一個屬性,具體接口實現(xiàn)中,可以在調(diào)用目標對象相應方法前后加上其他業(yè)務處理邏輯
CGLIB是針對類實現(xiàn)代理,主要是對指定的類生成一個子類(沒有實例化一個類),覆蓋其中的方法 。

Spring AOP應用場景

性能檢測,訪問控制,日志管理,事務等。
默認的策略是如果目標類實現(xiàn)接口,則使用JDK動態(tài)代理技術(shù),如果目標對象沒有實現(xiàn)接口,則默認會采用CGLIB代理

SpringMVC運行原理

  • 客戶端請求提交到DispatcherServlet

  • 由DispatcherServlet控制器查詢HandlerMapping,找到并分發(fā)到指定的Controller中。

  • Controller調(diào)用業(yè)務邏輯處理后,返回ModelAndView

  • DispatcherServlet查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖

  • 視圖負責將結(jié)果顯示到客戶端

一個Http請求

DNS域名解析 –> 發(fā)起TCP的三次握手 –> 建立TCP連接后發(fā)起http請求 –> 服務器響應http請求,瀏覽器得到html代碼 –> 瀏覽器解析html代碼,并請求html代碼中的資源(如javascript、css、圖片等) –> 瀏覽器對頁面進行渲染呈現(xiàn)給用戶

設(shè)計存儲海量數(shù)據(jù)的存儲系統(tǒng):

設(shè)計一個叫“中間層”的一個邏輯層,在這個層,將數(shù)據(jù)庫的海量數(shù)據(jù)抓出來,做成緩存,運行在服務器的內(nèi)存中,同理,當有新的數(shù)據(jù)到來,也先做成緩存,再想辦法,持久化到數(shù)據(jù)庫中,這是一個簡單的思路。主要的步驟是負載均衡,將不同用戶的請求分發(fā)到不同的處理節(jié)點上,然后先存入緩存,定時向主數(shù)據(jù)庫更新數(shù)據(jù)。讀寫的過程采用類似樂觀鎖的機制,可以一直讀(在寫數(shù)據(jù)的時候也可以),但是每次讀的時候會有個版本的標記,如果本次讀的版本低于緩存的版本,會重新讀數(shù)據(jù),這樣的情況并不多,可以忍受。

Session與Cookie:

Cookie可以讓服務端跟蹤每個客戶端的訪問,但是每次客戶端的訪問都必須傳回這些Cookie,如果Cookie很多,則無形的增加了客戶端與服務端的數(shù)據(jù)傳輸量,
而Session則很好地解決了這個問題,同一個客戶端每次和服務端交互時,將數(shù)據(jù)存儲通過Session到服務端,不需要每次都傳回所有的Cookie值,而是傳回一個ID,每個客戶端第一次訪問服務器生成的唯一的ID,客戶端只要傳回這個ID就行了,這個ID通常為NAME為JSESSIONID的一個Cookie。這樣服務端就可以通過這個ID,來將存儲到服務端的KV值取出了。
Session和Cookie的超時問題,Cookie的安全問題

分布式Session框架

配置服務器,Zookeeper集群管理服務器可以統(tǒng)一管理所有服務器的配置文件

共享這些Session存儲在一個分布式緩存中,可以隨時寫入和讀取,而且性能要很好,如Memcache,Tair。

封裝一個類繼承自HttpSession,將Session存入到這個類中然后再存入分布式緩存中

由于Cookie不能跨域訪問,要實現(xiàn)Session同步,要同步SessionID寫到不同域名下。

適配器模式:

將一個接口適配到另一個接口,Java I/O中InputStreamReader將Reader類適配到InputStream,從而實現(xiàn)了字節(jié)流到字符流的準換。

裝飾者模式:

保持原來的接口,增強原來有的功能。
FileInputStream 實現(xiàn)了InputStream的所有接口,BufferedInputStreams繼承自FileInputStream是具體的裝飾器實現(xiàn)者,將InputStream讀取的內(nèi)容保存在內(nèi)存中,而提高讀取的性能。

Spring事務配置方法:

1.切點信息,用于定位實施事物切面的業(yè)務類方法
2.控制事務行為的事務屬性,這些屬性包括事物隔離級別,事務傳播行為,超時時間,回滾規(guī)則。

Spring通過aop/tx Schema 命名空間和@Transaction注解技術(shù)來進行聲明式事物配置。

Mybatis

每一個Mybatis的應用程序都以一個SqlSessionFactory對象的實例為核心。首先用字節(jié)流通過Resource將配置文件讀入,然后通過SqlSessionFactoryBuilder().build方法創(chuàng)建SqlSessionFactory,然后再通過SqlSessionFactory.openSession()方法創(chuàng)建一個SqlSession為每一個數(shù)據(jù)庫事務服務。
經(jīng)歷了Mybatis初始化 –>創(chuàng)建SqlSession –>運行SQL語句,返回結(jié)果三個過程

Servlet和Filter的區(qū)別:

整的流程是:Filter對用戶請求進行預處理,接著將請求交給Servlet進行處理并生成響應,最后Filter再對服務器響應進行后處理。

Filter有如下幾個用處:

Filter可以進行對特定的url請求和相應做預處理和后處理。
在HttpServletRequest到達Servlet之前,攔截客戶的HttpServletRequest。
根據(jù)需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和數(shù)據(jù)。
在HttpServletResponse到達客戶端之前,攔截HttpServletResponse。
根據(jù)需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數(shù)據(jù)。

實際上Filter和Servlet極其相似,區(qū)別只是Filter不能直接對用戶生成響應。實際上Filter里doFilter()方法里的代碼就是從多個Servlet的service()方法里抽取的通用代碼,通過使用Filter可以實現(xiàn)更好的復用。

Filter和Servlet的生命周期:

1.Filter在web服務器啟動時初始化
2.如果某個Servlet配置了 1 ,該Servlet也是在Tomcat(Servlet容器)啟動時初始化。
3.如果Servlet沒有配置1 ,該Servlet不會在Tomcat啟動時初始化,而是在請求到來時初始化。
4.每次請求, Request都會被初始化,響應請求后,請求被銷毀。
5.Servlet初始化后,將不會隨著請求的結(jié)束而注銷。
6.關(guān)閉Tomcat時,Servlet、Filter依次被注銷。

HashMap與HashTable的區(qū)別。

1、HashMap是非線程安全的,HashTable是線程安全的。
2、HashMap的鍵和值都允許有null值存在,而HashTable則不行。
3、因為線程安全的問題,HashMap效率比HashTable的要高。

HashMap的實現(xiàn)機制:

維護一個每個元素是一個鏈表的數(shù)組,而且鏈表中的每個節(jié)點是一個Entry[]鍵值對的數(shù)據(jù)結(jié)構(gòu)。

實現(xiàn)了數(shù)組+鏈表的特性,查找快,插入刪除也快。

對于每個key,他對應的數(shù)組索引下標是 int i = hash(key.hashcode)&(len-1);

每個新加入的節(jié)點放在鏈表首,然后該新加入的節(jié)點指向原鏈表首

HashMap,ConcurrentHashMap與LinkedHashMap的區(qū)別

ConcurrentHashMap是使用了鎖分段技術(shù)技術(shù)來保證線程安全的,鎖分段技術(shù):首先將數(shù)據(jù)分成一段一段的存儲,然后給每一段數(shù)據(jù)配一把鎖,當一個線程占用鎖訪問其中一個段數(shù)據(jù)的時候,其他段的數(shù)據(jù)也能被其他線程訪問

ConcurrentHashMap 是在每個段(segment)中線程安全的

LinkedHashMap維護一個雙鏈表,可以將里面的數(shù)據(jù)按寫入的順序讀出

ConcurrentHashMap應用場景

1:ConcurrentHashMap的應用場景是高并發(fā),但是并不能保證線程安全,而同步的HashMap和HashMap的是鎖住整個容器,而加鎖之后ConcurrentHashMap不需要鎖住整個容器,只需要鎖住對應的Segment就好了,所以可以保證高并發(fā)同步訪問,提升了效率。
2:可以多線程寫。
ConcurrentHashMap把HashMap分成若干個Segmenet
1.get時,不加鎖,先定位到segment然后在找到頭結(jié)點進行讀取操作。而value是volatile變量,所以可以保證在競爭條件時保證讀取最新的值,如果讀到的value是null,則可能正在修改,那么就調(diào)用ReadValueUnderLock函數(shù),加鎖保證讀到的數(shù)據(jù)是正確的。
2.Put時會加鎖,一律添加到hash鏈的頭部。
3.Remove時也會加鎖,由于next是final類型不可改變,所以必須把刪除的節(jié)點之前的節(jié)點都復制一遍。
4.ConcurrentHashMap允許多個修改操作并發(fā)進行,其關(guān)鍵在于使用了鎖分離技術(shù)。它使用了多個鎖來控制對Hash表的不同Segment進行的修改。

ConcurrentHashMap的應用場景是高并發(fā),但是并不能保證線程安全,而同步的HashMap和HashTable的是鎖住整個容器,而加鎖之后ConcurrentHashMap不需要鎖住整個容器,只需要鎖住對應的segment就好了,所以可以保證高并發(fā)同步訪問,提升了效率。

ConcurrentHashMap能夠保證每一次調(diào)用都是原子操作,但是并不保證多次調(diào)用之間也是原子操作。

Linux常用命令:

cd,cp,mv,rm,ps(進程),tar,cat(查看內(nèi)容),chmod,vim,find,ls

死鎖的必要條件

  • 互斥 至少有一個資源處于非共享狀態(tài)

  • 占有并等待

  • 非搶占

  • 循環(huán)等待

解決死鎖,第一個是死鎖預防,就是不讓上面的四個條件同時成立。二是,合理分配資源。
三是使用銀行家算法,如果該進程請求的資源操作系統(tǒng)剩余量可以滿足,那么就分配。

進程間的通信方式

  • 管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動,而且只能在具有親緣關(guān)系的進程間使用。進程的親緣關(guān)系通常是指父子進程關(guān)系。

  • 有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進程間的通信。

  • 信號量( semophore ) : 信號量是一個計數(shù)器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內(nèi)不同線程之間的同步手段。

  • 消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內(nèi)核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點。

  • 信號 ( sinal ) : 信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經(jīng)發(fā)生。

  • 共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進程所訪問的內(nèi)存,這段共享內(nèi)存由一個進程創(chuàng)建,但多個進程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設(shè)計的。它往往與其他通信機制,如信號量,配合使用,來實現(xiàn)進程間的同步和通信。

  • 套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同機器間的進程通信。

hibernate一級緩存

Hibernate的一級緩存是由Session提供的,因此它只存在于Session的生命周期中,當程序調(diào)用save(),update(),saveOrUpdate()等方法 及調(diào)用查詢接口list,filter,iterate時,如Session緩存中還不存在相應的對象,Hibernate會把該對象加入到一級緩存中,當Session關(guān)閉的時候緩存也會消失。

Hibernate的一級緩存是Session所內(nèi)置的,不能被卸載,也不能進行任何配置一級緩存采用的是key-value的Map方式來實現(xiàn)的,在緩存實體對象時,對象的主關(guān)鍵字ID是Map的key,實體對象就是對應的值。

Hibernate二級緩存:

把獲得的所有數(shù)據(jù)對象根據(jù)ID放入到第二級緩存中。Hibernate二級緩存策略,是針對于ID查詢的緩存策略,刪除、更新、增加數(shù)據(jù)的時候,同時更新緩存。

進程和線程的區(qū)別:

進程:每個進程都有獨立的代碼和數(shù)據(jù)空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1–n個線程。

線程:同一類線程共享代碼和數(shù)據(jù)空間,每個線程有獨立的運行棧和程序計數(shù)器(PC),線程切換開銷小。

線程和進程一樣分為五個階段:創(chuàng)建、就緒、運行、阻塞、終止。

多進程是指操作系統(tǒng)能同時運行多個任務(程序)。

多線程是指在同一程序中有多個順序流在執(zhí)行。

在java中要想實現(xiàn)多線程,有三種手段,一種是繼續(xù)Thread類,另外一種是實現(xiàn)Runable接口,還有就是實現(xiàn)Callable接口。

Switch能否用string做參數(shù)?

a.在 Java 7 之前, switch 只能支持byte,short,char,int 或者其對應的封裝類以及 Enum 類型。在Java 7中,String 支持被加上了。

Object有哪些公用方法?

a.方法equals測試的是兩個對象是否相等

b.方法clone進行對象拷貝

c.方法getClass返回和當前對象相關(guān)的Class對象

d.方法notify,notifyall,wait都是用來對給定對象進行線程同步的

Override和Overload的含義以及區(qū)別

a.Overload顧名思義是重新加載,它可以表現(xiàn)類的多態(tài)性,可以是函數(shù)里面可以有相同的函數(shù)名但是參數(shù)名、返回值、類型不能相同;或者說可以改變參數(shù)、類型、返回值但是函數(shù)名字依然不變。
b.就是ride(重寫)的意思,在子類繼承父類的時候子類中可以定義某方法與其父類有相同的名稱和參數(shù),當子類在調(diào)用這一函數(shù)時自動調(diào)用子類的方法,而父類相當于被覆蓋(重寫)了。
具體可前往C++中重載、重寫(覆蓋)的區(qū)別實例分析查看

抽象類和接口的區(qū)別

a.一個類只能繼承單個類,但是可以實現(xiàn)多個接口

b.抽象類中可以有構(gòu)造方法,接口中不能有構(gòu)造方法

c.抽象類中的所有方法并不一定要是抽象的,你可以選擇在抽象類中實現(xiàn)一些基本的方法。而接口要求所有的方法都必須是抽象的

d.抽象類中可以包含靜態(tài)方法,接口中不可以

e.抽象類中可以有普通成員變量,接口中不可以

解析XML的幾種方式的原理與特點:DOM、SAX、PULL

a.DOM:消耗內(nèi)存:先把xml文檔都讀到內(nèi)存中,然后再用DOM API來訪問樹形結(jié)構(gòu),并獲取數(shù)據(jù)。這個寫起來很簡單,但是很消耗內(nèi)存。要是數(shù)據(jù)過大,手機不夠牛逼,可能手機直接死機

b.SAX:解析效率高,占用內(nèi)存少,基于事件驅(qū)動的:更加簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結(jié)束、元素(element)開始與結(jié)束、文檔(document)結(jié)束等地方時通知事件處理函數(shù),由事件處理函數(shù)做相應動作,然后繼續(xù)同樣的掃描,直至文檔結(jié)束。

c.PULL:與 SAX 類似,也是基于事件驅(qū)動,我們可以調(diào)用它的next()方法,來獲取下一個解析事件(就是開始文檔,結(jié)束文檔,開始標簽,結(jié)束標簽),當處于某個元素時可以調(diào)用XmlPullParser的getAttributte()方法來獲取屬性的值,也可調(diào)用它的nextText()獲取本節(jié)點的值。

wait()和sleep()的區(qū)別

sleep來自Thread類,和wait來自O(shè)bject類

調(diào)用sleep()方法的過程中,線程不會釋放對象鎖。而 調(diào)用 wait 方法線程會釋放對象鎖

sleep睡眠后不出讓系統(tǒng)資源,wait讓出系統(tǒng)資源其他線程可以占用CPU

sleep(milliseconds)需要指定一個睡眠時間,時間一到會自動喚醒

JAVA 中堆和棧的區(qū)別,說下java 的內(nèi)存機制

a.基本數(shù)據(jù)類型比變量和對象的引用都是在棧分配的

b.堆內(nèi)存用來存放由new創(chuàng)建的對象和數(shù)組

c.類變量(static修飾的變量),程序在一加載的時候就在堆中為類變量分配內(nèi)存,堆中的內(nèi)存地址存放在棧中

d.實例變量:當你使用java關(guān)鍵字new的時候,系統(tǒng)在堆中開辟并不一定是連續(xù)的空間分配給變量,是根據(jù)零散的堆內(nèi)存地址,通過哈希算法換算為一長串數(shù)字以表征這個變量在堆中的”物理位置”,實例變量的生命周期–當實例變量的引用丟失后,將被GC(垃圾回收器)列入可回收“名單”中,但并不是馬上就釋放堆中內(nèi)存

e.局部變量: 由聲明在某方法,或某代碼段里(比如for循環(huán)),執(zhí)行到它的時候在棧中開辟內(nèi)存,當局部變量一但脫離作用域,內(nèi)存立即釋放

JAVA多態(tài)的實現(xiàn)原理

a.抽象的來講,多態(tài)的意思就是同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式。(發(fā)送消息就是函數(shù)調(diào)用)

b.實現(xiàn)的原理是動態(tài)綁定,程序調(diào)用的方法在運行期才動態(tài)綁定,追溯源碼可以發(fā)現(xiàn),JVM 通過參數(shù)的自動轉(zhuǎn)型來找到合適的辦法。

總結(jié)

以上是生活随笔為你收集整理的“面试不败计划”:各大公司Java后端开发面试题总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。