1.static關(guān)鍵字的含義,是否可以重寫私有方法或靜態(tài)方法,為什么?
1.static關(guān)鍵字:
簡單:static關(guān)鍵字表明一個(gè)成員變量或者成員方法可以在沒有所屬的類的實(shí)例變量的情況下被訪問。
詳細(xì):通常來說,當(dāng)創(chuàng)建類時(shí),就是在描述那個(gè)類的對象的外觀與行為。除非用new創(chuàng)建那個(gè)對象,否則,實(shí)際上并未獲得任何對象。執(zhí)行new來創(chuàng)建對象的時(shí)候,數(shù)據(jù)存儲空間才被分配,其方法才供外界調(diào)用。有兩種情形用上述方法是無法解決的。一種情形是,只想為某特定域分配單一存儲空間,而不去考慮究竟要創(chuàng)建多少個(gè)對象,甚至根本不需要創(chuàng)建任何對象。另一種情形是,希望某個(gè)方法不與包含他的類的任何對象關(guān)聯(lián)在一起。也就是說,即使沒有創(chuàng)建對象,也能夠調(diào)用方法。簡單來說,static的主要目的就是創(chuàng)建獨(dú)立于具體對象的域變量與方法。
可見,static變量并不是所在類的某個(gè)具體對象所有,而是該類的所有對象所共有的,靜態(tài)變量既能被對象調(diào)用,也能直接拿類來調(diào)用。除此之外,靜態(tài)變量不能引用非靜態(tài)方法,原因正如前面描述靜態(tài)加載時(shí)機(jī)中說的那樣,加載靜態(tài)的時(shí)候,非靜態(tài)的變量、方法等還不存在,當(dāng)然就無法引用了。但是,非靜態(tài)方法或類卻能正常引用靜態(tài)變量或方法。因?yàn)榉庆o態(tài)總是在靜態(tài)之后出現(xiàn)的。靜態(tài)方法和靜態(tài)變量一樣,屬于類所有,在類加載的同時(shí)執(zhí)行,不屬于某個(gè)具體的對象,所有對象均能調(diào)用。
2.不可以重寫私有方法,因?yàn)樗接蟹椒ú荒鼙蛔宇愒L問,所以無法重寫;
3.靜態(tài)方法不依賴類就可以訪問。這就是它的用途啊,沒有new對象可調(diào)用的方法。然而,重寫是依賴對象的。重寫父類的某一方法,而static不依賴類。
2.抽象類和接口有什么區(qū)別?
1.抽象類和接口都不能夠?qū)嵗?,但可以定義抽象類和接口類型的引用。
2.一個(gè)類如果繼承了某個(gè)抽象類或者實(shí)現(xiàn)了某個(gè)接口都需要對其中的抽象方法全部進(jìn)行實(shí)現(xiàn),否則該類仍然需要被聲明為抽象類。
3.接口比抽象類更加抽象,因?yàn)槌橄箢愔锌梢远x構(gòu)造器,可以有抽象方法和具體方法,而接口中不能定義構(gòu)造器而且其中的方法全部都是抽象方法。
4.抽象類中的成員可以是private、默認(rèn)、protected、public的,而接口中的成員全都是public的。
5.抽象類中可以定義成員變量,而接口中定義的成員變量實(shí)際上都是常量。
6.有抽象方法的類必須被聲明為抽象類,而抽象類未必要有抽象方法。
3.為什么java在實(shí)現(xiàn)equals必須要同時(shí)實(shí)現(xiàn)hashcode方法?
原文地址:why在重寫equals時(shí)還必須重寫hashcode方法 - 發(fā)表是最好的記憶 - 博客園
首先我們先來看下String類的源碼:可以發(fā)現(xiàn)String是重寫了Object類的equals方法的,并且也重寫了hashcode方法
1、如果兩個(gè)對象相同(即用equals比較返回true),那么它們的hashCode值一定要相同;
2、如果兩個(gè)對象的hashCode相同,它們并不一定相同(即用equals比較返回false)
自我的理解:
由于為了提高程序的效率才實(shí)現(xiàn)了hashcode方法,先進(jìn)行hashcode的比較,如果不同,那沒就不必在進(jìn)行equals的比較了,這樣就大大減少了equals比較的次數(shù),這對比需要比較的數(shù)量很大的效率提高是很明顯的,一個(gè)很好的例子就是在集合中的使用;
我們都知道java中的List集合是有序的,因此是可以重復(fù)的,而set集合是無序的,因此是不能重復(fù)的,那么怎么能保證不能被放入重復(fù)的元素呢,但靠equals方法一樣比較的話,如果原來集合中以后又10000個(gè)元素了,那么放入10001個(gè)元素,難道要將前面的所有元素都進(jìn)行比較,看看是否有重復(fù),歐碼噶的,這個(gè)效率可想而知,因此hashcode就應(yīng)遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是將對象數(shù)據(jù)根據(jù)該對象的特征使用特定的算法將其定義到一個(gè)地址上,那么在后面定義進(jìn)來的數(shù)據(jù)只要看對應(yīng)的hashcode地址上是否有值,那么就用equals比較,如果沒有則直接插入,只要就大大減少了equals的使用次數(shù),執(zhí)行效率就大大提高了。
繼續(xù)上面的話題,為什么必須要重寫hashcode方法,其實(shí)簡單的說就是為了保證同一個(gè)對象,保證在equals相同的情況下hashcode值必定相同,如果重寫了equals而未重寫hashcode方法,可能就會出現(xiàn)兩個(gè)沒有關(guān)系的對象equals相同的(因?yàn)閑qual都是根據(jù)對象的特征進(jìn)行重寫的),但hashcode確實(shí)不相同的。
4.請描述statement和preparedStatement的區(qū)別?
與Statement相比,①PreparedStatement接口代表預(yù)編譯的語句,它主要的優(yōu)勢在于可以減少SQL的編譯錯誤并增加SQL的安全性(減少SQL注射攻擊的可能性);②PreparedStatement中的SQL語句是可以帶參數(shù)的,避免了用字符串連接拼接SQL語句的麻煩和不安全;③當(dāng)批量處理SQL或頻繁執(zhí)行相同的查詢時(shí),PreparedStatement有明顯的性能上的優(yōu)勢,由于數(shù)據(jù)庫可以將編譯優(yōu)化后的SQL語句緩存起來,下次執(zhí)行相同結(jié)構(gòu)的語句時(shí)就會很快(不用再次編譯和生成執(zhí)行計(jì)劃)
5.闡述ArrayList、Vector、LinkedList的存儲性能和特性。?
ArrayList 和Vector都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素?cái)?shù)大于實(shí)際存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數(shù)組元素移動等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector中的方法由于添加了synchronized修飾,因此Vector是線程安全的容器,但性能上較ArrayList差,因此已經(jīng)是Java中的遺留容器。LinkedList使用雙向鏈表實(shí)現(xiàn)存儲(將內(nèi)存中零散的內(nèi)存單元通過附加的引用關(guān)聯(lián)起來,形成一個(gè)可以按序號索引的線性結(jié)構(gòu),這種鏈?zhǔn)酱鎯Ψ绞脚c數(shù)組的連續(xù)存儲方式相比,內(nèi)存的利用率更高),按序號索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時(shí)只需要記錄本項(xiàng)的前后項(xiàng)即可,所以插入速度較快。Vector屬于遺留容器(Java早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遺留容器),已經(jīng)不推薦使用,但是由于ArrayList和LinkedListed都是非線程安全的,如果遇到多個(gè)線程操作同一個(gè)容器的場景,則可以通過工具類Collections中的synchronizedList方法將其轉(zhuǎn)換成線程安全的容器后再使用(這是對裝潢模式的應(yīng)用,將已有對象傳入另一個(gè)類的構(gòu)造器中創(chuàng)建新的對象來增強(qiáng)實(shí)現(xiàn))。
注:ArrayList和LinkedList的區(qū)別
ArrayList和LinkedList的大致區(qū)別如下:1.ArrayList是實(shí)現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。?2.對于隨機(jī)訪問get和set,ArrayList覺得優(yōu)于LinkedList,因?yàn)長inkedList要移動指針。?3.對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因?yàn)锳rrayList要移動數(shù)據(jù)。
上代碼:
當(dāng)我們在集合中裝5萬條數(shù)據(jù),測試運(yùn)行結(jié)果如下:

