更新時間:2019-08-08 13:50:12 來源:動力節點 瀏覽2559次
List和Set比較,各自的子類比較
對比一:Arraylist與LinkedList的比較
1、ArrayList是實現了基于動態數組的數據結構,因為地址連續,一旦數據存儲好了,查詢操作效率會比較高(在內存里是連著放的)。
2、因為地址連續,ArrayList要移動數據,所以插入和刪除操作效率比較低。
3、LinkedList基于鏈表的數據結構,地址是任意的,所以在開辟內存空間的時候不需要等一個連續的地址,對于新增和刪除操作add和remove,LinedList比較占優勢。
4、因為LinkedList要移動指針,所以查詢操作性能比較低。
適用場景分析:
當需要對數據進行對此訪問的情況下選用ArrayList,當需要對數據進行多次增加刪除修改時采用LinkedList。
對比二:ArrayList與Vector的比較
1、Vector的方法都是同步的,是線程安全的,而ArrayList的方法不是,由于線程的同步必然要影響性能。因此,ArrayList的性能比Vector好。
2、當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣。ArrayList就有利于節約內存空間。
3、大多數情況不使用Vector,因為性能不好,但是它支持線程的同步,即某一時刻只有一個線程能夠寫Vector,避免多線程同時寫而引起的不一致性。
4、Vector可以設置增長因子,而ArrayList不可以。
適用場景分析:
1、Vector是線程同步的,所以它也是線程安全的,而ArrayList是線程異步的,是不安全的。如果不考慮到線程的安全因素,一般用ArrayList效率比較高。
2、如果集合中的元素的數目大于目前集合數組的長度時,在集合中使用數據量比較大的數據,用Vector有一定的優勢。
對比三:HashSet與TreeSet的比較
1.TreeSet是二叉樹實現的,Treeset中的數據是自動排好序的,不允許放入null值。
2.HashSet是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重復,就如數據庫中唯一約束。
3.HashSet要求放入的對象必須實現HashCode()方法,放入的對象,是以hashcode碼作為標識的,而具有相同內容的String對象,hashcode是一樣,所以放入的內容不能重復。但是同一個類的對象可以放入不同的實例。
適用場景分析:
HashSet是基于Hash算法實現的,其性能通常都優于TreeSet。我們通常都應該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet。
HashMap和ConcurrentHashMap的區別
1、HashMap不是線程安全的,而ConcurrentHashMap是線程安全的。
2、ConcurrentHashMap采用鎖分段技術,將整個Hash桶進行了分段segment,也就是將這個大的數組分成了幾個小的片段segment,而且每個小的片段segment上面都有鎖存在,那么在插入元素的時候就需要先找到應該插入到哪一個片段segment,然后再在這個片段上面進行插入,而且這里還需要獲取segment鎖。
3、ConcurrentHashMap讓鎖的粒度更精細一些,并發性能更好。
至于兩者的底層實現,你如果想通過一篇文章就理解了,那就tooyoung了,好好找些博文+看源碼去吧。
HashTable和ConcurrentHashMap的區別
它們都可以用于多線程的環境,但是當Hashtable的大小增加到一定的時候,性能會急劇下降,因為迭代時需要被鎖定很長的時間。因為ConcurrentHashMap引入了分割(segmentation),不論它變得多么大,僅僅需要鎖定map的某個部分,而其它的線程不需要等到迭代完成才能訪問map。簡而言之,在迭代的過程中,ConcurrentHashMap僅僅鎖定map的某個部分,而Hashtable則會鎖定整個map。
String,StringBuffer和StringBuilder的區別
1、運行速度,或者說是執行速度,在這方面運行速度快慢為:StringBuilder>StringBuffer>String。
2、線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的。
適用場景分析:
String:適用于少量的字符串操作的情況
StringBuilder:適用于單線程下在字符緩沖區進行大量操作的情況
StringBuffer:適用多線程下在字符緩沖區進行大量操作的情況
wait和sleep的區別
1、sleep()方法是屬于Thread類中的,而wait()方法,則是屬于Object類中的。
2、sleep()方法導致了程序暫停執行指定的時間,讓出cpu給其他線程,但是他的監控狀態依然保持著,當指定的時間到了又會自動恢復運行狀態。所以在調用sleep()方法的過程中,線程不會釋放對象鎖。
3、調用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用notify()方法后本線程才進入對象鎖定池準備獲取對象鎖進入運行狀態。
JVM的內存結構
根據JVM規范,JVM內存共分為虛擬機棧、堆、方法區、程序計數器、本地方法棧五個部分。
1、Java虛擬機棧:
線程私有;每個方法在執行的時候會創建一個棧幀,存儲了局部變量表,操作數棧,動態連接,方法返回地址等;每個方法從調用到執行完畢,對應一個棧幀在虛擬機棧中的入棧和出棧。
2、堆:
線程共享;被所有線程共享的一塊內存區域,在虛擬機啟動時創建,用于存放對象實例。
3、方法區:
線程共享;被所有線程共享的一塊內存區域;用于存儲已被虛擬機加載的類信息,常量,靜態變量等。
4、程序計數器:
線程私有;是當前線程所執行的字節碼的行號指示器,每條線程都要有一個獨立的程序計數器,這類內存也稱為“線程私有”的內存。
5、本地方法棧:
線程私有;主要為虛擬機使用到的Native方法服務。
強引用,軟引用和弱引用的區別
強引用:
只有這個引用被釋放之后,對象才會被釋放掉,只要引用存在,垃圾回收器永遠不會回收,這是最常見的New出來的對象。
軟引用:
內存溢出之前通過代碼回收的引用。軟引用主要用戶實現類似緩存的功能,在內存足夠的情況下直接通過軟引用取值,無需從繁忙的真實來源查詢數據,提升速度;當內存不足時,自動刪除這部分緩存數據,從真正的來源查詢這些數據。
弱引用:
第二次垃圾回收時回收的引用,短時間內通過弱引用取對應的數據,可以取到,當執行過第二次垃圾回收時,將返回null。弱引用主要用于監控對象是否已經被垃圾回收器標記為即將回收的垃圾,可以通過弱引用的isEnQueued方法返回對象是否被垃圾回收器標記。
數組在內存中如何分配
1、簡單的值類型的數組,每個數組成員是一個引用(指針),引用到棧上的空間(因為值類型變量的內存分配在棧上)
2、引用類型,類類型的數組,每個數組成員仍是一個引用(指針),引用到堆上的空間(因為類的實例的內存分配在堆上)
springmvc的核心是什么,請求的流程是怎么處理的,控制反轉怎么實現的
核心:
控制反轉和面向切面
請求處理流程:
1、首先用戶發送請求到前端控制器,前端控制器根據請求信息(如URL)來決定選擇哪一個頁面控制器進行處理并把請求委托給它,即以前的控制器的控制邏輯部分;
2、頁面控制器接收到請求后,進行功能處理,首先需要收集和綁定請求參數到一個對象,并進行驗證,然后將命令對象委托給業務對象進行處理;處理完畢后返回一個ModelAndView(模型數據和邏輯視圖名);
3、前端控制器收回控制權,然后根據返回的邏輯視圖名,選擇相應的視圖進行渲染,并把模型數據傳入以便視圖渲染;
4、前端控制器再次收回控制權,將響應返回給用戶。
控制反轉如何實現:
我們每次使用spring框架都要配置xml文件,這個xml配置了bean的id和class。
spring中默認的bean為單實例模式,通過bean的class引用反射機制可以創建這個實例。
因此,spring框架通過反射替我們創建好了實例并且替我們維護他們。
A需要引用B類,spring框架就會通過xml把B實例的引用傳給了A的成員變量。
mybatis如何處理結果集
MyBatis的結果集是通過反射來實現的。并不是通過get/set方法。在實體類中無論是否定義get/set()方法,都是可以接收到的。
如果面試只是考你這個點的話就恭喜了。如果繼續深問流程,那就需要自己找一些源碼來閱讀了。
java的多態表現在哪里
主要有兩種表現形式:重載和重寫
重載:
是發生在同一類中,具有相同的方法名,主要是看參數的個數,類型,順序不同實現方法的重載的,返回值的類型可以不同。
重寫:
是發生在兩個類中(父類和子類),具有相同的方法名,主要看方法中參數,個數,類型必須相同,返回值的類型必須相同。
接口有什么用
1、通過接口可以實現不相關類的相同行為,而不需要了解對象所對應的類。
2、通過接口可以指明多個類需要實現的方法。
3、通過接口可以了解對象的交互界面,而不需了解對象所對應的類。
另:Java是單繼承,接口可以使其實現多繼承的功能。
說說http,https協議
HTTP:
是互聯網上應用最為廣泛的一種網絡協議,是一個客戶端和服務器端請求和應答的標準(TCP),用于從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網絡傳輸減少。
HTTPS:
是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。
區別:
1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
2、http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
4、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
說說tcp/ip協議族
TCP/IP協議族是一個四層協議系統,自底而上分別是數據鏈路層、網絡層、傳輸層和應用層。每一層完成不同的功能,且通過若干協議來實現,上層協議使用下層協議提供的服務。
1、數據鏈路層負責幀數據的傳遞。
2、網絡層責數據怎樣傳遞過去。
3、傳輸層負責傳輸數據的控制(準確性、安全性)
4、應用層負責數據的展示和獲取。
tcp五層網絡協議
物理層:
為數據端設備提供傳送數據的通路,數據通路可以是一個物理媒體,也可以是多個物理媒體連接而成。
數據鏈路層:
為網絡層提供數據傳送服務。
網絡層:
路由選擇和中繼、激活,終止網絡連接、在一條數據鏈路上復用多條網絡連接,多采取分時復用技術、差錯檢測與恢復、排序,流量控制、服務選擇、網絡管理。
傳輸層:
傳輸層是兩臺計算機經過網絡進行數據通信時,第一個端到端的層次,具有緩沖作用。
應用層:
應用層向應用程序提供服務
TCP與UDP的區別
1、基于連接與無連接
2、TCP要求系統資源較多,UDP較少;
3、UDP程序結構較簡單
4、流模式(TCP)與數據報模式(UDP);
5、TCP保證數據正確性,UDP可能丟包
6、TCP保證數據順序,UDP不保證
cookie和session的區別,分布式環境怎么保存用戶狀態
1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙,考慮到安全應當使用session。
3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能,考慮到減輕服務器性能方面,應當使用COOKIE。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
分布式環境下的session(舉例兩種):
服務器session復制
原理:任何一個服務器上的session發生改變(增刪改),該節點會把這個session的所有內容序列化,然后廣播給所有其它節點,不管其他服務器需不需要session,以此來保證Session同步。
優點:可容錯,各個服務器間session能夠實時響應。
缺點:會對網絡負荷造成一定壓力,如果session量大的話可能會造成網絡堵塞,拖慢服務器性能。
session共享機制
GIT和SVN的區別
1、GIT是分布式的,SVN不是。
2、GIT把內容按元數據方式存儲,而SVN是按文件。
3、GIT分支和SVN的分支不同。
4、GIT沒有一個全局的版本號,而SVN有。
5、GIT的內容完整性要優于SVN。
更多Java相關面試題,登錄動力節點IT培訓官網。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習