顯然我們可以看出ArrayList更適合讀取數(shù)據(jù),linkedList更多的時(shí)候添加或刪除數(shù)據(jù)。
ArrayList內(nèi)部是使用可増長數(shù)組實(shí)現(xiàn)的,所以是用get和set方法是花費(fèi)常數(shù)時(shí)間的,但是如果插入元素和刪除元素,除非插入和刪除的位置都在表末尾,否則代碼開銷會很大,因?yàn)槔锩嫘枰獢?shù)組的移動。LinkedList是使用雙鏈表實(shí)現(xiàn)的,所以get會非常消耗資源,除非位置離頭部很近。但是插入和刪除元素花費(fèi)常數(shù)時(shí)間。
6.闡述ArrayList和數(shù)組的區(qū)別
ArrayList可以算是Array的加強(qiáng)版,(對array有所取舍的加強(qiáng))。?
存儲內(nèi)容比較:
? ? Array數(shù)組可以包含基本類型和對象類型,
? ? ArrayList卻只能包含對象類型。
但是需要注意的是:Array數(shù)組在存放的時(shí)候一定是同種類型的元素。ArrayList就不一定了,因?yàn)锳rrayList可以存儲Object。
空間大小比較:
? ? ? ? ? 它的空間大小是固定的,空間不夠時(shí)也不能再次申請,所以需要事前確定合適的空間大小。
? ? ? ? ? ArrayList的空間是動態(tài)增長的,如果空間不夠,它會創(chuàng)建一個(gè)空間比原空間大一倍的新數(shù)組,然后將所有元素復(fù)制到新數(shù)組中,接著拋棄舊數(shù)組。而且,每次添加新的元素的時(shí)候都會檢查內(nèi)部數(shù)組的空間是否足夠。(比較麻煩的地方)。
方法上的比較:
ArrayList作為Array的增強(qiáng)版,當(dāng)然是在方法上比Array更多樣化,比如添加全部addAll()、刪除全部removeAll()、返回迭代器iterator()等。
適用場景:
如果想要保存一些在整個(gè)程序運(yùn)行期間都會存在而且不變的數(shù)據(jù),我們可以將它們放進(jìn)一個(gè)全局?jǐn)?shù)組里,但是如果我們單純只是想要以數(shù)組的形式保存數(shù)據(jù),而不對數(shù)據(jù)進(jìn)行增加等操作,只是方便我們進(jìn)行查找的話,那么,我們就選擇ArrayList。而且還有一個(gè)地方是必須知道的,就是如果我們需要對元素進(jìn)行頻繁的移動或刪除,或者是處理的是超大量的數(shù)據(jù),那么,使用ArrayList就真的不是一個(gè)好的選擇,因?yàn)樗男屎艿?,使用?shù)組進(jìn)行這樣的動作就很麻煩,那么,我們可以考慮選擇LinkedList。
7.final與finally的區(qū)別,為什么內(nèi)部類訪問的外部變量需要final來修飾
a.final是一個(gè)關(guān)鍵字,修飾變量那么變量初始化之后就不可改變,修飾類則不可以繼承,修飾方法,那么方法就不可以被重寫,而finally與try,catch語句塊一起使用,始終執(zhí)行。
b.當(dāng)使用成員內(nèi)部類時(shí),它可以直接訪問外類的變量(public、默認(rèn)、private權(quán)限修飾符修飾的),不會出現(xiàn)問題;而在使用它訪問局部變量時(shí),Java8以前的版本會報(bào)錯:從內(nèi)部類中訪問本地變量a,需要被聲明為最終類型。這時(shí)候你在變量前面加個(gè)狀態(tài)修飾符final,就能正常運(yùn)行了。
我們知道,當(dāng)方法調(diào)用完以后,方法就會被當(dāng)作垃圾而被回收,可是局部內(nèi)部類創(chuàng)建的對象在堆內(nèi)存,它并不會立即消失,相反,它仍存在,并且仍在調(diào)用局部變量,這顯然與局部變量已被銷毀矛盾。這時(shí)候Java語言提供了一個(gè)巧妙的解決辦法,用狀態(tài)修飾符final修飾該變量,從而該變量成了常量,解決了這個(gè)問題。
8.fileReader和bufferedReader的執(zhí)行速度
a.首先摘錄一段在百度里面搜索到的關(guān)于緩沖區(qū)的作用以及效果描述:這么說吧,緩沖區(qū)的主要目的是加速的, 內(nèi)存的緩沖區(qū)讀寫速度要遠(yuǎn)遠(yuǎn)快于硬盤,如果讀一點(diǎn)從硬盤文件取一點(diǎn),或者有一點(diǎn)內(nèi)容就直接寫到硬盤文件一點(diǎn),速度會比較慢
舉一個(gè)例子,只是為了好理解,實(shí)際情況并不完全一樣,我要從某學(xué)生宿舍(相當(dāng)于硬盤)開車接送98個(gè)學(xué)生到公司(相當(dāng)于CPU)來進(jìn)行面試.接一個(gè)學(xué)生過來,面試完送一個(gè)回去,再接另一個(gè)過來,速度會很慢
我在公司找兩個(gè)10人房間(相當(dāng)于緩沖區(qū)),一次接10個(gè)學(xué)生在等待面試房間(read緩存)里,面試一個(gè),送進(jìn)等待送回房間(write緩存),等待面試房間空了,自動再接10個(gè).
同樣的,等待送回房間滿10人后自動一起送回去.......這樣是不是快得多?
b.當(dāng)BufferedReader在讀取文本文件時(shí),會先盡量從文件中讀入字符數(shù)據(jù)并置入緩沖區(qū),而之后若使用read()方法,會先從緩沖區(qū)中進(jìn)行讀取,如果緩沖區(qū)數(shù)據(jù)不足,才會再從文件中讀取。
FileReader : 字符流
BufferedReader : 也是字符流,但是在BufferedReader可以先把數(shù)據(jù)放到一個(gè)緩存區(qū)里,然后在進(jìn)行處理,而且在BufferedReader 里有一個(gè)readLine()方法。
9.請描述一下ArrayBlockingQueue和LinkedBlockingQueue的區(qū)別和聯(lián)系
詳細(xì)的解釋摘自ArrayBlockingQueue與LinkedBlockingQueue - 簡書
隊(duì)列中鎖的實(shí)現(xiàn)不同
ArrayBlockingQueue實(shí)現(xiàn)的隊(duì)列中的鎖是沒有分離的,即生產(chǎn)和消費(fèi)用的是同一個(gè)鎖;
LinkedBlockingQueue實(shí)現(xiàn)的隊(duì)列中的鎖是分離的,即生產(chǎn)用的是putLock,消費(fèi)是takeLock
在生產(chǎn)或消費(fèi)時(shí)操作不同
ArrayBlockingQueue實(shí)現(xiàn)的隊(duì)列中在生產(chǎn)和消費(fèi)的時(shí)候,是直接將枚舉對象插入或移除的;
LinkedBlockingQueue實(shí)現(xiàn)的隊(duì)列中在生產(chǎn)和消費(fèi)的時(shí)候,需要把枚舉對象轉(zhuǎn)換為Node進(jìn)行插入或移除,會影響性能
隊(duì)列大小初始化方式不同
ArrayBlockingQueue實(shí)現(xiàn)的隊(duì)列中必須指定隊(duì)列的大小;
LinkedBlockingQueue實(shí)現(xiàn)的隊(duì)列中可以不指定隊(duì)列的大小,但是默認(rèn)是Integer.MAX_VALUE
4.ArrayBlockingQueue采用的是數(shù)組,LinkedBlockingQueue采用的是單向鏈表
put? take 實(shí)現(xiàn)原理:
里面有兩個(gè)顯式條件隊(duì)列Condition? 由ReentrantLock? newConditon()得到
一個(gè)為notFull:沒有滿
另一個(gè)為notEmpty:不是空的
final Object[] items;緩沖隊(duì)列
當(dāng)put一個(gè)元素時(shí)先判斷是不是滿的如果是九調(diào)用notFull.await()阻塞到不是滿的
添加成功之后調(diào)用notEmpty.singnal();通知消費(fèi)者有產(chǎn)品可消費(fèi)了,解除消費(fèi)者阻塞
當(dāng)take一個(gè)元素時(shí)先判斷是不是空的如果是空的先調(diào)用notEmpty.await()阻塞,如果取得了元素(從items里面移除),就調(diào)用notFull.singnal()喚醒并阻塞的生產(chǎn)者。
10.你描述一下使用過的java.util.concurrent包下的類 以及使用場景
鏈接一下:java 并發(fā) concurrent 包 - CSDN博客
11.SpringMVC中如何實(shí)現(xiàn)參數(shù)的解析
鏈接:SpringMVC之分析請求參數(shù)的解析過程(一) - 程序園
12.springMVC中IOC和AOP的理解
鏈接:Spring面試,IoC和AOP的理解 - Sandy_wu
13.session和cookie之間的區(qū)別和聯(lián)系
1. 由于HTTP協(xié)議是無狀態(tài)的協(xié)議,所以服務(wù)端需要記錄用戶的狀態(tài)時(shí),就需要用某種機(jī)制來識具體的用戶,這個(gè)機(jī)制就是Session.典型的場景比如購物車,當(dāng)你點(diǎn)擊下單按鈕時(shí),由于HTTP協(xié)議無狀態(tài),所以并不知道是哪個(gè)用戶操作的,所以服務(wù)端要為特定的用戶創(chuàng)建了特定的Session,用用于標(biāo)識這個(gè)用戶,并且跟蹤用戶,這樣才知道購物車?yán)锩嬗袔妆緯?。這個(gè)Session是保存在服務(wù)端的,有一個(gè)唯一標(biāo)識。在服務(wù)端保存Session的方法很多,內(nèi)存、數(shù)據(jù)庫、文件都有。集群的時(shí)候也要考慮Session的轉(zhuǎn)移,在大型的網(wǎng)站,一般會有專門的Session服務(wù)器集群,用來保存用戶會話,這個(gè)時(shí)候 Session 信息都是放在內(nèi)存的,使用一些緩存服務(wù)比如Memcached之類的來放 Session。
2. 思考一下服務(wù)端如何識別特定的客戶?這個(gè)時(shí)候Cookie就登場了。每次HTTP請求的時(shí)候,客戶端都會發(fā)送相應(yīng)的Cookie信息到服務(wù)端。實(shí)際上大多數(shù)的應(yīng)用都是用 Cookie 來實(shí)現(xiàn)Session跟蹤的,第一次創(chuàng)建Session的時(shí)候,服務(wù)端會在HTTP協(xié)議中告訴客戶端,需要在 Cookie 里面記錄一個(gè)Session ID,以后每次請求把這個(gè)會話ID發(fā)送到服務(wù)器,我就知道你是誰了。有人問,如果客戶端的瀏覽器禁用了 Cookie 怎么辦?一般這種情況下,會使用一種叫做URL重寫的技術(shù)來進(jìn)行會話跟蹤,即每次HTTP交互,URL后面都會被附加上一個(gè)諸如 sid=xxxxx 這樣的參數(shù),服務(wù)端據(jù)此來識別用戶。
3. Cookie其實(shí)還可以用在一些方便用戶的場景下,設(shè)想你某次登陸過一個(gè)網(wǎng)站,下次登錄的時(shí)候不想再次輸入賬號了,怎么辦?這個(gè)信息可以寫到Cookie里面,訪問網(wǎng)站的時(shí)候,網(wǎng)站頁面的腳本可以讀取這個(gè)信息,就自動幫你把用戶名給填了,能夠方便一下用戶。這也是Cookie名稱的由來,給用戶的一點(diǎn)甜頭。
所以,總結(jié)一下:
Session是在服務(wù)端保存的一個(gè)數(shù)據(jù)結(jié)構(gòu),用來跟蹤用戶的狀態(tài),這個(gè)數(shù)據(jù)可以保存在集群、數(shù)據(jù)庫、文件中;
Cookie是客戶端保存用戶信息的一種機(jī)制,用來記錄用戶的一些信息,也是實(shí)現(xiàn)Session的一種方式。
14.java的包裝類和基本數(shù)據(jù)類型之間的區(qū)別
1、包裝類是對象,擁有方法和字段,對象的調(diào)用都是通過引用對象的地址,基本類型不是?
2、包裝類型是引用的傳遞,基本類型是值的傳遞?
3、聲明方式不同,基本數(shù)據(jù)類型不需要new關(guān)鍵字,而包裝類型需要new在堆內(nèi)存中進(jìn)行new來分配內(nèi)存空間?
4、存儲位置不同,基本數(shù)據(jù)類型直接將值保存在值棧中,而包裝類型是把對象放在堆中,然后通過對象的引用來調(diào)用他們?
5、初始值不同,eg: int的初始值為 0 、 boolean的初始值為false 而包裝類型的初始值為null?
6、使用方式不同,基本數(shù)據(jù)類型直接賦值使用就好 ,而包裝類型是在集合如 coolection Map時(shí)會使用
15.多線程中的wait和sleep的區(qū)別
?sleep()和wait()方法的最大區(qū)別是:
sleep()睡眠時(shí),保持對象鎖,仍然占有;
而wait()睡眠時(shí),釋放對象鎖。
16.linux中查看服務(wù)器日志的命令
tail?-f?-n?5?/var/log/syslog
這個(gè)是輸出最近5行的日志命令
17.事務(wù)的四大特性
⑴ 原子性(Atomicity)
原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,這和前面兩篇博客介紹事務(wù)的功能是一樣的概念,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫,如果操作失敗則不能對數(shù)據(jù)庫有任何影響。
⑵ 一致性(Consistency)
一致性是指事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài),也就是說一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
拿轉(zhuǎn)賬來說,假設(shè)用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個(gè)用戶的錢相加起來應(yīng)該還得是5000,這就是事務(wù)的一致性。
⑶ 隔離性(Isolation)
隔離性是當(dāng)多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫時(shí),比如操作同一張表時(shí),數(shù)據(jù)庫為每一個(gè)用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。
即要達(dá)到這么一種效果:對于任意兩個(gè)并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個(gè)事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。
關(guān)于事務(wù)的隔離性數(shù)據(jù)庫提供了多種隔離級別,稍后會介紹到。
⑷ 持久性(Durability)
持久性是指一個(gè)事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。
18.linux 查看并殺死進(jìn)程
ps -ef|grep java
kill xxx
killall -9 NAME
19.redis可以存放的數(shù)據(jù)類型都有?
String----------字符串
Hash------------字典
List-------------列表
Set--------------集合
Sorted Set------有序集合
詳情摘自:Redis中的五種數(shù)據(jù)類型使用場景 - 簡書
關(guān)于redis常用的命令使用摘自:Redis常用數(shù)據(jù)類型介紹、使用場景及其操作命令 - lizhenghn - 博客園
20.java虛擬機(jī)中的內(nèi)存模型?

關(guān)于詳細(xì)的模型介紹摘自:jvm的內(nèi)存分配總結(jié) - 簡書
21.String str2 = new String("ABC")?創(chuàng)建了幾個(gè)對象,他和String str2 = "ABC"的區(qū)別?
詳情摘自java中String new和直接賦值的區(qū)別 - CSDN博客
22.java集合關(guān)系,以及l(fā)ist,set,map關(guān)系區(qū)別

區(qū)別摘自:Java 面試高頻提問知識點(diǎn)之:Set、List 和 Map 的區(qū)別 - Java開發(fā)社區(qū) | CTOLib碼庫
23.hashMap和hashTable的區(qū)別?
1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。
2.hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。
3.hashMap允許空鍵值,而hashTable不允許。
24.JVM中的永久代中會發(fā)生垃圾回收嗎?
垃圾回收不會發(fā)生在永久代,如果永久代滿了或者是超過了臨界值,會觸發(fā)完全垃圾回收。如果你仔細(xì)查看垃圾收集器的輸出信息,就會發(fā)現(xiàn)永久代也是被回收的。這就是為什么正確的永久代大小對避免full?gc是非常重要的原因。
25.在java中,對象什么時(shí)候可以被垃圾回收?
當(dāng)對象對當(dāng)前使用這個(gè)對象的應(yīng)用程序變得不可觸及的時(shí)候,這個(gè)對象就可以被回收了。
26.java中垃圾回收有什么目的?什么時(shí)候進(jìn)行垃圾回收?
垃圾回收是在內(nèi)存總存在沒有引用的對象或者超過作用域的對象時(shí)進(jìn)行。
垃圾回收的目的就是識別并且丟棄應(yīng)用不再使用的對象來釋放和重用資源。
27.hashMap的工作原理是什么?
Java總的hashMap是以鍵值對的形式來存儲元素的。HashMap需要一個(gè)hash函數(shù),他使用hashCode()和equals()方法來想集合或者集合添加和檢索元素。當(dāng)調(diào)用put()方法的時(shí)候,HashMap會計(jì)算key的hash值,然后把鍵值對存儲在集合中合適的索引上。如果key已經(jīng)存在了,value就會被更新成新值。HashMap的一些重要的特性是他的容量,負(fù)載銀子河擴(kuò)容極限。